Enterprise Cobol for z/OS を使用するメインフレームで、NODLL でコンパイルされた Cobol プログラムから Cobol Dyamic リンク ライブラリ (DLL) プログラムを動的に呼び出すことは可能ですか?
1 に答える
あなたが望むことをする方法はたくさんあります。
動的に呼び出すとは、データ定義変数を介して呼び出すことを意味する場合、バインダーはバインド時にターゲット関数を知る必要があるため、リンカー/バインダーでこれを行うことはできないと思います。
具体的dllload
には、DLL ロード モジュール、dllqueryfn
関数をそのように呼び出す必要があります。
リンカー/バインダーを使用するには、次の手順が必要だと思います (呼び出しを行う COBOL プログラムは、P1
呼び出されるプログラムです)。NODLL
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 プログラムに提供することは可能かもしれません。これは私がこれまでにビッグアイアンで行ったことを超えているので、実験する必要があります.
これらのページはどちらも、IBM 製品を使用しているすべての人が知っておくべき publib-boulder サイトからのものです (redbooks/redpapers サイトも同様です)。
私は、dllload/dllqueryfn
AIX やその他の UNIX で慣れ親しんでおり、最大限の柔軟性を提供しているように見えるので、このソリューションを好みます。