ページの先頭行へ戻る
Interstage Application Server アプリケーション作成ガイド(CORBAサービス編)
Interstage

8.3.9 動的インタフェースでのパラメタの獲得/解放

動的起動インタフェース(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の領域も解放されます