Invocar una función C desde un programa EGL

Puede invocar (o llamar) una función C desde un programa EGL. Antes de seguir las instrucciones que se proporcionan a continuación, debe compilar y enlazar el código C tal como se indica en el apartado Utilizar funciones C con EGL.

Para invocar una función C desde un programa EGL:
  1. Utilizando la sentencia invocación de función, especifique lo siguiente:
    • El nombre de la función C
    • Argumentos que hay que pasar a la función C
    • Variables a devolver al programa EGL
  2. Cree un componente de biblioteca EGL nativo que contenga la definición de la función.
  3. Con la sentencia USE, especifique el componente nativo de EGL en el módulo de llamada.

Por ejemplo, la sentencia de invocación de función siguiente llama a la función C sendmsg( )

sendmsg(chartype, 4, msg_status, return_code);

Pasa dos argumentos (chartype y 4, respectivamente) a la función y espera que se devuelvan dos argumentos (msg_status y return_code, respectivamente). Esto queda claro al definir la función en una biblioteca nativa de la forma siguiente:

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

Los argumentos que se pasan se especifican utilizando el parámetro "in" y los argumentos a devolver se especifican utilizando el parámetro "out".

convenioLlamada
especifica que los argumentos se pasarán entre funciones y el código de llamada utilizando el mecanismo de pila de argumentos.
nombreDll
Especifica la biblioteca compartida de C en la que existe esta función.
Nota: El nombre de la biblioteca compartida de C también puede especificarse utilizando la propiedad del sistema vgj.defaultI4GLNativeLibrary. Si se han especificado tanto nombreDll como la propiedad del sistema, se utilizará nombreDll. Para obtener más información acerca de la biblioteca nativa de EGL, consulte el tema de ayuda Componente de biblioteca de tipo nativeLibrary.

La función C recibe un argumento entero que especifica cuántos valores se han puesto en la pila de argumentos (en este caso, dos argumentos). Este es el número de valores que se deben sacar de la pila en la función C. La función también necesita devolver valores para los argumentos msg_status y return_code antes de devolver el control al programa EGL. Las funciones externas de extracción se describen en el apartado Recibir valores de EGL; las funciones externas de devolución se describen en el apartado Devolver valores a EGL.

La función C no debe dar por supuesto que se haya pasado el número correcto de valores apilados. La función C debe probar el argumento entero para ver cuántos argumentos EGL tiene apilados.

En este ejemplo se muestra una función C que necesita exactamente un argumento:

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 */
 }
 

La función devuelve la fecha del siguiente día hábil después de una fecha dada. Puesto que la función debe recibir exactamente un argumento, la función comprueba el número de argumentos pasados. Si la función recupera un número distinto de argumentos, termina el programa (con un mensaje de identificación.)

Consulta relacionada
Funciones BIGINT para C
Tipos de datos C y tipos primitivos EGL
Crear un componente de biblioteca de EGL
Funciones DATE para C
Funciones DATETIME e INTERVAL para C
Funciones DECIMAL para C
Invocaciones de función
Componente de biblioteca de tipo nativeLibrary
Recibir valores de EGL
Devolver valores a EGL
Utilizar funciones C con EGL

Condiciones de uso | Comentarios
(C) Copyright IBM Corporation 2000, 2005. Reservados todos los derechos.