z / OS上のDLL cobolプログラムからNODLL cobolプログラムを動的に呼び出す
-
05-07-2019 - |
質問
Enterprise Cobol for z / OSを使用するメインフレームで、NODLLでコンパイルされたcobolプログラムからCobol Dyamicリンクライブラリ(DLL)プログラムを動的に呼び出すことは可能ですか?
解決
必要なことを行う方法はいくつかあります。
動的に呼び出すことで、データ定義変数を介して呼び出すことを意味する場合、バインダーはバインド時にターゲット関数を知る必要があるため、リンカー/バインダーでこれを行うことはできないと思います。
DLLロードモジュールを具体的に dllload
、関数を 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製品を使用しているすべてのユーザーが(レッドブック/レッドペーパーサイトと同様に)知っている必要があります。
私は、 dllload / dllqueryfn
ソリューションを好みます。これは、AIXや他のUNIXで使用したものであり、最大限の柔軟性を提供しているようだからです。