从 z/OS 上的 DLL cobol 程序动态调用 NODLL cobol 程序
-
05-07-2019 - |
题
在使用 Enterprise Cobol for z/OS 的大型机上,是否可以从已使用 NODLL 编译的 cobol 程序动态 CALL Cobol Dyamic 链接库 (DLL) 程序?
解决方案
有很多种方法可以做你想做的事。
如果动态调用是指通过数据定义变量进行调用,我认为您不能使用链接器/绑定器来执行此操作,因为绑定器需要在绑定时知道目标函数。
你必须特别 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函数。这超出了我在大铁杆上做过的任何事情,所以你必须尝试一下。
这两个页面均来自 publib-boulder 网站 每个人 使用 IBM 产品应该了解(以及红皮书/红皮书网站)。
我,我更喜欢 dllload/dllqueryfn
我已经习惯了 AIX 和其他 UNIX 的解决方案,而且它似乎提供了最大的灵活性。