(1)IDLマッピング
IDL言語でワイド文字列型wstringを指定した場合、COBOLでは日本語項目、またはPOINTERでデータ宣言します。
以降では、以下の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);
};
}; * 文字列(固定長)
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 | 文字列域は、スケルトンで自動的に獲得されます。 |
文字列域は、スケルトンで自動的に解放されます。 |
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アプリケーション使用時の注意事項”を参照してください。