EGL プログラムからの C 関数の呼び出し
ステレオタイプが nativeLibrary のライブラリー・パーツを使用して、EGL プログラムから C 関数を呼び出すことができます。 下記の手順を実行する前に、EGL ライブラリー経由での C 関数の呼び出しの説明に従って C コードをコンパイルし、リンクする必要があります。
- 関数呼び出し 文を使用して、以下を指定する。
- C 関数の名前
- C 関数に渡すすべての引数
- EGL プログラムに戻すすべての変数
- 関数定義を含み、ステレオタイプが nativeLibrary の、EGL ライブラリー・パーツを作成する。
- USE ステートメントを使用して、呼び出し側モジュール内に EGL ネイティブ・ライブラリーを指定する。
例えば、次の関数呼び出し文は、C 関数 sendmsg( ) を呼び出します。
sendmsg(chartype, 4, msg_status, return_code);
この文は、2 つの引数 (chartype と 4 のそれぞれ) を関数に渡し、2 つの引数 (msg_status と return_code のそれぞれ) が戻されることを期待します。 これを明確にするには、ネイティブ・ライブラリー内で関数を次のように定義します。
Library I4GLFunctions type nativeLibrary
{callingConvention = I4GL, dllName = "mydll"}
Function sendmsg(chartype char(10) in, i int in,
msg_status int out, return_code int out)
end
end
渡される引数は、「in」パラメーターを使用して指定され、戻される引数は、「out」パラメーターを使用して指定されます。
- callingConvention
- 引数スタック・メカニズムを使用して、引数が関数と呼び出し側コードとの間で渡されることを指定します。
- dllName
- この関数が存在する C 共用ライブラリーを指定します。ライブラリーは、環境変数「java.library.path」で指定されるパス上にある必要があります。
C 関数は、引数スタック (この場合、2 つの引数) にプッシュされる値の数を指定する整数引数を受け取ります。 これは、C 関数内のスタックからポップされる値の数です。 また、この関数は、EGL プログラムに制御権を戻す前に、msg_status 引数および return_code 引数の値を戻す必要があります。
C 関数は、正しい数のスタック値が渡されたことを前提としません。 C 関数は、その関数用にスタックされた EGL 引数の数を確認するために、その整数引数をテストします。
次の例は、正確に 1 つの引数を必要とする C 関数を示しています。
int nxt_bus_day(int nargs);
{
int theDate;
if (nargs != 1)
{
fprintf(stderr,
"nxt_bus_day: wrong number of parms (%d)¥n",
nargs );
ibm_lib4gl_returnDate(0L);
return(1);
}
ibm_lib4gl_popDate(&theDate);
switch(rdayofweek(theDate))
{
case 5: /* 金曜日 -> 月曜日に変更 */
++theDate;
case 6: /* 土曜日 -> 月曜日*/
++theDate;
default: /* (sun..thur) 翌日にジャンプ */
++theDate;
}
ibm_lib4gl_returnDate(theDate); /* スタックの結果 */
return(1) /* スタックされたカウントを戻す */
}
この関数は、所定の日付の翌営業日の日付を戻します。 この関数は、正確に 1 つの引数を受け取る必要があるので、渡された引数の数をチェックします。 この関数が異なる数の引数を受け取った場合、確認メッセージを出してプログラムを終了します。