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

第7章 アプリケーションの開発(COBOL)> 7.8 データ型に対するマッピング

7.8.5 構造体

(1)IDLマッピング

 IDL言語で構造体structを指定した場合、COBOLでも構造体でデータ宣言します。
 可変長構造体の場合、領域獲得関数(関数名は"モジュール名-インタフェース名-構造体名-ALLOC"、以降XX-ALLOC関数と呼ぶ)がIDLコンパイラで生成されます。
 以降では、以下の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 
          ); 
      };
  };

COBOL

  * 構造体(固定長) 
      01 ODSAMPLE-SAMPLEFIX. 
         02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 
         02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2. 
  * 構造体(可変長) 
      01 ODSAMPLE-SAMPLEVAR. 
         02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 
         02 PARA2 USAGE IS POINTER.

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

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

   ENVIRONMENT DIVISION. 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
     COPY CONST IN CORBA. 
     01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY ENV. 
     01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. 
     01 FIX1. 
        02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 
        02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2. 
     01 FIX2.
        02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1.
        02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2.
     01 FIX3. 
        02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 
        02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2. 
     01 FIX0.
        02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1.
        02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2.

   PROCEDURE DIVISION. 

  * inパラメタの設定
    MOVE 10 TO PARA1 OF FIX1. 
  * inパラメタの設定
    MOVE 11 TO PARA2 OF FIX1. 
  * inoutパラメタの設定
    MOVE 20 TO PARA1 OF FIX3. 
  * inoutパラメタの設定
    MOVE 21 TO PARA2 OF FIX3. 

    CALL "ODSAMPLE-STRUCTTEST-OP2" USING
         OBJ
         FIX1
         FIX2
         FIX3
         ENV
         FIX0.

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

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

パラメタ

サーバへ渡すパラメタ

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

in

構造体領域/可変長データ域を獲得する場合、XX-ALLOC関数/データ域獲得関数を用います。

inout

(inパラメタと同じ)

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

out
復帰値

(inoutパラメタと同じ)

注意事項

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

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

   ENVIRONMENT DIVISION. 
   DATA DIVISION. 
    WORKING-STORAGE SECTION. 
     COPY CONST IN CORBA. 
     01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY ENV. 
     01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. 
     01 VAR1.
        02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1.
        02 PARA2 USAGE IS POINTER.
     01 VAR2 USAGE POINTER. 
     01 VAR3-P USAGE POINTER. 
     01 VAR0 USAGE POINTER.
     01 STR-WORK PIC X(30). 
     01 COPY LONG IN CORBA REPLACING CORBA-LONG BY LSIZE. 
    LINKAGE SECTION. 
     01 VAR3. 
        02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 
        02 PARA2 USAGE IS POINTER. 

   PROCEDURE DIVISION. 

  *inパラメタの設定
     MOVE 5 TO PARA1 OF VAR1. 
     MOVE "test" TO STR-WORK. 
     MOVE FUNCTION LENG(STR-WORK) TO LSIZE
     CALL "CORBA-STRING-SET" USING
          PARA2 OF VAR1
          LSIZE
          STR-WORK. 

  *inoutパラメタの領域獲得
     CALL "ODSAMPLE-SAMPLEVAR-ALLOC" USING
           VAR3-P. 
     SET ADDRESS OF VAR3 TO VAR3-P. 
  *inoutパラメタの設定
     MOVE 4 TO PARA1 OF VAR3. 
     MOVE "pro" TO STR-WORK. 
     MOVE FUNCTION LENG(STR-WORK) TO LSIZE. 
     CALL "CORBA-STRING-SET" USING
          PARA2 OF VAR3 
          LSIZE 
          STR-WORK. 

     CALL "ODSAMPLE-STRUCTTEST-OP1" USING
         OBJ
         VAR1
         VAR2
         VAR3-P
         ENV
         VAR0.
     CALL "CORBA-FREE" USING PARA2 OF VAR1.
     CALL "CORBA-FREE" USING VAR2.
     CALL "CORBA-FREE" USING VAR3-P.
     CALL "CORBA-FREE" USING VAR0.

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

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

  IDENTIFICATION DIVISION. 
  PROGRAM-ID. "ODSAMPLE-STRUCTTEST-OP2".
  ENVIRONMENT DIVISION. 
   CONFIGURATION SECTION. 
   SPECIAL-NAMES. 
      SYMBOLIC CONSTANT
      COPY SYMBOL-CONST IN CORBA. 
      . 

  DATA DIVISION. 
  WORKING-STORAGE SECTION. 
   COPY CONST IN CORBA. 
   01 STR-WORK PIC X(30). 
   01 COPY LONG IN CORBA REPLACING CORBA-LONG BY LSIZE. 
  LINKAGE SECTION. 
   01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. 
   01 STR1. 
      02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 
      02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2. 
   01 STR2. 
      02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 
      02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2. 
   01 STR3. 
      02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 
      02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2. 
   01 ENV. 
      03 MAJOR PIC 9(9) COMP-5. 
         88 CORBA-NO-EXCEPTION VALUE 0. 
         88 CORBA-USER-EXCEPTION VALUE 1. 
         88 CORBA-SYSTEM-EXCEPTION VALUE 2. 
      03 IDL-ID USAGE POINTER. 
      03 MINOR PIC 9(9) COMP-5. 
      03 IDL-STATUS PIC 9(9) COMP-5. 
      03 PARAM USAGE POINTER. 
      03 MAGIC PIC 9(9) COMP-5. 
   01 FIX. 
      02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 
      02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2. 

  PROCEDURE DIVISION USING
      OBJ
      STR1
      STR2
      STR3
      ENV
      FIX. 

  MAIN SECTION. 

  * outパラメタの設定
     MOVE 0 TO PARA1 OF STR2. 
     MOVE 1 TO PARA2 OF STR2. 
  * inoutパラメタの設定
     MOVE 2 TO PARA1 OF STR3. 
     MOVE 3 TO PARA2 OF STR3. 
  * 復帰値の処理
     MOVE 4 TO PARA1 OF FIX. 
     MOVE 5 TO PARA2 OF FIX. 

   MAIN-END. 
  END PROGRAM "ODSAMPLE-STRUCTTEST-OP2".

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

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

パラメタ

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

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

in

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

inout

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

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

out
復帰値

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

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

  IDENTIFICATION DIVISION. 
  PROGRAM-ID. "ODSAMPLE-STRUCTTEST-OP1".
  ENVIRONMENT DIVISION. 
   CONFIGURATION SECTION. 
   SPECIAL-NAMES. 
      SYMBOLIC CONSTANT
      COPY SYMBOL-CONST IN CORBA. 
      . 
  DATA DIVISION. 
  WORKING-STORAGE SECTION. 
   COPY CONST IN CORBA. 
   01 STR-WORK PIC X(30). 
  LINKAGE SECTION. 
   01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. 
   01 STR1. 
      02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 
      02 PARA2 USAGE IS POINTER. 
   01 STR2 USAGE IS POINTER. 
   01 STR2-P. 
      02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 
      02 PARA2 USAGE IS POINTER. 
   01 STR3 USAGE IS POINTER.
   01 STR3-P. 
      02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 
      02 PARA2 USAGE IS POINTER. 
   01 STR0-P. 
      02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 
      02 PARA2 USAGE IS POINTER. 
   01 STR0 USAGE IS POINTER. 
   01 ENV. 
      03 MAJOR PIC 9(9) COMP-5. 
         88 CORBA-NO-EXCEPTION VALUE 0. 
         88 CORBA-USER-EXCEPTION VALUE 1. 
         88 CORBA-SYSTEM-EXCEPTION VALUE 2. 
      03 IDL-ID USAGE POINTER. 
      03 MINOR PIC 9(9) COMP-5. 
      03 IDL-STATUS PIC 9(9) COMP-5. 
      03 PARAM USAGE POINTER. 
      03 MAGIC PIC 9(9) COMP-5. 

  PROCEDURE DIVISION USING
      OBJ
      STR1
      STR2
      STR3
      ENV
      STR0. 

  MAIN SECTION. 

  *outパラメタの処理
    CALL "ODSAMPLE-SAMPLEVAR-ALLOC" USING
           STR2. 
    SET ADDRESS OF STR2-P TO STR2. 
    MOVE 12 TO PARA1 OF STR2-P. 
  MOVE "(*str2)->para2" TO STR-WORK. 
  MOVE FUNCTION LENG(STR-WORK) TO LSIZE
    CALL "CORBA-STRING-SET" USING
          PARA2 OF STR2-P
          LSIZE 
          STR-WORK. 

  *inoutパラメタの処理
    SET ADDRESS OF STR3-P TO STR3.
    CALL "CORBA-FREE" USING
           PARA2 OF STR3-P. 
     MOVE 12 TO PARA1 OF STR3-P. 
     MOVE 16 TO LSIZE. 
     MOVE "(*str3)->para2" TO STR-WORK. 
     MOVE FUNCTION LENG(STR-WORK) TO LSIZE
     CALL "CORBA-STRING-SET" USING
          PARA2 OF STR3-P 
          LSIZE 
          STR-WORK. 

  *復帰値の処理
    CALL "ODSAMPLE-SAMPLEVAR-ALLOC" USING
           STR0. 
    SET ADDRESS OF STR0-P TO STR0. 
    MOVE 11 TO PARA1 OF STR0-P. 
    MOVE 16 TO LSIZE. 
    MOVE "(*str2)->para2" TO STR-WORK. 
    MOVE FUNCTION LENG(STR-WORK) TO LSIZE
    CALL "CORBA-STRING-SET" USING
          PARA2 OF STR0-P
          LSIZE 
          STR-WORK. 
   MAIN-END. 
  END PROGRAM "ODSAMPLE-STRUCTTEST-OP1".

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

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