在使用Enterprise Cobol for z/OS的大型机上,是否可以从用NODLL编译的Cobol程序中动态调用cobol动态链接库(DLL)程序?
发布于 2009-03-17 02:00:42
有许多方法可以做你想做的事情。
如果您所说的动态调用是指通过数据定义变量进行调用,那么我不认为您可以使用链接器/绑定器执行此操作,因为绑定器需要在绑定时知道目标函数。
你必须特别地对DLL加载模块进行dllload,对函数进行dllqueryfn,并以这种方式调用它。
要使用链接器/绑定器,我认为需要执行以下步骤(P1是执行调用的NODLL COBOL程序,P2是被调用的DLL程序):
P2必须编译并与代码绑定option.P1必须使用NODYNAM编译并与DLL.P1绑定必须包含CALL 'dll-func' (即,仅文字调用)。P1时,SYSLIB必须首先指向P2位置。这将导致绑定器将P1和P2合并到单个加载模块中,这并不完全是DLL调用,但我认为除了dllload/dllqueryfn解决方案之外,没有其他方法可以解决这个问题。
我已经使用了老式的dll函数,但是,如果您处于足够高的级别,也可以使用较新的dlopen/dlsym C辅助函数。
This page支持我的观点,即NODLL/DLL程序只有在绑定到单个加载模块中时才能相互调用。但是,您仍然必须使用静态调用。
This page提供了另一种选择,您可以将DLL程序放入与调用程序相同的加载模块中,并使用静态调用来访问它。DLL程序似乎可以调用不在该加载模块中的其他DLL程序。因此,可以在DLL程序中提供静态网关函数,该静态网关函数可以动态地调用不在加载模块中的DLL函数。这超出了我在大铁杆上做过的任何事情,所以你必须进行实验。
这两个页面都来自每个使用IBM产品的人都应该知道的publib boulder站点(以及红皮书/红皮书站点)。
对于我来说,我更喜欢dllload/dllqueryfn解决方案,因为我习惯于使用AIX和其他UNIXes,而且它似乎提供了最大的灵活性。
https://stackoverflow.com/questions/623604
复制相似问题