Interstage Application Server アプリケーション作成ガイド (CORBAサービス編) |
目次
索引
![]() ![]() |
第4章 アプリケーションの開発(C言語) | > 4.8 データ型に対するマッピング |
IDL言語でany型を指定した場合、C言語ではCORBA_any構造体にマッピングされます。また、データ域(_value)の獲得関数(関数名は"モジュール名_インタフェース名_構造体名_alloc"。以降、XX_alloc関数と呼ぶ)が生成されます。
CORBA_any構造体の構造を以下に示します。
typedef struct any { CORBA_TypeCode _type; /* データ型識別情報(TypeCode) */ void *_value; /* データ域 */ } CORBA_any;
以降では、以下のIDL定義例をもとに説明します。
module ODsample{ struct sample1 { long para1; string para2; }; struct sample2 { char para1; float para2; }; struct sample3 { char para1; double para2; }; interface anytest{ any op1(in any any1, out any any2, inout any any3 ); }; };
クライアントアプリケーションのパラメタの扱いについて、以下に示します。
パラメタ |
サーバへ渡すパラメタ |
サーバから渡されたパラメタ |
in |
領域(CORBA_any構造体/_value域)を動的に獲得する場合は、CORBA_any_alloc()/XX_alloc関数を使用します。 |
− |
inout |
(inパラメタと同じ) |
領域はスタブで自動的に獲得されます。 |
out |
− |
(inoutパラメタと同じ) |
クライアントおよびスタブで獲得した領域は、不要になった時点でCORBA_free()で解放する必要があります。このとき_valueの指す領域を解放するかどうかを、リリースフラグで指定できます。
リリースフラグの参照と設定は、以下の関数/フラグを使用します。
[関数] CORBA_boolean CORBA_any_get_release( CORBA_any * ); void CORBA_any_set_release( CORBA_any *, CORBA_boolean );
[フラグ] CORBA_TRUE :CORBA_free()発行時、_valueの指す領域も解放される CORBA_FALSE :CORBA_free()発行時、_valueの指す領域は解放されない(デフォルト)
なお、スタブで獲得されたパラメタ(out,復帰)のリリースフラグは、CORBA_TRUEに設定されます。
以下にクライアントアプリケーションの処理例を示します。
CORBA_any *any1, *any2, *any3, *ret; CORBA_Object obj; CORBA_Environment env; ODsample_sample1 *smp1; ODsample_sample2 *smp2; ODsample_sample3 *smp3; /* inパラメタ */ any1 = CORBA_any_alloc(); /* 領域獲得 */ any1->_type = TC_ODsample_sample3; /* TypeCode設定 */ smp3 = any1->_value = ODsample_sample3_alloc(); smp3->para1 = 'a'; smp3->para2 = 0.00001; /* inoutパラメタ */ any3 = CORBA_any_alloc(); /* 領域獲得 */ any3->_type = TC_ODsample_sample2; /* TypeCode設定 */ smp2 = any3->_value = ODsample_sample2_alloc(); smp2->para1 = 'c'; smp2->para2 = 0.0001; /* サーバ呼出し */ ret = ODsample_anytest_op1( obj, any1, &any2, any3, &env ); /* 領域解放 */ CORBA_free( any1 ); /* inパラメタ */ CORBA_free( any2 ); /* outパラメタ */ CORBA_free( any3 ); /* inoutパラメタ */ CORBA_free( ret ); /* 復帰パラメタ */
サーバアプリケーションのパラメタの扱いについて、以下に示します。
パラメタ |
クライアントから渡されたパラメタ |
クライアントへ渡すパラメタ |
in |
各領域(CORBA_any構造体/データ域)はスケルトンで自動的に獲得/解放されます。 |
− |
inout |
各領域(CORBA_any構造体/データ域)はスケルトンで自動的に獲得されます。 |
データ域(_value)をCORBA_free()で一度解放し、XX_alloc関数で再獲得します。 |
out |
− |
CORBA_any構造体/データ域(_value)をCORBA_any_alloc()/XX_alloc関数で獲得します。 |
以下にサーバアプリケーションでの処理例を示します。
CORBA_any *ODsample_anytest_op1( ODsample_anytest obj, CORBA_any *any1, CORBA_any **any2, CORBA_any *any3, CORBA_Environment *env ) { CORBA_any *p; ODsample_sample1 *smp1; ODsample_sample2 *smp2; ODsample_sample3 *smp3; /* outパラメタ */ p = *any2 = CORBA_any_alloc(); /* 領域獲得 */ p->_type = TC_ODsample_sample2; /* TypeCode設定 */ smp2 = p->_value = ODsample_sample2_alloc(); /* データ域獲得 */ smp2->para1 = 'x'; /* パラメタ設定 */ smp2->para2 = 0.001; CORBA_any_set_release( p, CORBA_TRUE ); /* リリースフラグ設定 */ /* inoutパラメタ */ any3->_type = TC_ODsample_sample3; /* TypeCodeの設定 */ CORBA_free( any3->_value ); /* 領域解放(データ域) */ smp3 = any3->_value = ODsample_sample3_alloc(); /* 領域再獲得(データ域) */ smp3->para1 = 'y'; /* パラメタ設定 */ smp3->para2 = 0.0001; /* 復帰パラメタ */ p = CORBA_any_alloc(); /* 領域獲得 */ p->_type = TC_ODsample_sample1; /* TypeCode設定 */ smp1 = p->_value = ODsample_sample1_alloc(); /* データ域獲得 */ smp1->para1 = 300; /* パラメタ設定 */ smp1->para2 = CORBA_string_alloc(4); strcpy( smp1->para2, "test" ); CORBA_any_set_release( p, CORBA_TRUE ); /* リリースフラグ設定 */ return( p ); }
目次
索引
![]() ![]() |