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?

È stato utile?

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'opzione DLL .
  • P1 deve essere compilato con NODYNAM e associato a DLL.
  • P1 deve contenere CALL 'dll-func' (ovvero, solo chiamate letterali).
  • Quando si associa P1 , SYSLIB deve prima puntare alla posizione P2 .

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à.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top