LINK を使用したデータの受け渡し

これらの例は、LINK コマンドによって、リンク先のプログラムにデータが渡される方法を示しています。 XCTL コマンドも同様の方法でコーディングされます。

このタスクについて

図 1 から 図 4 は、LINK コマンドが COBOL、C、C++、PL/I、およびアセンブラー言語でどのように使用されるかを示しています。

COMMAREA を使用してデータが受け渡される例が以下に示されています。 チャネルを使用してデータを渡す LINK コマンドの例については、 チャネルを使用したプログラム間のデータ転送を参照してください。

LINK コマンドに指定する LENGTH 値が COMMAREA で渡されるデータの長さに一致していることを確認してください。 LENGTH には 0 (ゼロ) を指定しないでください。これは、結果の動作が予測不能であり、EXEC CICS® LINK コマンドが失敗する可能性があるためです。

COMMAREA を使用してデータを渡す場合、リンクされているプログラムは、タスクの EIB の EIBCALEN フィールドが、プログラムの予期する内容に一致するか検証しなければなりません。 不一致があると、記憶保護違反またはシステム障害になる場合があります。 詳しくは、 COMMAREA を使用した他のプログラムへのデータの引き渡しを参照してください。

図1: LINK コマンド: COBOL の場合
 Invoking program
IDENTIFICATION DIVISION.
PROGRAM ID. 'PROG1'..
WORKING-STORAGE SECTION.
01 COM-REGION.
02 FIELD PICTURE X(3)..
PROCEDURE DIVISION.
MOVE 'ABC' TO FIELD.
EXEC CICS LINK PROGRAM('PROG2')
COMMAREA(COM-REGION)
LENGTH(3) END-EXEC..
Invoked program
IDENTIFICATION DIVISION.
PROGRAM-ID. 'PROG2'..
LINKAGE SECTION.
01 DFHCOMMAREA.
02 FIELD PICTURE X(3)..
PROCEDURE DIVISION.
IF EIBCALEN GREATER ZERO
THEN
IF FIELD EQUALS 'ABC' …

以下の例では、COMMAREA に文字ストリングが含まれています。 構造体を含む COMMAREA の例については、 RETURN を使用したデータの受け渡しを参照してください。

図2: LINK コマンド: C の場合
 Invoking program
main()
{
unsigned char field[3];
memcpy(field, "ABC", 3);
EXEC CICS LINK PROGRAM("PROG2")
COMMAREA(field)
LENGTH(sizeof(field));
}
Invoked program
main()
{
unsigned char *commarea;
EXEC CICS ADDRESS COMMAREA(commarea) EIB(dfheiptr);
if (dfheiptr->eibcalen > 0)
{
if (memcmp(commarea, "ABC", 3) == 0)
{.
図3: LINK コマンド: PL/I の場合
 Invoking program
PROG1: PROC OPTIONS(MAIN);
DCL 1 COM_REGION AUTOMATIC,
2 FIELD CHAR(3),.
FIELD='ABC';
EXEC CICS LINK PROGRAM('PROG2')
COMMAREA(COM_REGION) LENGTH(3);
END;
 
Invoked program
PROG2:
PROC(COMM_REG_PTR) OPTIONS(MAIN);
DCL COMM_REG_PTR PTR;
DCL 1 COM_REGION BASED(COMM_REG_PTR),
2 FIELD CHAR(3),.
IF EIBCALEN>0 THEN DO;
IF FIELD='ABC' THEN ....
END;
END;
図4: LINK コマンド: アセンブラー言語の場合
 Invoking program
DFHEISTG DSECT
COMREG DS 0CL20
FIELD DS CL3.
PROG1 CSECT.
MVC FIELD,=C'XYZ'
EXEC CICS LINK
PROGRAM('PROG2')
COMMAREA(COMREG) LENGTH(3).
END
Invoked program
COMREG DSECT
FIELD DS CL3.
PROG2 CSECT.
L COMPTR,DFHEICAP
USING COMREG,COMPTR
CLC FIELD,=C'ABC'

END