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?

Était-ce utile?

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’option DLL .
  • P1 doit être compilé avec NODYNAM et lié à une DLL.
  • P1 doit contenir CALL 'dll-func' (c'est-à-dire, appels littéraux uniquement).
  • Lorsque vous liez P1 , SYSLIB doit d’abord pointer sur l’emplacement P2 .

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top