OS400のリリース・アップに従ってC/400からだけしか使用できないとされているAPI が
増えてきている。最近では RPG から TCP/IP通信や IFSのストリーム・ファイルを
扱いたいという要望も増えてきているのではないだろうか?
はたしてRPGだけでは、もはや限界なのであろうか?
このようなRPG開発者からも C/400のライブラリー関数を使用できるような手法を紹介する。
C/400の多くのライブラリー関数は QSYS/QC2LE
というバインド・ディレクトリーに登録されている。
バインド・ディレクトリーとは *SRVPGM
を作成するときは登録する登録簿のことである。
CRTPGM
などによって *PGM
を作成するときには「サービス・プログラムのバインド」
パラメータにバインドする *SRVPGM (=DLLと同じ)
を指定してプロシージャーの名前解決を
図るのであるがバインド・ディレクトリーだけを指定しておくと、コンパイラーはバインド・ディレクトリー
の中に登録されている *SRVPGM
を検索して自動的にバインドしてくれるのである。
RPG では QSYS/QC2LE
というバインド・ディレクトリーを使用すると C/400のライブラリー関数の
多くは RPG の中からプロシージャーとして呼び出すことができる。
次の例では RPGで乱数を発生させるために C/400の rand
関数をプロシージャーとして
呼び出している。
H仕様書では BNDDIR
を指定しているが、BNDDIR
を使用できない低いリリースの場合はCRTPGM
コマンドで
バインド・ディレクトリーQSYS/QC2LE
を指定してコンパイルしてもかまわない。
【例】C/400の rand 関数を ILE-RPG から呼び出して使用する。
0001.00 H DATEDIT(*YMD/) COPYRIGHT('(C) OFFICEQUATTRO CO,.LTD JAPAN 2005-') 0002.00 H BNDDIR('QC2LE') 0003.00 F********** 乱数の発生 ********************************************* 0004.00 F******************************************************************** 0005.00 D RAND PR 5I 0 EXTPROC('rand') 0006.00 D RANSU S 5I 0 INZ(0) 0007.00 D INTAT8 S 8F INZ 0008.00 C EVAL RANSU = RAND 0009.00 C Z-ADD RANSU DG08 8 0 0010.00 C MOVE DG08 FLD8 8 0011.00 C 'RANDOM=' CAT(P) FLD8:0 DSP40 40 0012.00 C DSP40 DSPLY ANS 1 0013.00 C SETON LR 0014.00 C RETURN
【 解説 】
C/400には数多くの関数が用意されている。RPG からC/400のライブラリー関数が使用できるようになると
RPGの使用範囲は、かなり大きなものとなるはずである。
ただし、すべての関数が QSYS/QC2LE
にバインドされているわけではない。
特殊な関数を使用する場合には V5R3M0 のAPIやC/400の解説書には、どの DIR にバインドされているかが
明記されているので参照されたい。