自分自身を具体化(=Materialize)するとは自分の実体の名前を取得するという
ことである。
もう少し具体的に言えば実行したプログラムが自分のプログラム名と
実行されたオブジェクト・ライブラリー名を取得することである。
_
[ CLP: TESTMAT ]
ソースはこちらから
0001.00 PGM 0002.00 /*-------------------------------------------------------------------*/ 0003.00 /* TESTMAT : 自分自身を具体化する */ 0004.00 /* */ 0005.00 /* 2023/07/08 作成 */ 0006.00 /*-------------------------------------------------------------------*/ 0007.00 /*( _MATPGMNM の変数 )*/ 0008.00 DCL VAR(&BUFFER) TYPE(*CHAR) LEN(80) + 0009.00 VALUE(X'00000050000000500000000000000000') 0010.00 DCL VAR(&PGM) TYPE(*CHAR) LEN(10) 0011.00 DCL VAR(&OBJLIB) TYPE(*CHAR) LEN(10) 0012.00 0013.00 /*( 自分自身の取得 )*/ 0014.00 CALLPRC PRC('_MATPGMNM') PARM(&BUFFER) 0015.00 CHGVAR VAR(&PGM) VALUE(%SST(&BUFFER 51 10)) 0016.00 CHGVAR VAR(&OBJLIB) VALUE(%SST(&BUFFER 19 10)) 0017.00 SNDPGMMSG MSG('PGM=' *CAT &PGM *TCAT ' OBJLIB=' + 0018.00 *CAT &OBJLIB) MSGTYPE(*DIAG) 0019.00 0020.00 ENDPGM
[COMPILE]
CRTBNDCL PGM(OBJLIB/TESTMAT) SRCFILE(SRCLIB/QCLSRC) DFTACTGRP(*NO) ACTGRP(*NEW)
AUT(*ALL) DBGVIEW(*SOURCE)
[解説]
_MAPPGMNM という名前のAPIは MI(=Machine Interface)である。
MIというと機械語インターフェースとしてなにやら難しそうであるが
日常でC言語からでもよく使っている。
_MAPPGMNM(=Materialize Prpgramm Name)はプログラムの自分の名前と
自分が呼び出されたライブラリー名を取得することができる。
これが何の役に立つのかというと複数の異なるライブラリーで実行されたときに
自分がどのライブラリーから呼び出されたものなのかを判断することが
できるのである。
弊社では複数の異なる製品のどのライブラリーから呼び出されたのかを
判断することに役立つし読者であればテスト環境のライブラリーから呼び出されたものか
本番環境のライブラリーから呼び出されたものかを判断させることができる。
ただしこのCLPはソース・タイブはCLPではなくCLLEでSEUわ実行させる必要がある。
コンパイルもCRTCLPGM ではなく ILE-CLPであるので CRTBNDCLでコンパイルすること。
_