| Interstage Application Server アプリケーション作成ガイド (CORBAサービス編) |
目次
索引
![]()
|
| 第1部 アプリケーション開発(基本編) | > 第3章 アプリケーションの開発(C言語) | > 3.7 データ型に対するマッピング |
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 );
}
目次
索引
![]()
|