2009-03-08 19 views

答えて

2

あなたが望むことを実行するにはいくつかの方法があります。

バインディング時にバインド時にターゲット関数を知っている必要があるので、データ定義変数を使って動的呼び出しを行うと、リンカー/バインダーでこれを行うことはできません。

具体的にはdllloadのDLLロードモジュールであるdllqueryfnの関数を呼び出して、そのように呼び出す必要があります。

リンカ/バインダーを使用するには、私は(P2が呼び出されてDLLプログラムであり、P1は、呼び出しを行うNODLL COBOLプログラムである)は、次の手順が必要とされていると信じて:

  • P2をコンパイルしてバインドする必要がありますDLLオプションを使用してください。
  • P1は、NODYNAMでコンパイルし、DLLでバインドする必要があります。
  • P1は、CALL 'dll-func'(リテラルコールのみ)を含める必要があります。
  • P1をバインドする場合、SYSLIBは最初にP2の場所を指す必要があります。

これは、バインダーが正確にDLLを呼び出すことはありませんが、私はdllload/dllqueryfnソリューションよりも、他の周りにどのような方法はないと思う単一のロードモジュールにP1P2の両方を組み込むことになります。

私は以前のスタイルのdll関数を使用しましたが、十分なレベルであれば、より新しいdlopen/dlsym Cヘルパー関数もあります。

This pageは、NODLL/DLLプログラムが1つのロードモジュールにバインドされている場合にのみ、互いに呼び出すことができるという主張をサポートしています。しかし静的な呼び出しを使用する必要があります。

This pageは、呼び出しプログラムと同じロードモジュールにDLLプログラムを置き、静的呼び出しを使用して取得できる別のオプションを提供します。 DLLプログラムは他のDLLプログラムを呼び出すことができますロードモジュールです。したがって、ロードモジュールにないDLL関数を動的に呼び出すことができる静的ゲートウェイ機能をDLLプログラムに提供することは可能かもしれません。これは私が今まで大鉄でやったことのなかの何ものでもないので、実験しなければなりません。

どちらもそれらのページには、IBM製品を使用して誰もは(レッドブック/ redpapersサイトと一緒にも)知っておくべきpublibボールダーのサイトからです。

私は、これが私がAIXや他のUNIXから慣れてきたことから、dllload/dllqueryfnのソリューションを好んでおり、最大の柔軟性を提供するようです。

+0

@Pax:ありがとうございました。 +1と緑色のマーク。 –

関連する問題