IBM i には API(=Application Programming Interface)と呼ばれるプログラム(*PGM)が
公開されていてユーザーでも使用することができる。
APIはシステム・ライブラリー(QSYS)に保管されているプログラムである。
APIは旧リリースでも存在しているプログラムであり公開されていなくても
使用できる場合もある。
このため新しいリリースのマニュアルで公開されたAPIは旧リリースでも
使用可能な場合がある。
それではユーザーでも勝手にQSYSのプログラムをCALLで呼び出して使用すれば
立派なAPIとして使えるではないかという疑問がある。
例えば WRKOUTQコマンドを実行しているプログラムは
DSPCMD で調べると
コマンド情報の表示 コマンド . . . . . . . : WRKOUTQ ライブラリー . . . . . : QSYS コマンドを処理するプログラム . . . . . : QSPDSPQ ライブラリー . . . . . . . . . . . . : QSYS プログラムを呼び出すために使用される 状態 . . . . . . . . . . . . . . . : *SYSTEM ソース・ファイル . . . . . . . . . . . : S000014846 ライブラリー . . . . . . . . . . . . : QTEMP ソース・ファイル・メンバー . . . . . . : WRKOUTQ 妥当性検査プログラム . . . . . . . . . : *NONE 有効なモード . . . . . . . . . . . . . : *PROD *DEBUG *SERVICE 実行可能な環境 . . . . . . . . . . . . : *IMOD *BMOD *IREXX *BREXX *BPGM *IPGM *EXEC *INTERACT *BATCH 続く ... 続行するには,実行キーを押してください。 F3= 終了 F12= 取り消し (C) COPYRIGHT IBM CORP. 1980, 2007.
WRKOUTQが呼び出しているプログラムは QSYS/QSPDSPQ であることがわかる。
それでは自分で独自のWRKOUTQと良く似たコマンドを作成して実行を
プログラム : QSYS/QSPDSPQ にやらせることができるかというとそれはできない。
保護違反となってユーザーがQSYSのプログラムを実行することは許されない。
この仕組みは DSPOBJD QSYS/QSPDSPQ *PGM を見てみると
オブジェクト記述の表示-明細 ライブラリー 1 の 1 オブジェクト . . . . : QSPDSPQ 属性 . . . . . . . . : ライブラリー . . . : QSYS 所有者 . . . . . . . : QSPL ライブラリー ASP 装置 . : *SYSBAS ライブラリー ASP グループ : *SYSBAS タイプ . . . . . . . : *PGM 1 次グループ . . . . : *NONE ユーザー定義の情報 : 属性 . . . . . . . . . . . . . . . . : テキスト . . . . . . . . . . . . . . : 作成情報 : 作成日/時刻 . . . . . . . . . . . . : 08/12/19 11:24:17 作成ユーザー . . . . . . . . . . . . : *IBM 作成システム . . . . . . . . . . . . : 00000000 オブジェクト定義域 . . . . . . . . . : *SYSTEM 続く ... 続行するには,実行キーを押してください。 F3= 終了 F12= 取り消し
のようになっていて
オブジェクト定義域なるものが *SYSTEM となっている。
一方、API として公開されている例えばAPI: QUSLOBJD を DSPOBJD *PGM で見てみると
オブジェクト記述の表示-明細 ライブラリー 1 の 1 オブジェクト . . . . : QUSROBJD 属性 . . . . . . . . : ライブラリー . . . : QSYS 所有者 . . . . . . . : QSYS ライブラリー ASP 装置 . : *SYSBAS ライブラリー ASP グループ : *SYSBAS タイプ . . . . . . . : *PGM 1 次グループ . . . . : *NONE ユーザー定義の情報 : 属性 . . . . . . . . . . . . . . . . : テキスト . . . . . . . . . . . . . . : 作成情報 : 作成日/時刻 . . . . . . . . . . . . : 07/09/30 14:35:39 作成ユーザー . . . . . . . . . . . . : *IBM 作成システム . . . . . . . . . . . . : 00000000 オブジェクト定義域 . . . . . . . . . : *USER 続く ... 続行するには,実行キーを押してください。 F3= 終了 F12= 取り消し (C) COPYRIGHT IBM CORP. 1980, 2007.
のようになっていて
オブジェクト定義域 は *USER と表示されている。
一般に私達ユーザーがコンパイルして作成するプログラムやファイルのオブジェクト定義域はすべて *USER である。
しかしユーザーが作成するコマンドとパネル・グループのオブジェクト定義域は *SYSTEM となる。
コンパイラーでこれらのオブジェクト定義域を指定することはできない。
・ユーザーがオブジェクト定義域が *SYSTEM となっているプログラムを呼出して実行することはできない。
...これがAPIと通常のシステム・プログラムとの違いである。 APIは *USER であるのでユーザーでも呼び出して使用することができるが *SYSTEM であるシステム・プログラムを呼び出すことはできない。
・機密保護レベル(QSECURITY)が40以上では*SYSTEMであるオブジェクトを直接読むことはできない。
(しかしダンプ・リストは可能である)
…
[結論]
システム・プログラムはオブジェクト定義域が *SYSTEMであるのでユーザーが勝手に呼び出して使用することはできないが
API は *USER であるのでユーザーが呼び出すことができる。