動的起動インタフェース(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パラメタ
サーバアプリケーションにinパラメタを渡す場合、クライアントアプリケーションでパラメタ領域を獲得し、add_value()の第2パラメタ(Any型)に指定します。Any型に値を設定する方法については、“4.6.4 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パラメタ
サーバアプリケーションの処理結果をoutパラメタで受け取る場合、クライアントアプリケーションで領域を獲得する必要はありません。add_value()の第2パラメタには、TypeCodeを指定したAny型を設定します。
サーバアプリケーションから渡されたデータ用に獲得された領域は、NVListクラスの領域を廃棄する際に自動的に解放されます。このため、NVListクラスの領域を解放したあと、サーバアプリケーションから渡されたoutパラメタ領域を参照できません。NVListオブジェクトの解放については、“8.3.8 リクエストの削除”を参照してください。
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パラメタ
サーバアプリケーションにinoutパラメタを渡す場合は、クライアントアプリケーションでパラメタ領域を獲得し、add_value()の第2パラメタ(Any型)に指定します。Any型に値を設定する方法については、“4.6.4 any型”を参照してください。
クライアントアプリケーションで獲得したパラメタ領域は、リクエスト発行後、使用しなくなった時点で解放してください。サーバアプリケーションから渡されたデータ用に獲得された領域は、NVListクラスの領域を廃棄する際に自動的に解放されます。このため、NVListクラスの領域を解放したあと、サーバアプリケーションから渡されたinoutパラメタ領域を参照できません。NVListオブジェクトの解放については、“8.3.8 リクエストの削除”を参照してください。
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オブジェクトの解放については、“8.3.8 リクエストの削除”を参照してください。
復帰パラメタの作成例と処理結果の取出しの例を以下に示します。
(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の領域も解放されます