(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アプリケーション使用時の注意事項”を参照してください。