(1)IDLマッピング
IDL言語で構造体structを指定した場合、C言語でもstructにマッピングされます。また、可変長の構造体については、領域獲得関数(関数名:“モジュール名_インタフェース名_構造体名_alloc”。以降XX_alloc関数と呼ぶ)が生成されます。
以降では、以下のIDL定義例をもとに説明します。
module ODsample{ struct samplefix { /* 構造体(固定長) */ long para1; long para2; }; struct samplevar { /* 構造体(可変長) */ long para1; string para2; }; interface structtest{ samplefix op2( in samplefix str1, out samplefix str2, inout samplefix str3 ); samplevar op1( in samplevar str1, out samplevar str2, inout samplevar str3 ); }; };
typedef struct ODsample_samplefix{ /* 構造体(固定長) */ CORBA_long para1; CORBA_long para2; } ODsample_samplefix; typedef struct ODsample_samplevar{ /* 構造体(可変長) */ CORBA_long para1; CORBA_char *para2; } ODsample_samplevar;
(2)クライアントアプリケーションで扱うパラメタ(固定長)
構造体(固定長)のパラメタ(in、out、inout)を扱う場合、構造体変数をパラメタに指定します。領域の獲得/解放を行う必要はありません。
ODsample_samplefix fix1, fix2, fix3, ret; CORBA_Environment env; CORBA_Object obj; /* inパラメタ */ fix1.para1 = 10; fix1.para2 = 11; /* inoutパラメタ */ fix3.para1 = 20; fix3.para2 = 21; /* サーバ呼出し */ ret = ODsample_structtest_op2( obj, &fix1, &fix2, &fix3, &env );
(3)クライアントアプリケーションで扱うパラメタ(可変長)
クライアントアプリケーションのパラメタの扱いについて以下に示します。
パラメタ | サーバへ渡すパラメタ | サーバから渡されたパラメタ |
---|---|---|
in | 構造体領域/可変長データ域を獲得する場合、XX_alloc関数/データ域獲得関数を使用します。 | - |
inout | (inパラメタと同じ) | 領域は、スタブで自動的に獲得されます。 |
out | - | (inoutパラメタと同じ) |
注意
クライアントおよびスタブで動的に獲得した領域は、不要になった時点でCORBA_free()で解放する必要があります。CORBA_free()を発行することで可変長データ域も解放されます。
クライアントアプリケーションでの処理例を以下に示します。
ODsample_samplevar *var1, *var2, *var3, *ret; CORBA_Object obj; CORBA_Environment env; /* inパラメタ */ var1 = ODsample_samplevar_alloc(); /* 領域獲得 */ var1->para1 = 5; /* パラメタ設定 */ var1->para2 = CORBA_string_alloc(4); strcpy( var1->para2, "test" ); /* inoutパラメタ */ var3 = ODsample_samplevar_alloc(); /* 領域獲得 */ var3->para1 = 4; /* パラメタ設定 */ var3->para2 = CORBA_string_alloc(3); strcpy( var3->para2, "pro" ); /* サーバ呼出し */ ret = ODsample_structtest_op1( obj, var1, &var2, var3, &env ); /* 領域解放 */ CORBA_free( var1 ); /* inパラメタ */ CORBA_free( var2 ); /* outパラメタ */ CORBA_free( var3 ); /* inoutパラメタ */ CORBA_free( ret ); /* 復帰パラメタ */
(4)サーバアプリケーションで扱うパラメタ(固定長)
構造体(固定長)のパラメタ(in、out、inout)を扱う場合、構造体領域はスケルトンで自動的に獲得/解放されます。
サーバアプリケーションでの処理例を以下に示します。
ODsample_samplefix ODsample_structtest_op2( CORBA_Object obj, ODsample_samplefix *str1, ODsample_samplefix *str2, ODsample_samplefix *str3, CORBA_Environment *env ) { ODsample_samplefix fix; /* outパラメタ */ str2->para1 = 0; str2->para2 = 1; /* inoutパラメタ */ str3->para1 = 2; str3->para2 = 3; /* 復帰パラメタ */ fix.para1 = 4; fix.para2 = 5; return( fix ); }
(5)サーバアプリケーションで扱うパラメタ(可変長)
サーバアプリケーションのパラメタの扱いについて以下に示します。
パラメタ | クライアントからのパラメタ領域 | クライアントへのパラメタ領域 |
---|---|---|
in | 構造体領域/可変長データ域は、スケルトンで自動的に獲得/解放されます。 | - |
inout | 構造体領域/可変長データ域は、スケルトンで自動的に獲得されます。 | CORBA_free()で可変長データ域を一度解放し、データ域獲得関数で再獲得します。 |
out | - | XX_alloc関数/データ域獲得関数で構造体/可変長データ域を獲得します。 |
サーバアプリケーションでの処理例を以下に示します。
ODsample_samplevar *ODsample_structtest_op1( ODsample_structtest obj, ODsample_samplevar *str1, ODsample_samplevar **str2, ODsample_samplevar *str3, CORBA_Environment *env ) { ODsample_samplevar *str; print_strvar( str1 ); print_strvar( str3 ); /* outパラメタ */ *str2 = ODsample_samplevar_alloc(); /* 領域獲得 */ (*str2)->para1 = 12; /* メンバ設定 */ (*str2)->para2 = CORBA_string_alloc( 16 ); strcpy( (*str2)->para2, "(*str2)->para2" ); /* inoutパラメタ */ str3->para1 = 12; /* メンバ設定 */ CORBA_free( str3->para2 ); /* 領域解放(メンバ域) */ str3->para2 = CORBA_string_alloc(16); /* 領域再獲得(メンバ域) */ strcpy( str3->para2, "str3->para2" ); /* 復帰パラメタ */ str = ODsample_samplevar_alloc(); /* 領域獲得 */ str->para1 = 11; /* メンバ設定 */ str->para2 = CORBA_string_alloc(16); strcpy( str->para2, "str->para2" ); return( str ); }