C-Funktion aus einem EGL-Programm aufrufen

Sie können eine C-Funktion aus einem EGL-Programm durch einen Bibliotheksabschnitt mit dem Stereotyp nativeLibrary aufrufen. Bevor Sie die nachstehenden Anweisungen befolgen, müssen Sie Ihren C-Code wie unter C-Funktionen über EGL-Bibliotheken aufrufen beschrieben kompilieren und verknüpfen.

Gehen Sie folgendermaßen vor, um eine C-Funktion aus einem EGL-Programm aufzurufen:
  1. Geben Sie bei der Anweisung für den Funktionsaufruf Folgendes an:
    • Name der C-Funktion
    • An die C-Funktion zu übergebende Argumente
    • An das EGL-Programm zurückzugebende Variablen
  2. Erstellen Sie einen EGL-Bibliotheksabschnitt mit dem Stereotyp nativeLibrary, der die Funktionsdefinition enthält.
  3. Geben Sie mit der Anweisung USE die native EGL-Bibliothek im aufrufenden Modul an.

Die folgende Funktionsaufrufanweisung ruft beispielsweise die C-Funktion sendmsg( ) auf:

sendmsg(chartype, 4, msg_status, return_code);

Sie übergibt zwei Argumente (chartype bzw. 4) an die Funktion und erwartet die Rückgabe von zwei Argumenten (msg_status bzw return_code). Dies wird ersichtlich, indem die Funktion in einer nativen Bibliothek wie folgt definiert wird:

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

Die übergebenen Argumente werden mit dem Parameter 'in' angegeben. Die zurückzugebenden Argumente werden mit dem Parameter 'out' angegeben.

callingConvention
Gibt an, dass die Argumente zwischen Funktionen und dem Aufrufcode mittels Argumentstack übergeben werden.
dllName
Gibt die gemeinsam genutzte C-Bibliothek an, in der diese Funktion vorhanden ist. Die Bibliothek sollte sich in dem Pfad befinden, der in der Umgebungsvariablen 'java.library.path' angegeben ist.
Anmerkung: Der Name der gemeinsam genutzten C-Bibliothek kann auch mit der Systemeigenschaft vgj.defaultI4GLNativeLibrary angegeben werden. Falls ein Wert sowohl für dllName als auch für die Systemeigenschaft angegeben ist, wird der Wert für dllName verwendet.

Die C-Funktion empfängt ein ganzzahliges Argument, das angibt, wie viele Werte zum Argumentstack hinzugefügt wurden (in diesem Fall sind es zwei). Dies ist die Anzahl der Werte, die in der C-Funktion aus dem Stack abgerufen werden müssen. Die Funktion muss außerdem Werte für die Argumente msg_status und return_code zurückgeben, bevor die Steuerung wieder an das EGL-Programm übergeben wird.

Die C-Funktion darf nicht ohne Weiteres davon ausgehen, dass die richtige Anzahl von Werten aus dem Stack übergeben wurde. Sie sollte ihr ganzzahliges Argument testen, um festzustellen, wie viele EGL-Argumente für sie zum Stack hinzugefügt wurden.

Das folgende Beispiel zeigt eine C-Fuktion, die genau 1 Argument erfordert:

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: /* change friday -> monday */
          ++theDate;
    case 6: /* saturday -> monday*/
          ++theDate;
    default: /* (sun..thur) go to next day */
          ++theDate;
    }
    ibm_lib4gl_returnDate(theDate); /* stack result */
    return(1) /* return count of stacked */
 }
 

Die Funktion gibt das Datum des nächsten Werktags nach dem angegebenen Datum zurück. Da die Funktion genau 1 Argument empfangen muss, überprüft die Funktion die Anzahl der übergebenen Argumente. Falls die Funktion eine andere Anzahl von Argumenten empfängt, wird das Programm (mit einer entsprechenden Nachricht) beendet.


Feedback