Динамический вызов коболической программы NODLL из коболической программы DLL в z/OS

StackOverflow https://stackoverflow.com/questions/623604

Вопрос

Можно ли на мэйнфрейме с использованием Enterprise Cobol for z/OS динамически ВЫЗОВАТЬ программу библиотеки Cobol Dyamic link (DLL) из программы Cobol, скомпилированной с помощью NODLL?

Это было полезно?

Решение

Есть несколько способов сделать то, что вы хотите.

Если под динамическим вызовом вы подразумеваете вызов через переменную определения данных, я не думаю, что вы можете сделать это с помощью компоновщика/связывающего устройства, поскольку связующему необходимо знать целевые функции во время связывания.

Вам придется специально 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, о котором следует знать (а также сайт redbooks/redpapers).

Я предпочитаю dllload/dllqueryfn решение, поскольку это то, к чему я привык в AIX и других UNIX, и оно, кажется, обеспечивает максимальную гибкость.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top