在使用 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 地点。

这将导致粘合剂将两者结合在一起 P1P2 到单个加载模块中,这不完全是 DLL 调用,但我认为除了 dllload/dllqueryfn 解决方案。

我使用过旧式的 dll 函数,但是,如果您的水平足够高,也可以使用更新的函数 dlopen/dlsym C 辅助函数。

这一页 为我的论点提供了支持 NODLL/DLL 如果绑定到单个加载模块中,程序只能互相调用。但是,您仍然必须使用静态调用。

这一页 提供了另一种选择,您可以将 DLL 程序放入与调用程序相同的加载模块中,并使用静态调用来访问它。看来DLL程序可以调用其他DLL程序 不是 在该加载模块中。因此,可以在DLL程序中提供静态网关函数,该函数可以动态调用不在加载模块中的DLL函数。这超出了我在大铁杆上做过的任何事情,所以你必须尝试一下。

这两个页面均来自 publib-boulder 网站 每个人 使用 IBM 产品应该了解(以及红皮书/红皮书网站)。

我,我更喜欢 dllload/dllqueryfn 我已经习惯了 AIX 和其他 UNIX 的解决方案,而且它似乎提供了最大的灵活性。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top