代码之家  ›  专栏  ›  技术社区  ›  Kb.

在z/OS上从dll COBOL程序动态调用nodll COBOL程序

  •  1
  • Kb.  · 技术社区  · 16 年前

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

    1 回复  |  直到 16 年前
        1
  •  2
  •   paxdiablo    7 年前

    有很多方法可以满足你的需要。

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

    你必须明确 dllload dll加载模块, dllqueryfn 函数并以这种方式调用它。

    要使用链接器/绑定器,我认为需要以下步骤( P1 NODLL 执行调用的COBOL程序, P2 DLL 正在调用的程序):

    • P2 必须编译并绑定到 动态链接库 选择权。
    • P1 必须用编译 NODYNAM 与dll绑定。
    • P1 必须包含 CALL 'dll-func' (即,仅字面调用)。
    • 装订时 P1 , SYSLIB 必须首先指向 P2 位置。

    这将导致粘合剂结合 P1 P2 到一个单独的加载模块,这个模块不完全是dll调用,但我认为除了 dllload/dllqueryfn 解决方案。

    我已经使用了老式的dll函数,但是如果您的级别足够高,那么也有更新的 dlopen/dlsym C helper函数。

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

    This page 提供了另一个选项,您可以将dll程序放入与调用程序相同的加载模块中,并使用静态调用来访问它。似乎dll程序可以调用其他dll程序 在那个加载模块中。因此,可以在dll程序中提供静态网关函数,动态调用不在加载模块中的dll函数。这是我在大铁上做过的任何事都做不到的,所以你必须进行实验。

    这两页都来自Publib Boulder网站, 每个人 使用IBM产品应该知道(以及Redbooks/Redpapers站点)。

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