Pregunta

En el mainframe que utiliza Enterprise Cobol para z / OS, ¿es posible LLAMAR dinámicamente un programa de biblioteca de enlaces Dyamic (DLL) Cobol desde un programa cobol que se ha compilado con NODLL?

¿Fue útil?

Solución

Hay varias formas de hacer lo que quieres.

Si, mediante una llamada dinámica, te refieres a una llamada a través de una variable de definición de datos, no creo que puedas hacer esto con el enlazador / carpeta ya que la carpeta necesita conocer las funciones de destino en el momento de la vinculación.

Tienes que dllload específicamente el módulo de carga DLL, dllqueryfn la función y llamarlo así.

Para usar el enlazador / carpeta, creo que se requieren los siguientes pasos ( P1 es el programa NODLL COBOL que realiza la llamada, P2 se llama al programa DLL ):

  • P2 debe compilarse y enlazarse con la opción DLL .
  • P1 debe compilarse con NODYNAM y enlazarse con DLL.
  • P1 debe contener CALL 'dll-func' (es decir, solo llamadas literales).
  • Al enlazar P1 , SYSLIB debe apuntar primero a la ubicación de P2 .

Esto hará que la carpeta incorpore tanto P1 como P2 en un solo módulo de carga que no es exactamente una llamada a DLL, pero no creo que haya ninguna manera de evitarlo. aparte de la solución dllload / dllqueryfn .

He usado las funciones dll de estilo más antiguo pero, si estás en un nivel suficientemente alto, también están las funciones más recientes de dlopen / dlsym C helper.

Esta página proporciona soporte para mi afirmación de que los programas NODLL / DLL solo pueden llamarse entre sí si están vinculados a un solo módulo de carga. Sin embargo, todavía tienes que usar llamadas estáticas.

Esta página ofrece otra opción, donde puede colocar el programa DLL en el mismo módulo de carga que el programa de llamadas y usar llamadas estáticas para llegar a él. Parece que el programa DLL puede llamar a otros programas DLL no en ese módulo de carga. Por lo tanto, puede ser posible proporcionar una función de puerta de enlace estática en el programa DLL que puede llamar dinámicamente a una función DLL que no está en el módulo de carga. Esto va más allá de lo que he hecho en el big iron, así que tendrás que experimentar.

Ambas páginas provienen de los sitios de publicaciones públicas que todos deben saber sobre el uso de un producto de IBM (junto con el sitio de libros rojos / redpapers también).

Yo, prefiero la solución dllload / dllqueryfn , ya que es a lo que estoy acostumbrado desde AIX y otros UNIXes y parece proporcionar la máxima flexibilidad.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top