一般に、呼び出しに引数が含まれている場合は、プロシージャー・ポインターまたは関数ポインターによって呼び出されるプログラムに対して SYSTEM (STDCALL) リンケージを使用することはできません。 この制約事項は、名前の形成 (名前装飾 とも呼ばれる) に関連する規約によるものです。
STDCALL リンケージを使用すると、入り口名にパラメーター・リストのバイト数を付加することで、名前が形成されます。 例えば、参照による引数と値による 4 バイト整数を渡す、abc という名前のプログラムが、パラメーター・リスト内に 8 バイトを持つ場合、生成される名前は _abc@8 になります。SET ステートメントで入り口点に渡される引数を構文的に指定する方法はないため、入り口点のアドレスを指すプロシージャー・ポインターまたは関数ポインターを設定することはできません。したがって、生成される名前には、パラメーター・リスト内のバイト数として '0' が含まれます。入り口点に引数が含まれていると、外部参照が未解決のためリンクが失敗します。
CALLINT コンパイラー指示を使用して、プロシージャー・ポインターまたは関数ポインターを使用した引数を持つプログラムの呼び出しが、OPTLINK 規約を使用するようにしてください。 以下に、その例を示します。
CBL
IDENTIFICATION DIVISION.
PROGRAM-ID. XC.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 PP1 PROCEDURE-POINTER.
01 HW PIC X(12).
PROCEDURE DIVISION USING XA.
* Use OPTLINK linkage:
>>CALLINT OPTLINK
SET PP1 TO ENTRY “X”.
* Restore default linkage:
>>CALLINT
MOVE “Hello World.” to HW
DISPLAY “Calling X.”
* Use OPTLINK linkage:
>>CALLINT OPTLINK
CALL PP1 USING HW.
* Restore default linkage:
>>CALLINT
GOBACK.
END PROGRAM XC.
* Use OPTLINK linkage:
CBL ENTRYINT(OPTLINK)
IDENTIFICATION DIVISION.
PROGRAM-ID. X.
DATA DIVISION.
LINKAGE SECTION.
01 XA PIC 9(9).
PROCEDURE DIVISION USING XA.
DISPLAY XA.
GOBACK.
END PROGRAM X.
CALLINT コンパイラー指示と CALLINT コンパイラー・オプションを 使用しないと、リンクを実行する際に、_X@0 を指す参照が未解決の状態になります。
呼び出し先プログラムが C または PL/I で記述され、STDCALL インターフェースを使用する場合は、 呼び出し先プログラム内に pragma ステートメントを使用して、STDCALL 名前装飾を使用せずに名前を形成します。