| Interstage Application Server アプリケーション作成ガイド (CORBAサービス編) |
目次
索引
![]()
|
| 第5章 アプリケーションの開発(C++言語) | > 5.5 データ型に対するマッピング |
動的起動インタフェース(DII)を使用して動的にパラメタを作成する方法について説明します。また、作成したパラメタから値を取り出す方法についても説明します。
パラメタはCORBA::NVList::add_value()を使用して設定します。値の取り出しには、CORBA::NVList::item()を使用します。
ここでは、データ型ごとに例を挙げて説明します。例では以下のIDL定義を使用します。
(1)基本データ型
module ODsample{
interface dyn1{
long add( in long a, // 0番目のパラメタ"a"
out long b, // 1番目のパラメタ"b"
inout long c ); // 2番目のパラメタ"c"
};
};
(2)文字列型、ワイド文字列型
module ODsample{
interface diistring{
string stringtest( in string a, // 0番目のパラメタ"a"
out string b, // 1番目のパラメタ"b"
inout string c ); // 2番目のパラメタ"c"
};
};
(3)構造体
module ODsample{
interface diistruct{
struct data{
long para1;
char para2;
};
data structtest( in data a, // 0番目のパラメタ"a"
out data b, // 1番目のパラメタ"b"
inout data c ); // 2番目のパラメタ"c"
};
};
(4)シーケンス型
module ODsample{
interface diiseq{
typedef sequence<long> sampleseq;
sampleseq seqtest( in sampleseq a, // 0番目のパラメタ"a"
out sampleseq b, // 1番目のパラメタ"b"
inout sampleseq c ); // 2番目のパラメタ"c"
};
};
サーバアプリケーションにinパラメタを渡す場合、クライアントアプリケーションでパラメタ領域を獲得し、add_value()の第2パラメタ(Any型)に指定します。Any型に値を設定する方法については、“any型”を参照してください。
動的に獲得した領域は、リクエスト発行後、使用しなくなった時点で解放してください。
inパラメタの作成例を以下に示します。
(1)基本データ型
CORBA::NVList_ptr arg_list;
CORBA::Environment_ptr env = new CORBA::Environment;
// リストオブジェクトの生成
orb->create_list( 3, arg_list, *env );
// パラメタ領域の獲得
CORBA::Long x = 100;
// Any型にパラメタ領域を設定
CORBA::Any p0;
p0 <<= x;
// inパラメタの作成
arg_list->add_value(
"a", /* IDLで指定したパラメタの名前を設定します */
p0, /* inで使用する値を設定したAny型を設定します */
CORBA::ARG_IN, /* CORBA::ARG_INを設定します */
*env );
// パラメタ領域の解放
// p0のリリースフラグがCORBA_TRUEに設定されているため、デストラクタの延長で
// 自動的に解放されます
(2)文字列型、ワイド文字列型
CORBA::NVList_ptr arg_list;
CORBA::Environment_ptr env = new CORBA::Environment;
// リストオブジェクトの生成
orb->create_list( 3, arg_list, *env );
// パラメタ領域の獲得
CORBA::Char *str0 = CORBA::string_alloc(3);
strcpy( str0, "IN" );
// Any型にパラメタ領域を設定
CORBA::Any p0( _tc_string, str0 );
// inパラメタの作成
arg_list->add_value(
"a", /* IDLで指定したパラメタの名前を設定します */
p0, /* inで使用する値を設定したAny型を設定します */
CORBA::ARG_IN, /* CORBA::ARG_INを設定します */
*env );
// パラメタ領域の解放
// リクエスト発行後、str0が必要なくなった時点で解放します
CORBA::string_free( str0 );
(3)構造体
CORBA::NVList_ptr arg_list;
CORBA::Environment_ptr env = new CORBA::Environment;
// リストオブジェクトの生成
orb->create_list( 3, arg_list, *env );
// パラメタ領域の獲得
ODsample::diistruct::data *data0 = new ODsample::diistruct::data;
data0->para1 = 10;
data0->para2 = 'x';
// Any型にパラメタ領域を設定
CORBA::Any p0( _tc_ODsample_diistruct_data, data0 );
/* _tc_ODsample_diistruct_dataは、IDLcによって */
/* 生成されるヘッダファイルに定義されます */
// inパラメタの作成
arg_list->add_value(
"a", /* IDLで指定したパラメタの名前を設定します */
p0, /* inで使用する値を設定したAny型を設定します */
CORBA::ARG_IN, /* CORBA::ARG_INを設定します */
*env );
// パラメタ領域の解放
// リクエスト発行後、data0が必要なくなった時点で解放します
delete data0;
(4)シーケンス型
CORBA::NVList_ptr arg_list;
CORBA::Environment_ptr env = new CORBA::Environment;
// リストオブジェクトの生成
orb->create_list( 3, arg_list, *env );
// パラメタ領域の獲得
CORBA::Long *p = ODsample::diiseq::sampleseq::allocbuf(3);
for( int i = 0; i < 3; i++ )
p[i] = i*10;
ODsample::diiseq::sampleseq *seq0 =
new ODsample::diiseq::sampleseq( 3, 3, p, CORBA_TRUE );
// Any型にパラメタ領域を設定
CORBA::Any p0( _tc_ODsample_diiseq_sampleseq, seq0 );
/* _tc_ODsample_diiseq_sampleseqは、IDLcによって */
/* 生成されるヘッダファイルに定義されます */
// inパラメタの作成
arg_list->add_value(
"a", /* IDLで指定したパラメタの名前を設定します */
p0, /* inで使用する値を設定したAny型を設定します */
CORBA::ARG_IN, /* CORBA::ARG_INを設定します */
*env );
// パラメタ領域の解放
// リクエスト発行後、seq0が必要なくなった時点で解放します
delete seq0; /* リリースフラグがCORBA_TRUEに設定されているため、*/
/* allocbufで獲得した領域(p)も解放されます */
サーバアプリケーションの処理結果をoutパラメタで受け取る場合、クライアントアプリケーションで領域を獲得する必要はありません。add_value()の第2パラメタには、TypeCodeを指定したAny型を設定します。
サーバアプリケーションから渡されたデータ用に獲得された領域は、NVListクラスの領域を廃棄する際に自動的に解放されます。このため、NVListクラスの領域を解放した後、サーバアプリケーションから渡されたoutパラメタ領域を参照することはできません。NVListオブジェクトの解放については“リクエストの削除”を参照してください。
outパラメタの作成例と処理結果の取り出しの例を以下に示します。
(1)基本データ型
// Any型にTypeCodeを設定
CORBA::Any p1( _tc_long, NULL );
// outパラメタの作成
arg_list->add_value(
"b", /* IDLで指定したパラメタの名前を設定します */
p1, /* TypeCodeを指定したAny型を設定します */
CORBA::ARG_OUT, /* CORBA::ARG_OUTを設定します */
*env );
// 処理結果の取り出し
CORBA::NamedValue_ptr nv1 = arg_list->item(1, *env); /* 1番目のパラメタを取り出します */
CORBA::Any *ap1 = nv1->value( *env ); /* パラメタからAnyを取り出します */
CORBA::Long *lp1 = (CORBA::Long *)ap1->value(); /* Anyから値を取り出します */
// パラメタ領域の解放
// lp1の領域はCORBA::release(arg_list)によって解放されます
(2)文字列型、ワイド文字列型
// Any型にTypeCodeを設定
CORBA::Any p1( _tc_string, NULL );
// outパラメタの作成
arg_list->add_value(
"b", /* IDLで指定したパラメタの名前を設定します */
p1, /* TypeCodeを指定したAny型を設定します */
CORBA::ARG_OUT, /* CORBA::ARG_OUTを設定します */
*env );
// 処理結果の取り出し
CORBA::NamedValue_ptr nv1 = arg_list->item(1, *env); /* 1番目のパラメタを取り出します */
CORBA::Any *ap1 = nv1->value( *env ); /* パラメタからAnyを取り出します */
CORBA::Char *cp1 = (CORBA::Char *)ap1->value(); /* Anyから値を取り出します */
// パラメタ領域の解放
// cp1の領域はCORBA::release(arg_list)によって解放されます
(3)構造体
// Any型にTypeCodeを設定
CORBA::Any p1( _tc_ODsample_diistruct_data, NULL );
/* _tc_ODsample_diistruct_dataは、IDLcによって */
/* 生成されるヘッダファイルに定義されます */
// outパラメタの作成
arg_list->add_value(
"b", /* IDLで指定したパラメタの名前を設定します */
p1, /* TypeCodeを指定したAny型を設定します */
CORBA::ARG_OUT, /* CORBA::ARG_OUTを設定します */
*env );
// 処理結果の取り出し
CORBA::NamedValue_ptr nv1 = arg_list->item(1, *env); /* 1番目のパラメタを取り出します */
CORBA::Any *ap1 = nv1->value( *env ); /* パラメタからAnyを取り出します */
ODsample::diistruct::data *dp1 =
(ODsample::diistruct::data *)(ap1->value()); /* Anyから値を取り出します */
// パラメタ領域の解放
// dp1の領域はCORBA::release(arg_list)によって解放されます
(4)シーケンス型
// Any型にTypeCodeを設定
CORBA::Any p1( _tc_ODsample_diiseq_sampleseq, NULL );
/* _tc_ODsample_diiseq_sampleseqは、IDLcによって */
/* 生成されるヘッダファイルに定義されます */
// outパラメタの作成
arg_list->add_value(
"b", /* IDLで指定したパラメタの名前を設定します */
p1, /* TypeCodeを指定したAny型を設定します */
CORBA::ARG_OUT, /* CORBA::ARG_OUTを設定します */
*env );
// 処理結果の取り出し
CORBA::NamedValue_ptr nv1 = arg_list->item(1, *env); /* 1番目のパラメタを取り出します */
CORBA::Any *ap1 = nv1->value( *env ); /* パラメタからAnyを取り出します */
ODsample::diiseq::sampleseq *sp1 =
(ODsample::diiseq::sampleseq *)(ap1->value()); /* Anyから値を取り出します */
// パラメタ領域の解放
// sp1の領域はCORBA::release(arg_list)によって解放されます
// sp1のリリースフラグはCORBA_TRUEに設定されるため、_bufferの領域も解放されます
サーバアプリケーションにinoutパラメタを渡す場合、クライアントアプリケーションでパラメタ領域を獲得し、add_value()の第2パラメタ(Any型)に指定します。Any型に値を設定する方法については、 “any型”を参照してください。
クライアントアプリケーションで獲得したパラメタ領域は、リクエスト発行後、使用しなくなった時点で解放してください。サーバアプリケーションから渡されたデータ用に獲得された領域は、NVListクラスの領域を廃棄する際に自動的に解放されます。このため、NVListクラスの領域を解放した後、サーバアプリケーションから渡されたinoutパラメタ領域を参照することはできません。NVListオブジェクトの解放については“リクエストの削除”を参照してください。
inoutパラメタの作成例と処理結果の取り出しの例を以下に示します。
(1)基本データ型
// パラメタ領域の獲得
CORBA::Long z = 200;
// Any型にパラメタ領域を設定
CORBA::Any p2;
p2 <<= z;
// inoutパラメタの作成
arg_list->add_value(
"c", /* IDLで指定したパラメタの名前を設定します */
p2, /* inoutで使用する値を設定したAny型を設定します */
CORBA::ARG_INOUT, /* CORBA::ARG_INOUTを設定します */
*env );
// 処理結果の取り出し
CORBA::NamedValue_ptr nv2 = arg_list->item(2, *env); /* 2番目のパラメタを取り出します */
CORBA::Any *ap2 = nv2->value( *env ); /* パラメタからAnyを取り出します */
CORBA::Long *lp2 = (CORBA::Long *)ap2->value(); /* Anyから値を取り出します */
// パラメタ領域の解放
// p2のリリースフラグがCORBA_TRUEに設定されているため、デストラクタの延長で
// 自動的に解放されます
// lp2の領域はCORBA::release(arg_list)によって解放されます
(2)文字列型、ワイド文字列型
// パラメタ領域の獲得
CORBA::Char *str2 = CORBA::string_alloc(6);
strcpy( str2, "INOUT" );
// Any型にパラメタ領域を設定
CORBA::Any p2( _tc_string, str2 );
// inoutパラメタの作成
arg_list->add_value(
"c", /* IDLで指定したパラメタの名前を設定します */
p2, /* inoutで使用する値を設定したAny型を設定します */
CORBA::ARG_INOUT, /* CORBA::ARG_INOUTを設定します */
*env );
// 処理結果の取り出し
CORBA::NamedValue_ptr nv2 = arg_list->item(2, *env); /* 2番目のパラメタを取り出します */
CORBA::Any *ap2 = nv2->value( *env ); /* パラメタからAnyを取り出します */
CORBA::Char *cp2 = (CORBA::Char *)ap2->value(); /* Anyから値を取り出します */
// パラメタ領域の解放
// リクエスト発行後、str2が必要なくなった時点で解放します
// cp2の領域はCORBA::release(arg_list)によって解放されます
CORBA::string_free( str2 );
(3)構造体
// パラメタ領域の獲得
ODsample::diistruct::data *data2 = new ODsample::diistruct::data;
data2->para1 = 20;
data2->para2 = 'y';
// Any型にパラメタ領域を設定
CORBA::Any p2( _tc_ODsample_diistruct_data, data2 );
/* _tc_ODsample_diistruct_dataは、IDLcによって */
/* 生成されるヘッダファイルに定義されます */
// inoutパラメタの作成
arg_list->add_value(
"c", /* IDLで指定したパラメタの名前を設定します */
p2, /* inoutで使用する値を設定したAny型を設定します */
CORBA::ARG_INOUT, /* CORBA::ARG_INOUTを設定します */
*env );
// 処理結果の取り出し
CORBA::NamedValue_ptr nv2 = arg_list->item(2, *env); /* 2番目のパラメタを取り出します */
CORBA::Any *ap2 = nv2->value( *env ); /* パラメタからAnyを取り出します */
ODsample::diistruct::data *dp2 =
(ODsample::diistruct::data *)(ap2->value()); /* Anyから値を取り出します */
// パラメタ領域の解放
// リクエスト発行後、data2が必要なくなった時点で解放します
// dp2の領域はCORBA::release(arg_list)によって解放されます
delete data2;
(4)シーケンス型
// パラメタ領域の獲得
CORBA::Long *q = ODsample::diiseq::sampleseq::allocbuf(5);
for( int i = 0; i < 5; i++ )
q[i] = i*100;
ODsample::diiseq::sampleseq *seq2 =
new ODsample::diiseq::sampleseq( 5, 5, q, CORBA_TRUE );
// Any型にパラメタ領域を設定
CORBA::Any p2( _tc_ODsample_diiseq_sampleseq, seq2 );
/* _tc_ODsample_diiseq_sampleseqは、IDLcによって */
/* 生成されるヘッダファイルに定義されます */
// inoutパラメタの作成
arg_list->add_value(
"c", /* IDLで指定したパラメタの名前を設定します */
p2, /* inoutで使用する値を設定したAny型を設定します */
CORBA::ARG_INOUT, /* CORBA::ARG_INOUTを設定します */
*env );
// 処理結果の取り出し
CORBA::NamedValue_ptr nv2 = arg_list->item(2, *env); /* 2番目のパラメタを取り出します */
CORBA::Any *ap2 = nv2->value( *env ); /* パラメタからAnyを取り出します */
ODsample::diiseq::sampleseq *sp2 =
(ODsample::diiseq::sampleseq *)(ap2->value()); /* Anyから値を取り出します */
// パラメタ領域の解放
// リクエスト発行後、seq2が必要なくなった時点で解放します
// sp2の領域はCORBA::release(arg_list)によって解放されます
// sp2のリリースフラグはCORBA_TRUEに設定されるため、_bufferの領域も解放されます
delete seq2; /* リリースフラグがCORBA_TRUEに設定されているため、*/
/* allocbufで獲得した領域(q)も解放されます */
サーバアプリケーションの処理結果を復帰パラメタで受け取る場合、クライアントアプリケーションで領域を獲得する必要はありません。add_value()の第2パラメタには、TypeCodeを指定したAny型を設定します。
サーバアプリケーションから渡されたデータ用に獲得された領域は、NVListクラスの領域を廃棄する際に自動的に解放されます。このため、NVListクラスの領域を解放した後、サーバアプリケーションから渡された復帰パラメタ領域を参照することはできません。NVListオブジェクトの解放については“リクエストの削除”を参照してください。
復帰パラメタの作成例と処理結果の取り出しの例を以下に示します。
(1)基本データ型
CORBA::NVList_ptr arg_tmp;
// リストオブジェクトの生成
orb->create_list( 1, arg_tmp, *env );
// Any型にTypeCodeを設定
CORBA::Any tmp( _tc_long, NULL );
// 復帰パラメタの作成
CORBA::NamedValue_ptr result =
arg_tmp->add_value(
NULL, /* NULLを設定します */
tmp, /* TypeCodeを指定したAny型を設定します */
(CORBA::Flags)0, /* 0を設定します */
*env);
// 処理結果の取り出し
CORBA::Any *ap3 = result->value( *env ); /* パラメタからAnyを取り出します */
CORBA::Long *lp3 = (CORBA::Long *)ap3->value(); /* Anyから値を取り出します */
// パラメタ領域の解放
// lp3の領域はCORBA::release(arg_tmp)によって解放されます
(2)文字列型、ワイド文字列型
CORBA::NVList_ptr arg_tmp;
// リストオブジェクトの生成
orb->create_list( 1, arg_tmp, *env );
// Any型にTypeCodeを設定
CORBA::Any tmp( _tc_string, NULL );
// 復帰パラメタの作成
CORBA::NamedValue_ptr result =
arg_tmp->add_value(
NULL, /* NULLを設定します */
tmp, /* TypeCodeを指定したAny型を設定します */
(CORBA::Flags)0, /* 0を設定します */
*env);
// 処理結果の取り出し
CORBA::Any *ap3 = result->value( *env ); /* パラメタからAnyを取り出します */
CORBA::Char *cp3 = (CORBA::Char *)ap3->value(); /* Anyから値を取り出します */
// パラメタ領域の解放
// cp3の領域はCORBA::release(arg_tmp)によって解放されます
(3)構造体
CORBA::NVList_ptr arg_tmp;
// リストオブジェクトの生成
orb->create_list( 1, arg_tmp, *env );
// Any型にTypeCodeを設定
CORBA::Any tmp( _tc_ODsample_diistruct_data, NULL );
/* _tc_ODsample_diistruct_dataは、IDLcによって */
/* 生成されるヘッダファイルに定義されます */
// 復帰パラメタの作成
CORBA::NamedValue_ptr result =
arg_tmp->add_value(
NULL, /* NULLを設定します */
tmp, /* TypeCodeを指定したAny型を設定します */
(CORBA::Flags)0, /* 0を設定します */
*env);
// 処理結果の取り出し
CORBA::Any *ap3 = result->value( *env ); /* パラメタからAnyを取り出します */
ODsample::diistruct::data *dp3 =
(ODsample::diistruct::data *)(ap3->value()); /* Anyから値を取り出します */
// パラメタ領域の解放
// dp3の領域はCORBA::release(arg_tmp)によって解放されます
(4)シーケンス型
CORBA::NVList_ptr arg_tmp;
// リストオブジェクトの生成
orb->create_list( 1, arg_tmp, *env );
// Any型にTypeCodeを設定
CORBA::Any tmp( _tc_ODsample_diiseq_sampleseq, NULL );
/* _tc_ODsample_diiseq_sampleseqは、IDLcによって */
/* 生成されるヘッダファイルに定義されます */
// 復帰パラメタの作成
CORBA::NamedValue_ptr result =
arg_tmp->add_value(
NULL, /* NULLを設定します */
tmp, /* TypeCodeを指定したAny型を設定します */
(CORBA::Flags)0, /* 0を設定します */
*env);
// 処理結果の取り出し
CORBA::Any *ap3 = result->value( *env ); /* パラメタからAnyを取り出します */
ODsample::diiseq::sampleseq *sp3 =
(ODsample::diiseq::sampleseq *)(ap3->value()); /* Anyから値を取り出します */
// パラメタ領域の解放
// sp3の領域はCORBA::release(arg_tmp)によって解放されます
// sp3のリリースフラグはCORBA_TRUEに設定されるため、_bufferの領域も解放されます
目次
索引
![]()
|