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

3.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 ); 
}