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

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

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

 動的起動インタフェー(DII)または動的スケルトンインタフェース(DSI)を使用して動的にパラメタを作成する方法について説明します。
 パラメタはCORBA::NVList::add_value()を使用して設定します。

(1)クライアントアプリケーションで扱うパラメタ

inパラメタ

 サーバアプリケーションにinパラメタを渡す場合、クライアントアプリケーションでパラメタ領域を獲得し、add_value()の第2パラメタ(Any型)に指定します。

  CORBA::NVList_ptr       arg_list; 
  CORBA::Any              p1; 
  CORBA::Long             x = 100;

  p1 <<= x; 
  arg_list->add_value(
        name,                /* IDLで指定したパラメタの名前を設定します */
        p1,                  /* inで使用する値を設定したAny型を設定します */
        CORBA::ARG_IN,       /* CORBA::ARG_INを設定します */
        *env );

 動的に獲得した領域は、リクエスト発行後、使用しなくなった時点で解放してください。

outパラメタ

 サーバアプリケーションの処理結果をoutパラメタで受け取る場合、add_value()は以下のように指定します。

  CORBA::Any              p2; 
  CORBA::Long             y = 0;

  p2 <<= y; 
  arg_list->add_value(
        name,                /* IDLで指定したパラメタの名前を設定します */
        p2,                  /* outの値を設定するAny型を設定します */
        CORBA::ARG_OUT,      /* CORBA::ARG_OUTを設定します */
        *env );

 サーバアプリケーションから渡されたデータ用に獲得された領域は、NVListクラスの領域を廃棄する際に自動的に解放されます。

inoutパラメタ

 サーバアプリケーションにinoutパラメタを渡す場合、クライアントアプリケーションでパラメタ領域を獲得し、add_value()の第2パラメタ(Any型)に指定します。また、第3パラメタ(item_flag)にCORBA::IN_COPY_VALUEを指定します。

  CORBA::Any              p3; 
  CORBA::Long             z = 200;

  p3 <<= z; 
  arg_list->add_value(
        name,                  /* IDLで指定したパラメタの名前を設定します */
        p3,                    /* inoutの値を設定するAny型を設定します */
        CORBA::ARG_INOUT |     /* CORBA::ARG_INOUT | CORBA::IN_COPY_VALUEを設定します */
        CORBA::IN_COPY_VALUE,
        *env );

 サーバアプリケーションから渡されたデータ用に獲得された領域は、NVListクラスの領域を廃棄する際に自動的に解放されます。

復帰パラメタ

 サーバアプリケーションの処理結果を復帰パラメタで受け取った後、パラメタ領域はCORBA::release()で解放します。

(2)サーバアプリケーションで扱うパラメタ

inパラメタ

 クライアントアプリケーションからinパラメタを受け取る場合、パラメタ領域の獲得/解放を行う必要はありません。add_value()は以下のように指定します。

  CORBA::Any        p1( ((*params)[0])->type, &i, CORBA_TRUE ); 
  arg_list->add_value(
        name,                        /* IDLで指定したパラメタの名前を設定します */
        p1,                          /* inで使用する値を設定したAny型を設定します */
        CORBA::ARG_IN,               /* CORBA::ARG_INを設定します */
        *env );

outパラメタ

 サーバアプリケーションの処理結果をoutパラメタで渡す場合、データ域獲得関数(CORBA::long_alloc()等)で領域を獲得し、そのポインタをadd_value()の第2パラメタに指定します。

  CORBA::Any        *p2 = new CORBA::Any( ((*params)[1])->type, &i, CORBA_TRUE ); 
  arg_list->add_value(
        name,                        /* IDLで指定したパラメタの名前を設定します */
        *p2,                         /* outの値を設定するAny型を設定します */
        CORBA::ARG_OUT,              /* CORBA::ARG_OUTを設定します */
        *env );

 獲得した領域は、CORBAサービス内でリクエスト復帰後に解放されます。

inoutパラメタ

 クライアントアプリケーションからinoutパラメタを受け取る場合、パラメタ領域の獲得/解放を行う必要はありません。add_value()は以下のように指定します。

  CORBA::Any        *p3 = new CORBA::Any(( (*params)[2])->type, &i, CORBA_TRUE ); 
  arg_list->add_value(
        name,                        /* IDLで指定したパラメタの名前を設定します */
        *p3,                         /* inoutの値を設定するAny型を設定します */
        CORBA::ARG_INOUT,            /* CORBA::ARG_INOUTを設定します */
        *env );

 サーバアプリケーションの処理結果をinoutでクライアントアプリケーションに渡す場合、以下のようにします。

 固定長データの場合
 CORBA::ServerRequest::params()で通知されたパラメタ領域に値を設定します。
 可変長データの場合
 CORBA::ServerRequest::params()で通知されたパラメタ領域を、CORBA::free()でいったん解放した後、データ域獲得関数(CORBA::string_alloc()等)で領域を獲得し、そのポインタを再設定します。新しいデータをその領域に設定します。

 inoutパラメタとして使用した領域は、リクエスト復帰後にスケルトンで解放されます。

復帰パラメタ

 サーバアプリケーションの処理結果を復帰パラメタ渡す場合、データ域獲得関数(CORBA::long_alloc()等)で領域を獲得します。


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

Copyright 2006 FUJITSU LIMITED