Interstage Application Server アプリケーション作成ガイド (CORBAサービス編)
目次 索引 前ページ次ページ

第5章 アプリケーションの開発(C++言語)> 5.5 データ型に対するマッピング

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

 動的起動インタフェー(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型に値を設定する方法については、“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オブジェクトの解放については“リクエストの削除”を参照してください。
 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型に値を設定する方法については、 “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の領域も解放されます

目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005