(1)IDLマッピング
IDL言語でany型を指定した場合、C言語ではCORBA_any構造体にマッピングされます。また、データ域(_value)の獲得関数(関数名:“モジュール名_インタフェース名_構造体名_alloc”。以降、XX_alloc関数と呼ぶ)が生成されます。
CORBA_any構造体の構造を以下に示します。
typedef struct any {
    CORBA_TypeCode    _type;      /* データ型識別情報(TypeCode) */
    void              *_value;    /* データ域 */
} CORBA_any; 以降では、以下のIDL定義例をもとに説明します。
module ODsample{
    struct sample1 {
        long    para1; 
        string  para2; 
    };
    struct sample2 {
        char    para1; 
        float   para2; 
    };
    struct sample3 {
        char    para1; 
        double  para2; 
    };
    interface   anytest{
        any     op1(in any any1, out any any2, inout any any3 ); 
    };
};(2)クライアントアプリケーションで扱うパラメタ
クライアントアプリケーションのパラメタの扱いについて以下に示します。
パラメタ  | サーバへ渡すパラメタ  | サーバから渡されたパラメタ  | 
|---|---|---|
in  | 領域(CORBA_any構造体/_value域)を動的に獲得する場合は、CORBA_any_alloc()/XX_alloc関数を使用します。  | -  | 
inout  | (inパラメタと同じ)  | 領域は、スタブで自動的に獲得されます。  | 
out  | -  | (inoutパラメタと同じ)  | 
注意
クライアントおよびスタブで獲得した領域は、不要になった時点でCORBA_free()で解放する必要があります。このとき、_valueの指す領域を解放するかどうかを、リリースフラグで指定できます。
リリースフラグの参照/設定は、以下の関数/フラグを使用します。
[関数]
CORBA_boolean CORBA_any_get_release( CORBA_any * );
        void          CORBA_any_set_release( CORBA_any *, CORBA_boolean );[フラグ]
CORBA_TRUE
CORBA_free()発行時、_valueの指す領域も解放されます。
CORBA_FALSE
CORBA_free()発行時、_valueの指す領域は解放されません(デフォルト)・
なお、スタブで獲得されたパラメタ(out,復帰)のリリースフラグは、CORBA_TRUEに設定されます。
クライアントアプリケーションの処理例を以下に示します。
CORBA_any *any1, *any2, *any3, *ret; CORBA_Object obj; CORBA_Environment env; ODsample_sample1 *smp1; ODsample_sample2 *smp2; ODsample_sample3 *smp3; /* inパラメタ */ any1 = CORBA_any_alloc(); /* 領域獲得 */ any1->_type = TC_ODsample_sample3; /* TypeCode設定 */ smp3 = any1->_value = ODsample_sample3_alloc(); smp3->para1 = 'a'; smp3->para2 = 0.00001; /* inoutパラメタ */ any3 = CORBA_any_alloc(); /* 領域獲得 */ any3->_type = TC_ODsample_sample2; /* TypeCode設定 */ smp2 = any3->_value = ODsample_sample2_alloc(); smp2->para1 = 'c'; smp2->para2 = 0.0001; /* サーバ呼出し */ ret = ODsample_anytest_op1( obj, any1, &any2, any3, &env ); /* 領域解放 */ CORBA_free( any1 ); /* inパラメタ */ CORBA_free( any2 ); /* outパラメタ */ CORBA_free( any3 ); /* inoutパラメタ */ CORBA_free( ret ); /* 復帰パラメタ */
(3)サーバアプリケーションで扱うパラメタ
サーバアプリケーションのパラメタの扱いについて以下に示します。
パラメタ  | クライアントから渡されたパラメタ  | クライアントへ渡すパラメタ  | 
|---|---|---|
in  | 各領域(CORBA_any構造体/データ域)は、スケルトンで自動的に獲得/解放されます。  | -  | 
inout  | 各領域(CORBA_any構造体/データ域)は、スケルトンで自動的に獲得されます。  | データ域(_value)をCORBA_free()で一度解放し、XX_alloc関数で再獲得します。  | 
out  | -  | CORBA_any構造体/データ域(_value)をCORBA_any_alloc()/XX_alloc関数で獲得します。  | 
サーバアプリケーションでの処理例を以下に示します。
CORBA_any 
*ODsample_anytest_op1(
    ODsample_anytest   obj, 
    CORBA_any          *any1, 
    CORBA_any          **any2, 
    CORBA_any          *any3, 
    CORBA_Environment  *env ) 
{
    CORBA_any  *p; 
    ODsample_sample1   *smp1; 
    ODsample_sample2   *smp2; 
    ODsample_sample3   *smp3; 
  
/* outパラメタ */
    p = *any2 = CORBA_any_alloc();                   /* 領域獲得 */
    p->_type = TC_ODsample_sample2;                  /* TypeCode設定 */
    smp2 = p->_value = ODsample_sample2_alloc();     /* データ域獲得 */
    smp2->para1 = 'x';                               /* パラメタ設定 */
    smp2->para2 = 0.001;
    CORBA_any_set_release( p, CORBA_TRUE );          /* リリースフラグ設定 */
/* inoutパラメタ */
    any3->_type = TC_ODsample_sample3;               /* TypeCodeの設定 */
    CORBA_free( any3->_value );                      /* 領域解放(データ域) */
    smp3 = any3->_value = ODsample_sample3_alloc();  /* 領域再獲得(データ域) */
    smp3->para1 = 'y';                               /* パラメタ設定 */
    smp3->para2 = 0.0001; 
/* 復帰パラメタ */
    p = CORBA_any_alloc();                           /* 領域獲得 */
    p->_type = TC_ODsample_sample1;                  /* TypeCode設定 */ 
    smp1 = p->_value = ODsample_sample1_alloc();     /* データ域獲得 */
    smp1->para1 = 300;                               /* パラメタ設定 */
    smp1->para2 = CORBA_string_alloc(4); 
    strcpy( smp1->para2, "test" ); 
    CORBA_any_set_release( p, CORBA_TRUE );          /* リリースフラグ設定 */
    return( p ); 
}