(1)IDLマッピング
IDL言語でany型を指定した場合、COBOLでは集団項目として以下の要素(ANY-TYPE, ANY-VALUE)をPOINTERで宣言します。また、データ域(ANY-VALUE)の獲得関数(関数名:“モジュール名-インタフェース名-構造体名-ALLOC”。以降XX-ALLOC関数と呼ぶ)がIDLコンパイラで生成されます。
CORBA-ANY. * データ型を識別するTypeCode情報 49 ANY-TYPE USAGE POINTER. * データ域 49 ANY-VALUE USAGE POINTER.
以降では、以下の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  | ANY-TYPEにTypeCode情報(“TC-モジュール名-インタフェース名-データ名-IMPL-SEQ”、IDLファイル名_h.cblで定義)を、ANY-VALUEにデータ域(XX-ALLOC関数で獲得)のポインタを設定します。 領域(CORBA-ANY/ANY-VALUE域)を動的に獲得する場合は、CORBA-ANY-ALLOC関数/XX-ALLOC関数を使用します。  | -  | 
inout  | (inパラメタと同じ)  | 領域は、スタブで自動的に獲得されます。  | 
out  | -  | (inoutパラメタと同じ)  | 
注意
クライアントおよびスタブで獲得した領域は、不要になった時点でCORBA-FREE関数で解放する必要があります。このとき、ANY-VALUEの指す領域を解放するかどうかを、リリースフラグで指定できます。
リリースフラグの参照/設定は、以下の関数/フラグを使用します。
[関数]
CALL "CORBA-ANY-GET-RELEASE" USING
      BUFFER
      RET-VAL.
CALL "CORBA-ANY-SET-RELEASE" USING 
      BUFFER
      CORBA-TRUE-VALUE.[フラグ]
CORBA-TRUE-VALUE:CORBA-FREE関数発行時、ANY-VALUEの指す領域も解放されます。
CORBA-FALSE-VALUE:CORBA-FREE関数発行時、ANY-VALUEの指す領域は解放されません(デフォルト)。
なお、スタブで獲得されたoutパラメタ、復帰値のリリースフラグは、CORBA-TRUE-VALUEに設定されます。
クライアントアプリケーションの処理例を以下に示します。
   ENVIRONMENT DIVISION. 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
   COPY CONST IN CORBA. 
    01 COPY ORB IN CORBA REPLACING CORBA-ORB BY ORB. 
    01 COPY ANY IN CORBA REPLACING CORBA-ANY BY SMP1. 
    01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY ENV. 
    01 COPY LONG IN CORBA REPLACING CORBA-LONG BY LSIZE. 
    01 COPY LONG IN CORBA REPLACING CORBA-LONG BY T-LONG. 
    01 TYPE-P USAGE POINTER. 
    01 TC-ODSAMPLE-SAMPLE2-IMPL-SEQ. 
       03MEMBER1 PIC X(100) VALUE "69,69,0,0,0,0,15,4,0,8,0,25,73,68,76,58,79,68, 
                             115,97,109,112,108,101,47,115,97,109,112,108,101,50,58".
       03 MEMBER2 PIC X(100) VALUE ",49,46,48,0,0,8,115,97,109,112,108,101,50,0,0,2, 
                             0,6,112,97,114,97,49,0,0,1,9,0,6,112,97,114,97,50,0,". 
       03 MEMBER3 PIC X(100) VALUE "0,1,6".
    01 TC-ODSAMPLE-SAMPLE3-IMPL-SEQ. 
       03 MEMBER1 PIC X(100) VALUE "69,69,0,0,0,0,15,8,0,16,0,25,73,68,76,58,79,68, 
                              115,97,109,112,108,101,47,115,97,109,112,108,101,51,5".
       03 MEMBER2 PIC X(100) VALUE "8,49,46,48,0,0,8,115,97,109,112,108,101,51,0,0, 
                              2,0,6,112,97,114,97,49,0,0,1,9,0,6,112,97,114,97,50,0".
       03 MEMBER3 PIC X(100) VALUE ",0,1,7".
    01 COPY ANY IN CORBA REPLACING CORBA-ANY BY ANY1.
    01 ANY2 USAGE POINTER.
    01 ANY3 USAGE POINTER.
    01 ANY0 USAGE POINTER.
   LINKAGE SECTION. 
    01 SMP2.
       02 COPY CHAR IN CORBA REPLACING CORBA-CHAR BY PARA1.
       02 COPY FLOAT IN CORBA REPLACING CORBA-FLOAT BY PARA2.
    01 SMP3.
       02 COPY CHAR IN CORBA REPLACING CORBA-CHAR BY PARA1.
       02 COPY DOUBLE IN CORBA REPLACING CORBA-DOUBLE BY PARA2.
    01 COPY ANY IN CORBA REPLACING CORBA-ANY BY ANY2-P. 
    01 COPY ANY IN CORBA REPLACING CORBA-ANY BY ANY3-P. 
    01 COPY ANY IN CORBA REPLACING CORBA-ANY BY ANY0-P. 
  PROCEDURE DIVISION. 
  *TypeCodeの設定
  MOVE FUNCTION LENG (TC-ODSAMPLE-SAMPLE3-IMPL-SEQ) TO T-LONG. 
    CALL "CORBA-STRING-SET" USING
        TYPE-P
        T-LONG
        TC-ODSAMPLE-SAMPLE3-IMPL-SEQ. 
    CALL "CORBA-ORB-TYPECODE-FROM-CGEN-TC" USING
        TYPE-P
        ANY-TYPE OF ANY1. 
    CALL "CORBA-FREE" USING
        TYPE-P. 
    CALL "ODSAMPLE-SAMPLE3-ALLOC" USING
        ANY-VALUE OF ANY1. 
    SET ADDRESS OF SMP3 TO ANY-VALUE OF ANY1. 
  *入力用パラメタの設定
    MOVE "a" TO PARA1 OF SMP3. 
  *入力用パラメタの設定
    MOVE 0.00001 TO PARA2 OF SMP3. 
  *入出力パラメタ用領域の獲得
    CALL "CORBA-ANY-ALLOC" USING
        ANY3. 
    SET ADDRESS OF ANY3-P TO ANY3. 
  *TypeCodeの設定
    MOVE FUNCTION LENG (TC-ODSAMPLE-SAMPLE2-IMPL-SEQ) TO T-LONG. 
    CALL "CORBA-STRING-SET" USING
        TYPE-P
        T-LONG
        TC-ODSAMPLE-SAMPLE2-IMPL-SEQ. 
    CALL "CORBA-ORB-TYPECODE-FROM-CGEN-TC" USING
        TYPE-P
        ANY-TYPE OF ANY3-P. 
    CALL "CORBA-FREE" USING
        TYPE-P. 
    CALL "ODSAMPLE-SAMPLE2-ALLOC" USING
        ANY-VALUE OF ANY3-P. 
    SET ADDRESS OF SMP2 TO ANY-VALUE OF ANY3-P. 
  *入出力用パラメタの設定
    MOVE "c" TO PARA1 OF SMP2. 
  *入出力用パラメタの設定
    MOVE 0.0001 TO PARA2 OF SMP2. 
    CALL "ODSAMPLE-ANYTEST-OP1" USING
        OBJ
        ANY1
        ANY2
        ANY3
        ENV
        ANY0. 
  *復帰値の領域解放
    CALL "CORBA-FREE" USING 
        ANY0. 
  *入力パラメタの領域解放
    CALL "CORBA-FREE" USING
        ANY-VALUE OF ANY1. 
  *出力パラメタの領域解放
    CALL "CORBA-FREE" USING 
        ANY2. 
  *入出力パラメタの領域解放
    CALL "CORBA-FREE" USING 
        ANY3.(3)サーバアプリケーションで扱うパラメタ
サーバアプリケーションのパラメタの扱いについて、以下に示します。
パラメタ  | クライアントから渡されたパラメタ  | クライアントへ渡すパラメタ  | 
|---|---|---|
in  | 各領域(CORBA-ANY/ANY-VALUE域)は、スケルトンで自動的に獲得/解放されます。  | -  | 
inout  | 各領域(CORBA-ANY/ANY-VALUE域)は、スケルトンで自動的に獲得されます。  | ANY-VALUE域をCORBA-FREE関数で一度解放し、XX-ALLOC関数で再獲得します。  | 
out  | -  | 各領域(CORBA-ANY/ANY-VALUE域)をCORBA-ANY-ALLOC関数/XX-ALLOC関数で獲得します。  | 
サーバアプリケーションでの処理例を以下に示します。
   IDENTIFICATION DIVISION. 
   PROGRAM-ID. "ODSAMPLE-ANYTEST-OP1".
   ENVIRONMENT DIVISION. 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
   COPY CONST IN CORBA. 
    01 COPY LONG IN CORBA REPLACING CORBA-LONG BY T-LONG. 
    01 TYPE-P USAGE POINTER. 
    01 COPY LONG IN CORBA REPLACING CORBA-LONG BY LSIZE. 
    01 STR-WORK PIC X(20). 
    01 TC-ODSAMPLE-SAMPLE1-IMPL-SEQ. 
       03 MEMBER1 PIC X(100) VALUE "71,71,0,0,0,0,15,4,0,8,0,25,73,68,76,58,79,68,115,97, 
          109,112,108,101,47,115,97,109,112,108,101,49,58".
       03 MEMBER2 PIC X(100) VALUE ",49,46,48,0,0,8,115,97,109,112,108,101,49,0,0,2, 
          0,6,112,97,114,97,49,0,0,1,3,0,6,112,97,114,97,50,0,". 
       03 MEMBER3 PIC X(100) VALUE "0,3,18,0,0".
    01 TC-ODSAMPLE-SAMPLE2-IMPL-SEQ. 
       03MEMBER1 PIC X(100) VALUE "69,69,0,0,0,0,15,4,0,8,0,25,73,68,76,58,79,68, 
                             115,97,109,112,108,101,47,115,97,109,112,108,101,50,58".
       03 MEMBER2 PIC X(100) VALUE ",49,46,48,0,0,8,115,97,109,112,108,101,50,0,0,2, 
                             0,6,112,97,114,97,49,0,0,1,9,0,6,112,97,114,97,50,0,". 
       03 MEMBER3 PIC X(100) VALUE "0,1,6".
    01 TC-ODSAMPLE-SAMPLE3-IMPL-SEQ. 
       03 MEMBER1 PIC X(100) VALUE "69,69,0,0,0,0,15,8,0,16,0,25,73,68,76,58,79,68, 
                              115,97,109,112,108,101,47,115,97,109,112,108,101,51,5".
       03 MEMBER2 PIC X(100) VALUE "8,49,46,48,0,0,8,115,97,109,112,108,101,51,0,0, 
                              2,0,6,112,97,114,97,49,0,0,1,9,0,6,112,97,114,97,50,0".
       03 MEMBER3 PIC X(100) VALUE ",0,1,7".
   LINKAGE SECTION. 
    01 COPY ORB IN CORBA REPLACING CORBA-ORB BY ORB. 
    01 SMP1.
       02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1.
       02 PARA2 USAGE IS POINTER.
    01 SMP2.
       02 COPY CHAR IN CORBA REPLACING CORBA-CHAR BY PARA1.
       02 COPY FLOAT IN CORBA REPLACING CORBA-FLOAT BY PARA2.
    01 SMP3.
       02 COPY CHAR IN CORBA REPLACING CORBA-CHAR BY PARA1.
       02 COPY DOUBLE IN CORBA REPLACING CORBA-DOUBLE BY PARA2.
    01 SMP2 USAGE POINTER. 
    01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY ENV. 
    01 COPY ANY IN CORBA REPLACING CORBA-ANY BY ANY1. 
    01 ANY2 USAGE POINTER. 
    01 COPY ANY IN CORBA REPLACING CORBA-ANY BY ANY2-P. 
    01 ANY3 USAGE POINTER. 
    01 COPY ANY IN CORBA REPLACING CORBA-ANY BY ANY3-P. 
    01 ANY0 USAGE POINTER. 
    01 COPY ANY IN CORBA REPLACING CORBA-ANY BY ANY0-P. 
  PROCEDURE DIVISION OBJ ANY1 ANY2 ANY3 ENV ANY0.
  MAIN. 
  *outパラメタ用領域の獲得
    CALL "CORBA-ANY-ALLOC"  USING
        ANY2. 
    SET ADDRESS OF ANY2-P TO ANY2. 
  *TypeCodeの設定
    MOVE FUNCTION LENG (TC-ODSAMPLE-SAMPLE2-IMPL-SEQ) TO T-LONG. 
    CALL "CORBA-STRING-SET" USING
        TYPE-P
        T-LONG
        TC-ODSAMPLE-SAMPLE2-IMPL-SEQ. 
    CALL "CORBA-ORB-TYPECODE-FROM-CGEN-TC" USING
        TYPE-P
        ANY-TYPE OF ANY2-P. 
    CALL "CORBA-FREE" USING
        TYPE-P. 
  *出力用パラメタデータ領域の獲得
    CALL "ODSAMPLE-SAMPLE2-ALLOC" USING
        ANY-VALUE OF ANY2-P. 
    SET ADDRESS OF SMP2 TO ANY-VALUE OF ANY2-P. 
  *出力パラメタの設定
    MOVE "x" TO PARA1 OF SMP2. 
  *出力パラメタの設定
    MOVE 0.001 TO PARA2 OF SMP2. 
    CALL "CORBA-ANY-SET-RELEASE" USING
        ANY2
        CORBA-TRUE-VALUE. 
  *inoutパラメタの処理
    SET ADDRESS OF ANY3-P TO ANY3.
    CALL "CORBA-FREE" USING ANY-VALUE OF ANY3-P.
    CALL "CORBA-ANY-SET-RELEASE" USING
        ANY3
        CORBA-TRUE-VALUE.
  *TypeCodeの設定
    MOVE FUNCTION LENG (TC-ODSAMPLE-SAMPLE3-IMPL-SEQ) TO T-LONG. 
    CALL "CORBA-STRING-SET" USING
        TYPE-P
        T-LONG
        TC-ODSAMPLE-SAMPLE3-IMPL-SEQ. 
    CALL "CORBA-ORB-TYPECODE-FROM-CGEN-TC" USING
        TYPE-P
        ANY-TYPE OF ANY3-P. 
    CALL "CORBA-FREE" USING
        TYPE-P. 
    CALL "ODSAMPLE-SAMPLE3-ALLOC" USING
        ANY-VALUE OF ANY3-P. 
    SET ADDRESS OF SMP3 TO ANY-VALUE OF ANY3-P. 
    MOVE "y" TO PARA1 OF SMP3. 
    MOVE 0.0001 TO PARA2 OF SMP3. 
  *復帰値の処理
    CALL "CORBA-ANY-ALLOC" USING ANY0.
    SET ADDRESS OF ANY0-P TO ANY0.
    MOVE FUNCTION LENG (TC-ODSAMPLE-SAMPLE1-IMPL-SEQ) TO T-LONG. 
    CALL "CORBA-STRING-SET" USING
        TYPE-P
        T-LONG
        TC-ODSAMPLE-SAMPLE1-IMPL-SEQ. 
    CALL "CORBA-ORB-TYPECODE-FROM-CGEN-TC" USING
        TYPE-P
        ANY-TYPE OF ANY0-P. 
    CALL "CORBA-FREE" USING
        TYPE-P. 
    CALL "ODSAMPLE-SAMPLE1-ALLOC" USING
        ANY-VALUE OF ANY0-P. 
    SET ADDRESS OF SMP1 TO ANY-VALUE OF ANY0-P. 
    MOVE 300 TO PARA1 OF SMP1. 
    MOVE 5 TO LSIZE. 
    MOVE "test" TO STR-WORK. 
    CALL "CORBA-STRING-SET" USING
        PARA2 OF SMP1
        LSIZE
        STR-WORK. 
    CALL "CORBA-ANY-SET-RELEASE" USING
        ANY0
        CORBA-TRUE-VALUE. 
   MAIN-END. 
  END PROGRAM "ODSAMPLE-ANYTEST-OP1".