他の言語からの PL/I の呼び出し

別の言語からの PL/I サブルーチンの呼び出しを有効にするには、最初に PL/I ランタイム システム (RTS) を初期化し、サブルーチンの実行後にそれを終了する必要があります。静的呼び出しまたは動的呼び出しを使用できます。

RTS の初期化および終了

サブルーチンで PL/I アプリケーション ロジックを実行するには、PL/I API を使用して次のように 1 回ずつ PL/I RTS を初期化してから終了します。

  • _lpi_init():初期化
  • _lpi_fini_and_return():終了

必要な初期化および終了は、プログラミングのニーズに応じてさまざまな方法で実装できます。次のリストで、いくつかの例を紹介します。

PL/I サブルーチンを 1 つずつ呼び出す
各 PL/I サブルーチン呼び出しの前に __lpi_init() を呼び出し、戻った後に __lpi_fini_and_return() を呼び出せます。これは、PL/I サブルーチンを 2 つだけ呼び出す場合には簡単な解決策ですが、多数のサブルーチンを呼び出す場合はお勧めしません。コードの変更とそれに伴うオーバーヘッドが煩雑になる可能性があるためです。
COBOL プログラムからのサブルーチンの呼び出し
この方法は、CICS ベースのアプリケーションを除くすべての場合における最もシンプルなアプローチとしてお勧めします。*

メインの COBOL プログラムを -initcall 指令を使用してコンパイルします。指定された initcall ルーチンで以下を実行します。

  1. PL/I ランタイム システムを初期化します。
  2. COBOL 出口プロシージャを登録します。
  3. 出口プロシージャから PL/I RTS を終了します。
DLLMAIN (Windows) または fini/init メカニズム (Linux/UNIX) の呼び出し
Enterprise Developer Open PL/I には、Linux/UNIX 用の 2 つの初期化ルーチン (dllmain_cob.o および dllmain.o) が用意されています。
dllmain_cob.o
cob コマンドを使用して PL/I 共有オブジェクトをリンクする場合は、このルーチンを使用します。
dllmain.o
ldpli とリンクする場合は、このルーチンを使用します。Windows DLL Main() の例については、「例:PL/I サブルーチンを自己初期化 RTS とリンクさせるコマンド」を参照してください。

次の説明は両方のルーチンに該当します。

  • 共有オブジェクトのロード (動的呼び出し) 時に PL/I RTS を自動的に初期化します。
  • 共有オブジェクトのアンロード時に PL/I RTS を自動的に初期化解除します。
  • 1 つのアプリケーションが複数の PL/I 共有オブジェクトを呼び出す場合、ルーチンは RTS を 1 回ずつ初期化および終了します。ただし、いずれか 1 つの PL/I オブジェクトがアプリケーションによってアンロードされると、PL/I RTS が途中で終了する点に注意してください。これにより、特定および解決が困難な問題が発生する可能性があります。

いずれの場合も、PL/I サブルーチンの全体的な設計と、プログラム内のサブルーチンの使用方法を検討してください。PL/I の作業が完了するまで、PL/I RTS が終了しないようにする必要があります。最初に 1 つのルーチンを呼び出して PL/I RTS を初期化し、COBOL 環境の破棄によって RTS を終了させ、環境を初期化解除することをお勧めします。

* この方法に関して、複数の CICS リンク レベルから PL/I サブルーチンを呼び出す場合は例外となります。この場合、API __lpi_get_kix_level() 呼び出しを使用して、リンク レベルごとに 1 回ずつ初期化と終了を管理し、現在のリンク レベルを判別して、所定の PL/I RTS コンテキストをインスタンス化するか破棄するかを判別する必要があります。__lpi_init() への後続の各呼び出しは、新しいスタック RTS コンテキストを作成し、__lpi_fini_and_return() は現在のコンテキストを削除します。次に例を示します。
int             __lpi_get_kix_level();
注意:
これは高度な手順であるため、CICS リンク レベルおよび PL/I API の概念の理解が十分でない場合は実行しないでください。

静的呼び出しおよび動的呼び出し

PL/I ルーチンは、静的または動的にリンクして呼び出せます。動的リンクまたは動的呼び出しを行う場合は、上記の「RTS の初期化および終了」セクションに記載の設計上の推奨事項を必ず考慮してください。