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

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

4.7.6 構造体

(1)IDLマッピング

 IDL言語で構造体structを指定した場合、C言語でもstructにマッピングされます。また、可変長の構造体については、領域獲得関数(関数名は"モジュール名_インタフェース名_構造体名_alloc"。以降XX_alloc関数と呼ぶ)が生成されます。
 以降では、以下のIDL定義例をもとに説明します。

IDL言語

  module ODsample{
      struct samplefix {    /* 構造体(固定長) */
          long    para1; 
          long    para2; 
      };
      struct samplevar {    /* 構造体(可変長) */
          long    para1; 
          string  para2; 
      };

      interface  structtest{
          samplefix         op2(
              in samplefix str1, 
              out samplefix str2, 
              inout samplefix str3 
          ); 
          samplevar         op1(
              in samplevar str1, 
              out samplevar str2, 
              inout samplevar str3 
          ); 
      };
  };

C言語

  typedef struct ODsample_samplefix{    /* 構造体(固定長) */
      CORBA_long    para1; 
      CORBA_long    para2; 
  } ODsample_samplefix; 

  typedef struct ODsample_samplevar{    /* 構造体(可変長) */
      CORBA_long    para1; 
      CORBA_char    *para2; 
  } ODsample_samplevar;

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

 構造体(固定長)のパラメタ(in,out,inout)を扱う場合、構造体変数をパラメタに指定します。領域の獲得/解放を行う必要はありません。

      ODsample_samplefix  fix1, fix2, fix3, ret; 
      CORBA_Environment   env; 
      CORBA_Object        obj; 

  /* inパラメタ */
      fix1.para1 = 10;
      fix1.para2 = 11;

  /* inoutパラメタ */
      fix3.para1 = 20;
      fix3.para2 = 21;

  /* サーバ呼出し */
      ret = ODsample_structtest_op2( obj, &fix1, &fix2, &fix3, &env );

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

 クライアントアプリケーションのパラメタの扱いについて、以下に示します。

パラメタ

サーバへ渡すパラメタ

サーバから渡されたパラメタ

in

構造体領域/可変長データ域を獲得する場合、XX_alloc関数/データ域獲得関数を使用します。

inout

(inパラメタと同じ)

領域はスタブで自動的に獲得されます。

out
復帰

(inoutパラメタと同じ)

注意事項

 クライアントおよびスタブで動的に獲得した領域は、不要になった時点でCORBA_free()で解放する必要があります。CORBA_free()を発行することで可変長データ域も解放されます。

 以下にクライアントアプリケーションでの処理例を示します。

      ODsample_samplevar   *var1, *var2, *var3, *ret; 
      CORBA_Object         obj; 
      CORBA_Environment    env; 

  /* inパラメタ */
      var1 = ODsample_samplevar_alloc();         /* 領域獲得 */
      var1->para1 = 5;                           /* パラメタ設定 */
      var1->para2 = CORBA_string_alloc(4);
      strcpy( var1->para2, "test" );

  /* inoutパラメタ */
      var3 = ODsample_samplevar_alloc();         /* 領域獲得 */
      var3->para1 = 4;                           /* パラメタ設定 */
      var3->para2 = CORBA_string_alloc(3);
      strcpy( var3->para2, "pro" );

  /* サーバ呼出し */
      ret = ODsample_structtest_op1( obj, var1, &var2, var3, &env ); 

  /* 領域解放 */
      CORBA_free( var1 );                        /* inパラメタ */
      CORBA_free( var2 );                        /* outパラメタ */
      CORBA_free( var3 );                        /* inoutパラメタ */
      CORBA_free( ret );                         /* 復帰パラメタ */

(4)サーバアプリケーションで扱うパラメタ(固定長)

 構造体(固定長)のパラメタ(in,out,inout)を扱う場合、構造体領域はスケルトンで自動的に獲得/解放されます。
 以下にサーバアプリケーションでの処理例を示します。

  ODsample_samplefix
  ODsample_structtest_op2(
      CORBA_Object        obj, 
      ODsample_samplefix  *str1, 
      ODsample_samplefix  *str2, 
      ODsample_samplefix  *str3, 
      CORBA_Environment   *env ) 
  {
      ODsample_samplefix  fix; 

  /* outパラメタ */
      str2->para1 = 0; 
      str2->para2 = 1; 

  /* inoutパラメタ */
      str3->para1 = 2; 
      str3->para2 = 3; 

  /* 復帰パラメタ */
      fix.para1 = 4; 
      fix.para2 = 5; 
      return( fix ); 
  }

(5)サーバアプリケーションで扱うパラメタ(可変長)

 サーバアプリケーションのパラメタの扱いについて、以下に示します。

パラメタ

クライアントからのパラメタ領域

クライアントへのパラメタ領域

in

構造体領域/可変長データ域はスケルトンで自動的に獲得/解放されます。

inout

構造体領域/可変長データ域はスケルトンで自動的に獲得されます。

可変長データ域をCORBA_free()で一度解放し、データ域獲得関数で再獲得します。
領域はスケルトンで自動的に解放されます。

out
復帰

構造体/可変長データ域をXX_alloc関数/データ域獲得関数で獲得します。
領域はスケルトンで自動的に解放されます。

 以下にサーバアプリケーションでの処理例を示します。

  ODsample_samplevar
  *ODsample_structtest_op1(
      ODsample_structtest  obj, 
      ODsample_samplevar   *str1, 
      ODsample_samplevar   **str2, 
      ODsample_samplevar   *str3, 
      CORBA_Environment    *env ) 
  {
      ODsample_samplevar  *str; 

      print_strvar( str1 ); 
      print_strvar( str3 ); 

  /* outパラメタ */
      *str2 = ODsample_samplevar_alloc();           /* 領域獲得 */
      (*str2)->para1 = 12;                          /* メンバ設定 */
      (*str2)->para2 = CORBA_string_alloc( 16 ); 
      strcpy( (*str2)->para2, "(*str2)->para2" ); 

  /* inoutパラメタ */
      str3->para1 = 12;                             /* メンバ設定 */
      CORBA_free( str3->para2 );                    /* 領域解放(メンバ域) */
      str3->para2 = CORBA_string_alloc(16);         /* 領域再獲得(メンバ域) */
      strcpy( str3->para2, "str3->para2" ); 

  /* 復帰パラメタ */
      str = ODsample_samplevar_alloc();             /* 領域獲得 */
      str->para1 = 11;                              /* メンバ設定 */
      str->para2 = CORBA_string_alloc(16); 
      strcpy( str->para2, "str->para2" ); 
      return( str ); 
  }

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

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