1

在使用 Enterprise Cobol for z/OS 的大型机上,是否可以从使用 NODLL 编译的 cobol 程序动态调用 Cobol 动态链接库 (DLL) 程序?

4

1 回答 1

2

有很多方法可以做你想做的事。

如果通过动态调用,您的意思是通过数据定义变量进行调用,我认为您不能使用链接器/绑定器执行此操作,因为绑定器需要在绑定时知道目标函数。

您必须专门dllload加载 DLL 模块、dllqueryfn函数并以这种方式调用它。

要使用链接器/绑定器,我相信需要执行以下步骤(P1NODLLCOBOL 程序进行调用,P2DLL被调用的程序):

  • P2必须编译并与DLL选项绑定。
  • P1必须NODYNAM与 DLL 一起编译和绑定。
  • P1必须包含CALL 'dll-func'(即,仅文字调用)。
  • 绑定时P1SYSLIB必须先指向P2位置。

这将导致活页夹将两者合并P1P2一个加载模块中,该加载模块并不完全是 DLL 调用,但我认为除了解决方案之外没有任何办法dllload/dllqueryfn

我使用了旧式的 dll 函数,但是,如果你的水平足够高,还有更新的dlopen/dlsymC 辅助函数。

该页面支持我的论点,即NODLL/DLL程序只有在绑定到单个加载模块时才能相互调用。但是,您仍然必须使用静态调用。

该页面提供了另一个选项,您可以将 DLL 程序放入与调用程序相同的加载模块中,并使用静态调用来访问它。似乎 DLL 程序可以调用不在该加载模块中的其他 DLL 程序。所以有可能在DLL程序中提供一个静态网关函数,可以动态调用加载模块中没有的DLL函数。这超出了我在大铁上做过的任何事情,所以你必须进行实验。

这两个页面都来自使用 IBM 产品的每个人都应该知道的 publib-boulder 站点(以及 redbooks/redpapers 站点)。

我,我更喜欢这个dllload/dllqueryfn解决方案,因为这是我从 AIX 和其他 UNIX 中习惯的解决方案,而且它似乎提供了最大的灵活性。

于 2009-03-17T02:00:41.570 回答