Динамический вызов коболической программы NODLL из коболической программы DLL в z/OS
-
05-07-2019 - |
Вопрос
Можно ли на мэйнфрейме с использованием 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, и оно, кажется, обеспечивает максимальную гибкость.