Есть несколько способов сделать то, что вы хотите.
Если под динамическим вызовом вы имеете в виду вызов через переменную определения данных, я не думаю, что вы можете сделать это с помощью компоновщика / связывателя, поскольку связыватель должен знать целевые функции во время связывания.
Вы должны специально 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, и, похоже, оно обеспечивает максимальную гибкость.