EGL プログラムからの C 関数の呼び出し

EGL プログラムから C 関数を呼び出すことができます。 下記の手順を実行する前に、『C 関数と EGL』で説明されているように C コードをコンパイルし、リンクする必要があります。

C 関数を EGL プログラムから呼び出す手順は、次のとおりです。
  1. 関数呼び出し 文を使用して、以下を指定する。
    • C 関数の名前
    • C 関数に渡すすべての引数
    • EGL プログラムに戻すすべての変数
  2. 関数定義を含む EGL ネイティブ・ライブラリー・パーツ を作成する。
  3. USE 文を使用して、呼び出し側モジュール内に EGL ネイティブ・ライブラリー・パーツを指定する。

例えば、次の関数呼び出し文は、C 関数 sendmsg( ) を呼び出します。

sendmsg(chartype, 4, msg_status, return_code);

この文は、2 つの引数 (chartype4 のそれぞれ) を関数に渡し、2 つの引数 (msg_statusreturn_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 共用ライブラリーを指定します。
注: この C 共用ライブラリー名は、vgj.defaultI4GLNativeLibrary システム・プロパティーを使用して指定することもできます。 dllName とシステム・プロパティーの両方が 指定されている場合は、dllName が使用されます。 EGL nativeLibrary について詳しくは、 「nativeLibrary 型のライブラリー・パーツ」ヘルプ・トピックを参照してください。

C 関数は、引数スタック (この場合、2 つの引数) にプッシュされる値の数を指定する整数引数を受け取ります。 これは、C 関数内のスタックからポップされる値の数です。 また、この関数は、EGL プログラムに制御権を戻す前に、msg_status 引数および return_code 引数の値を戻す必要があります。 ポップ外部関数については、『EGL からの値の受け取り』で、 戻り外部関数については、『EGL への値の戻り』で説明します。

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 つの引数を受け取る必要があるので、渡された引数の数をチェックします。 この関数が異なる数の引数を受け取った場合、確認メッセージを出してプログラムを終了します。

関連リファレンス
C の BIGINT 関数  
C データ型と EGL プリミティブ型
EGL ライブラリー・パーツの作成
C の DATE 関数
C の DATETIME および INTERVAL 関数
C の DECIMAL 関数
関数呼び出し
nativeLibrary 型のライブラリー・パーツ
C のスタック関数
C の戻り関数
EGL での C 関数

フィードバック
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.