在使用 Enterprise Cobol for z/OS 的大型机上,是否可以从使用 NODLL 编译的 cobol 程序动态调用 Cobol 动态链接库 (DLL) 程序?
1 回答
有很多方法可以做你想做的事。
如果通过动态调用,您的意思是通过数据定义变量进行调用,我认为您不能使用链接器/绑定器执行此操作,因为绑定器需要在绑定时知道目标函数。
您必须专门dllload
加载 DLL 模块、dllqueryfn
函数并以这种方式调用它。
要使用链接器/绑定器,我相信需要执行以下步骤(P1
是NODLL
COBOL 程序进行调用,P2
是DLL
被调用的程序):
P2
必须编译并与DLL
选项绑定。P1
必须NODYNAM
与 DLL 一起编译和绑定。P1
必须包含CALL 'dll-func'
(即,仅文字调用)。- 绑定时
P1
,SYSLIB
必须先指向P2
位置。
这将导致活页夹将两者合并P1
到P2
一个加载模块中,该加载模块并不完全是 DLL 调用,但我认为除了解决方案之外没有任何办法dllload/dllqueryfn
。
我使用了旧式的 dll 函数,但是,如果你的水平足够高,还有更新的dlopen/dlsym
C 辅助函数。
该页面支持我的论点,即NODLL/DLL
程序只有在绑定到单个加载模块时才能相互调用。但是,您仍然必须使用静态调用。
该页面提供了另一个选项,您可以将 DLL 程序放入与调用程序相同的加载模块中,并使用静态调用来访问它。似乎 DLL 程序可以调用不在该加载模块中的其他 DLL 程序。所以有可能在DLL程序中提供一个静态网关函数,可以动态调用加载模块中没有的DLL函数。这超出了我在大铁上做过的任何事情,所以你必须进行实验。
这两个页面都来自使用 IBM 产品的每个人都应该知道的 publib-boulder 站点(以及 redbooks/redpapers 站点)。
我,我更喜欢这个dllload/dllqueryfn
解决方案,因为这是我从 AIX 和其他 UNIX 中习惯的解决方案,而且它似乎提供了最大的灵活性。