Chiamata dinamica di un programma cobol NODLL da un programma cobol DLL su z / OS
-
05-07-2019 - |
Domanda
Sul mainframe che utilizza Enterprise Cobol per z / OS, è possibile CHIAMARE dinamicamente un programma DLL (Cobol Dyamic link library) da un programma cobol compilato con NODLL?
Soluzione
Esistono diversi modi per fare ciò che vuoi.
Se, per chiamata dinamica, intendi una chiamata tramite una variabile di definizione dei dati, non penso che tu possa farlo con il linker / raccoglitore poiché il raccoglitore deve conoscere le funzioni di destinazione al momento del collegamento.
Devi specificamente dllload
il modulo di caricamento DLL, dllqueryfn
la funzione e chiamarla in quel modo.
Per utilizzare il linker / raccoglitore, credo che siano necessari i seguenti passaggi ( P1
è il programma COBOL NODLL
che esegue la chiamata, P2
è il programma DLL
chiamato):
-
P2
deve essere compilato e associato con l'opzioneDLL
. -
P1
deve essere compilato conNODYNAM
e associato a DLL. -
P1
deve contenereCALL 'dll-func'
(ovvero, solo chiamate letterali). - Quando si associa
P1
,SYSLIB
deve prima puntare alla posizioneP2
.
Questo farà sì che il raccoglitore incorpori sia P1
che P2
in un singolo modulo di caricamento che non è esattamente una chiamata DLL ma non credo che ci sia alcun modo per aggirare questo diverso dalla soluzione dllload / dllqueryfn
.
Ho usato le funzioni dll di vecchio stile ma, se sei ad un livello abbastanza alto, ci sono anche le più recenti funzioni di supporto C dlopen / dlsym
.
Questa pagina fornisce supporto alla mia tesi secondo cui i programmi NODLL / DLL
possono chiamarsi a vicenda solo se associati a un singolo modulo di carico. Devi comunque usare chiamate statiche.
Questa pagina offre un'altra opzione, in cui è possibile inserire il programma DLL nello stesso modulo di caricamento del programma chiamante e utilizzare chiamate statiche per accedervi. Sembra che il programma DLL possa chiamare altri programmi DLL non in quel modulo di caricamento. Quindi potrebbe essere possibile fornire una funzione gateway statica nel programma DLL che può chiamare in modo dinamico una funzione DLL non nel modulo di caricamento. Questo è al di là di qualsiasi cosa io abbia mai fatto sul ferro grande, quindi dovrai sperimentare.
Entrambe queste pagine provengono dai siti publib boulder che tutti utilizzando un prodotto IBM dovrebbero conoscere (insieme al sito redbooks / redpapers).
Io preferisco la soluzione dllload / dllqueryfn
poiché è quello a cui sono abituato da AIX e altri UNIX e sembra offrire la massima flessibilità.