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

6.8.2 ワイド文字列型

(1)IDLマッピング

IDL言語でワイド文字列型wstringを指定した場合、COBOLでは日本語項目、またはPOINTERでデータ宣言します。
以降では、以下のIDL定義例をもとに説明します。


IDL言語
typedef wstring<10> t_bound_wstring;
module ODsample{ //ワイド文字列(固定長)
    interface  wstringtest{
        t_bound_wstring op1(in t_bound_wstring str1, out t_bound_wstring str2, inout t_bound_wstring str3); 
    };
};

module ODsample{
    interface  wstringtest{
        wstring op1(in wstring str1, out wstring str2, inout wstring str3); 
    };
};

COBOL
  * 文字列(固定長) 
   IDENTIFICATION DIVISION. 
   PROGRAM-ID. "ODSAMPLE-WSTRINGTEST-OP1".
   ENVIRONMENT DIVISION. 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
   COPY CONST IN CORBA. 
  *オブジェクトリファレンス
    01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. 
  * inパラメタ
    01 STR1 PIC N(10). 
  * outパラメタ
    01 STR2 PIC N(10). 
  * inoutパラメタ
    01 STR3 PIC N(10). 
  *例外情報
    01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY ENV. 
  *復帰値
    01 RET  PIC N(10). 

   PROCEDURE DIVISION. 

    CALL "ODSAMPLE-WSTRINGTEST-OP1" USING
          OBJ
          STR1
          STR2
          STR3
          ENV 
          RET.

  * 文字列(可変長) 
   IDENTIFICATION DIVISION. 
   PROGRAM-ID. "ODSAMPLE-WSTRINGTEST-OP1".
   ENVIRONMENT DIVISION. 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
   COPY CONST IN CORBA. 
  *オブジェクトリファレンス
    01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. 
  * inパラメタ
    01 STR1 USAGE POINTER. 
  * outパラメタ
    01 STR2 USAGE POINTER. 
  * inoutパラメタ
    01 STR3 USAGE POINTER. 
  *例外情報
    01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY ENV. 
  *復帰値
    01 RET  USAGE POINTER. 

   PROCEDURE DIVISION. 

    CALL "ODSAMPLE-WSTRINGTEST-OP1" USING
          OBJ
          STR1
          STR2
          STR3
          ENV 
          RET.

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

文字列(固定長)のパラメタ(in、out、inout)を扱う場合、領域の獲得/解放を行う必要はありません。データ域にデータを設定します。

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

  DATA DIVISION. 
     WORKING-STORAGE SECTION. 
     COPY CONST IN CORBA. 
      01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. 
      01 STR1 PIC N(10). 
      01 STR2 PIC N(10). 
      01 STR3 PIC N(10). 
      01 RET PIC N(10). 
      01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY ENV. 
      01 COPY LONG IN CORBA REPLACING CORBA-LONG BY LSIZE. 

     PROCEDURE DIVISION. 
  * inパラメタの設定
      MOVE N"イン" TO STR1. 
  * inoutパラメタの設定
      MOVE N"インアウト" TO STR3. 
      CALL "ODSAMPLE-WSTRINGTEST-OP1" USING
            ORB
            STR1
            STR2
            STR3
            ENV
            RET. 

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

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

パラメタ

サーバへ渡すパラメタ

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

in

CORBA-WSTRING-SET関数を使用して、文字列+終端文字’\0\0’分の領域獲得と文字列設定を行います。

inout

(inパラメタと同じ)

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

out
復帰値

(inoutパラメタと同じ)

注意

クライアントおよびスタブで獲得した領域は、不要になった時点でCORBA-FREE関数で解放する必要があります。

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

  DATA DIVISION. 
     WORKING-STORAGE SECTION. 
     COPY CONST IN CORBA. 
      01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. 
      01 STR1 USAGE POINTER. 
      01 STR2 USAGE POINTER. 
      01 STR3 USAGE POINTER. 

      01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY ENV. 
      01 RET  USAGE POINTER. 
      01 COPY LONG IN CORBA REPLACING CORBA-LONG BY LSIZE. 
      01 STR-WORK PIC N(30). 

     PROCEDURE DIVISION. 
  * inパラメタの設定
      MOVE N"イン" TO STR-WORK. 
      COMPUTE LSIZE = FUNCTION LENGTH(STR-WORK). 
      CALL "CORBA-WSTRING-SET" USING
            STR1 
            LSIZE 
            STR-WORK. 
  * inoutパラメタの設定
      MOVE N"インアウト" TO STR-WORK. 
      COMPUTE LSIZE = FUNCTION LENGTH(STR-WORK). 
      CALL "CORBA-WSTRING-SET" USING
            STR3 
            LSIZE 
            STR-WORK. 
      CALL "ODSAMPLE-WSTRINGTEST-OP1" USING
            OBJ
            STR1
            STR2
            STR3
            ENV
            RET. 

  * 復帰値用領域の解放

      CALL "CORBA-FREE" USING
            RET. 
  * inパラメタ用領域の解放
      CALL "CORBA-FREE" USING
            STR1. 
  * outパラメタ用領域の解放
      CALL "CORBA-FREE" USING
            STR2. 
  * inoutパラメタ用領域の解放
      CALL "CORBA-FREE" USING
            STR3.

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

文字列(固定長)のパラメタ(in、out、inout)を扱う場合、領域の獲得/解放を行う必要はありません。データ域にデータを設定します。

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

   IDENTIFICATION DIVISION. 
   PROGRAM-ID. "ODSAMPLE-WSTRINGTEST-OP1".
   ENVIRONMENT DIVISION. 
   CONFIGURATION SECTION. 
   SPECIAL-NAMES. 
     SYMBOLIC CONSTANT
      COPY SYMBOL-CONST IN CORBA. 
      . 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
    COPY CONST IN CORBA. 
    01 COPY LONG IN CORBA REPLACING CORBA-LONG BY LSIZE. 
    01 STR-WORK PIC N(30).
   LINKAGE SECTION.
  * オブジェクトリファレンス
    01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. 
  * inパラメタ
    01 STR1 PIC N(10). 
  * outパラメタ
    01 STR2 PIC N(10). 
  * inoutパラメタ
    01 STR3 PIC N(10). 
    01 STR PIC N(10). 
  * 例外情報
    01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY ENV. 
 
   PROCEDURE DIVISION USING OBJ STR1 STR2 STR3 ENV STR. 

   MAIN. 

  * outパラメタの処理
    MOVE N"アウト" TO STR2. 

  * inoutパラメタの処理
    MOVE N"インアウト" TO STR3. 

  * 復帰値の処理
    MOVE N"リターン" TO STR. 

    MAIN-END. 
   END PROGRAM "ODSAMPLE-WSTRINGTEST-OP1".

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

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

パラメタ

クライアントから渡されたパラメタ

クライアントへ渡すパラメタ

in

文字列域は、スケルトンで自動的に獲得/解放されます。

inout

文字列域は、スケルトンで自動的に獲得されます。

  • 渡されたパラメタより短い文字列を返す場合:
    渡された文字列域に文字列を設定します。

  • 渡されたパラメタより長い文字列を返す場合:
    渡された文字列域をCORBA-FREE関数で一度解放し、CORBA-WSTRING-SET関数で領域獲得/文字列設定します。

文字列域は、スケルトンで自動的に解放されます。

out
復帰値

CORBA-WSTRING-SET関数で領域獲得/文字列設定します。
文字列域は、スケルトンで自動的に解放されます。

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

   IDENTIFICATION DIVISION. 
   PROGRAM-ID. "ODSAMPLE-WSTRINGTEST-OP1".
   ENVIRONMENT DIVISION. 
   CONFIGURATION SECTION. 
   SPECIAL-NAMES. 
     SYMBOLIC CONSTANT
      COPY SYMBOL-CONST IN CORBA. 
      . 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
    COPY CONST IN CORBA. 
    01 COPY LONG IN CORBA REPLACING CORBA-LONG BY LSIZE. 
    01 STR-WORK PIC N(30).
   LINKAGE SECTION.
  * オブジェクトリファレンス
    01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. 
  * inパラメタ
    01 STR1 USAGE IS POINTER. 
  * outパラメタ
    01 STR2 USAGE IS POINTER. 
  * inoutパラメタ
    01 STR3 USAGE IS POINTER. 
    01 STR USAGE IS POINTER. 
  * 例外情報
    01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY ENV. 
 
   PROCEDURE DIVISION USING OBJ STR1 STR2 STR3 ENV STR. 

   MAIN. 

  * outパラメタの処理
    MOVE N"アウト" TO STR-WORK. 
    COMPUTE LSIZE = FUNCTION LENGTH(STR-WORK). 
  * outパラメタの設定
    CALL "CORBA-WSTRING-SET" USING
          STR2 
          LSIZE 
          STR-WORK. 

  * inoutパラメタの処理
  * クライアントから渡された領域の解放
    CALL "CORBA-FREE" USING
           STR3. 
  * 出力パラメタの設定
    MOVE N"インアウト" TO STR-WORK. 
    COMPUTE LSIZE = FUNCTION LENGTH(STR-WORK). 
    CALL "CORBA-WSTRING-SET" USING
          STR3 
          LSIZE 
          STR-WORK. 

  * 復帰値の処理
    MOVE N"リターン" TO STR-WORK. 
    COMPUTE LSIZE = FUNCTION LENGTH(STR-WORK). 
  * 復帰値の設定
    CALL "CORBA-WSTRING-SET" USING
          STR 
          LSIZE 
          STR-WORK. 

    MAIN-END. 
   END PROGRAM "ODSAMPLE-WSTRINGTEST-OP1".

(6) エンディアンについて

コード系がUCS2のデータをワイド文字列の変数に格納した場合、デフォルトではCPUのエンディアンに従ってメモリ上にデータが格納されます。CORBA通信を行うだけの場合、メモリ上のデータがビッグエンディアンとリトルエンディアンのどちらの形式で格納されているかを意識する必要はありません。しかし、メモリ上のデータを独自通信のデータとして扱う場合など、CPUのエンディアンとは異なるエンディアンでメモリ上にデータを格納したい場合があります。このとき、COBOLコンパイラのRCSオプションを指定することにより、エンディアンの指定が可能となります。
なお、CPUのエンディアンとは異なるエンディアンを扱う場合は、そのエンディアン用のライブラリをリンクする必要があります。リンクするライブラリについては、“B.1.2 ライブラリ”を参照してください。また、翻訳/リンク手順の例については、“6.10 COBOLアプリケーション使用時の注意事項”を参照してください。