在使用Enterprise Cobol for z / OS的大型机上,是否可以从使用NODLL编译的cobol程序中动态调用Cobol Dyamic链接库(DLL)程序?
答案 0 :(得分:2)
有很多方法可以做你想做的事。
如果通过动态调用表示通过数据定义变量进行调用,我认为您不能使用链接器/绑定器执行此操作,因为绑定器需要在绑定时知道目标函数。
你必须具体dllload
DLL加载模块,dllqueryfn
该函数并以此方式调用它。
要使用链接器/活页夹,我认为需要执行以下步骤(P1
是执行调用的NODLL
COBOL程序,P2
是DLL
程序正在进行叫):
P2
必须使用DLL
选项进行编译和绑定。P1
必须使用NODYNAM
编译并与DLL绑定。P1
必须包含CALL 'dll-func'
(即仅限文字通话)。P1
时,SYSLIB
必须先指向P2
位置。这会导致绑定器将P1
和P2
合并到一个不完全是DLL调用的加载模块中,但我认为除了{{1解决方案。
我使用过旧式的dll函数,但是如果你处于足够高的级别,那么还有更新的dllload/dllqueryfn
C辅助函数。
This page支持我的论点,即dlopen/dlsym
程序只能绑定到单个加载模块中才能相互调用。但是你仍然需要使用静态调用。
This page提供了另一个选项,您可以将DLL程序放入与调用程序相同的加载模块中,并使用静态调用来获取它。似乎DLL程序可以在该加载模块中调用其他DLL程序而不是。因此,可以在DLL程序中提供静态网关功能,该功能可以动态调用不在加载模块中的DLL函数。这超出了我曾经做过的大事,所以你必须进行实验。
这些页面都来自publib-boulder网站,使用IBM产品的所有人应该知道(以及redbooks / redpapers网站)。
我,我更喜欢NODLL/DLL
解决方案,因为这是我在AIX和其他UNIX上所习惯的,它似乎提供了最大的灵活性。