z / OS上のDLL cobolプログラムからNODLL cobolプログラムを動的に呼び出す

StackOverflow https://stackoverflow.com/questions/623604

質問

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で使用したものであり、最大限の柔軟性を提供しているようだからです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top