プロシージャー・ポインター・データ項目および関数ポインター・データ項目の設定には、形式 6 の SET ステートメントのみを使用することができます。
プロシージャー・ポインターとは、USAGE IS PROCEDURE-POINTER 節によって定義されるデータ項目です。関数ポインターとは、USAGE IS FUNCTION-POINTER
節によって定義されるデータ項目です。
ここでは、「ポインター」は、プロシージャー・ポインター・データ項目または関数ポインター・データ項目のどちらかを指します。プロシージャー・ポインター・データ項目または関数ポインター・データ項目は、以下の入り口点の入り口アドレス (ポインター) が入るように設定することができます。
- ネストされていない別の COBOL プログラム。例えば、例外条件が発生したときに、ユーザー作成エラー処理ルーチンに制御権を渡すためには、まずそのルーチンの入り口アドレスを CEEHDLR (条件管理 言語環境プログラム呼び出し可能サービス) に渡して、そのルーチンを登録させなければなりません。
- 別の言語で作成されているプログラム。例えば、C 関数の入り口アドレスを受け取るためには、CALL RETURNING ステートメントを使用して関数を呼び出してください。この結果、SET ステートメントの形式を使用して関数ポインターとして使用したりプロシージャー・ポインターに変換できるポインターが戻されます。
- 別の COBOL プログラムの代替入り口点 (ENTRY ステートメントで定義されたもの)。
SET ステートメントは、コンパイラー・オプション DYNAM|NODYNAM および DLL|NODLL の設定に応じて、プログラムと同じロード・モジュール内の入り口点、個別のロード・モジュール、または DLL からエクスポートされた入り口点を参照するように、プロシージャー・ポインターを設定します。したがって、これらのポインター・データ項目を使用する場合は、以下の点を考慮する必要があります。
- NODYNAM オプションおよび NODLL オプションを指定してプログラムをコンパイルするときに、ポインター項目をリテラル値 (入り口点の実際の名前) に設定する場合、その値は、同じロード・モジュール内の入り口点を参照している必要があります。そうしないと、参照は解決できません。
- NODLL オプションを指定してプログラムをコンパイルするときに、ポインター項目を実行時に入り口点の名前が入る ID に設定する場合、またはポインター項目をリテラルに設定し DYNAM オプションを指定してコンパイルする場合、ポインター項目は (リテラルであっても変数であっても) 別個のロード・モジュール内の入り口点を指している必要があります。入り口点は、1 次入り口点か、リンケージ・エディターまたはバインダーの ALIAS ステートメントで指定した代替入り口点になります。
- NODYNAM オプションおよび DLL オプションを
指定してコンパイルするときに、ポインター項目をリテラル値 (入り口点の実際の名前) に設定する
場合、その値は、同じロード・モジュール内の入り口点、または DLL モジュールから
エクスポートされた入り口点名を参照している必要があります。後者の場合は、プログラム・ロード・モジュールのリンク・エディットに、ターゲット DLL モジュールの DLL サイド・ファイルを含めなければなりません。
- NODYNAM オプションおよび DLL オプションを指定してコンパイルするときに、ポインター項目を ID (実行時に入り口点名が入るデータ項目) に設定する場合、その ID 値は、DLL モジュールからエクスポートされた入り口点名を参照している必要があります。この場合、DLL モジュール名は、エクスポートされた入り口点の名前と一致しなければなりません。
ポインター項目を、動的に呼び出されるロード・モジュールの入り口アドレスに設定し、
その後、動的に呼び出されたモジュールをプログラムで取り消すと、ポインター項目は未定義になります。その後その項目を参照しても、結果は信頼できないものになります。