Appel dynamique d'un programme cobol NODLL à partir d'un programme cobol DLL sur z / OS
-
05-07-2019 - |
Question
Sur l'ordinateur principal utilisant Enterprise Cobol for z / OS, est-il possible d'appeler dynamiquement un programme de bibliothèques de liens (DLL) Cobol Dyamic à partir d'un programme cobol compilé avec NODLL?
La solution
Il y a plusieurs façons de faire ce que vous voulez.
Si, par appel dynamique, vous entendez un appel via une variable de définition de données, vous ne pouvez pas le faire avec l'éditeur de liens / classeur car le classeur doit connaître les fonctions cible au moment de la liaison.
Vous devez spécifiquement dllload
le module de chargement de la DLL, dllqueryfn
de la fonction et l'appeler ainsi.
Pour utiliser l'éditeur de liens / le classeur, je crois que les étapes suivantes sont nécessaires ( P1
est le programme NODLL
COBOL effectuant l'appel, P2
le programme DLL
est-il appelé):
-
P2
doit être compilé et lié à l’optionDLL
. -
P1
doit être compilé avecNODYNAM
et lié à une DLL. -
P1
doit contenirCALL 'dll-func'
(c'est-à-dire, appels littéraux uniquement). - Lorsque vous liez
P1
,SYSLIB
doit d’abord pointer sur l’emplacementP2
.
Cela fera en sorte que le classeur incorpore à la fois P1
et P2
dans un seul module de chargement qui n'appelle pas exactement l'appel de DLL, mais je ne pense pas qu'il soit possible de le contourner autre que la solution dllload / dllqueryfn
.
J'ai utilisé les fonctions dll de style ancien, mais si vous êtes à un niveau suffisamment élevé, il existe également les nouvelles fonctions d'aide dlopen / dlsym
.
Cette page corrobore mon argument selon lequel les programmes NODLL / DLL
ne peuvent s’appeler que s’ils sont liés à un seul module de chargement. Cependant, vous devez toujours utiliser des appels statiques.
Cette page offre une autre option, dans laquelle vous pouvez placer le programme DLL dans le même module de chargement que le programme appelant et utiliser des appels statiques pour y accéder. Il semble que le programme DLL puisse appeler d’autres programmes DLL pas dans ce module de chargement. Il peut donc être possible de fournir une fonction de passerelle statique dans le programme DLL pouvant appeler dynamiquement une fonction DLL ne figurant pas dans le module de chargement. C’est au-delà de tout ce que j’ai fait sur le gros fer, vous devrez donc expérimenter.
Ces deux pages proviennent des sites publib-boulder que tous les utilisateurs qui utilisent un produit IBM doivent être informés (ainsi que le site redbooks / redpapers).
Moi, je préfère la solution dllload / dllqueryfn
car c'est ce à quoi je suis habitué sous AIX et autres UNIX et elle semble offrir une flexibilité maximale.