Llamar dinámicamente un programa cobol NODLL desde un programa cobol DLL en z / OS
-
05-07-2019 - |
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?
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ónDLL
. -
P1
debe compilarse conNODYNAM
y enlazarse con DLL. -
P1
debe contenerCALL 'dll-func'
(es decir, solo llamadas literales). - Al enlazar
P1
,SYSLIB
debe apuntar primero a la ubicación deP2
.
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.