| Interstage Application Server アプリケーション作成ガイド (CORBAサービス編) |
目次
索引
![]()
|
| 第4章 アプリケーションの開発(C言語) | > 4.7 データ型に対するマッピング |
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;
構造体(固定長)のパラメタ(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 );
クライアントアプリケーションのパラメタの扱いについて、以下に示します。
|
パラメタ |
サーバへ渡すパラメタ |
サーバから渡されたパラメタ |
|
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 ); /* 復帰パラメタ */
構造体(固定長)のパラメタ(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 );
}
サーバアプリケーションのパラメタの扱いについて、以下に示します。
|
パラメタ |
クライアントからのパラメタ領域 |
クライアントへのパラメタ領域 |
|
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 );
}
目次
索引
![]()
|