Динамический вызов программы NODLL cobol из программы DLL cobol в z / OS - PullRequest
1 голос
/ 08 марта 2009

На мэйнфрейме, использующем Enterprise Cobol для z / OS, возможно ли динамически вызывать программу Cobol Dyamic link library (DLL) из программы cobol, скомпилированной с помощью NODLL?

1 Ответ

2 голосов
/ 17 марта 2009

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

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

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

...