4

ここに私の問題があります。同じ DLL の 2 つの別個のインスタンスを作成したいと考えています。

以下は、Handle1 と Handle2 が同じアドレスを取得するため機能しません。

  Handle1 := LoadLibrary('mydll.dll');
  Handle2 := LoadLibrary('mydll.dll');

以下は機能しますが、DLL のコピーを作成し、別の名前に変更する必要があります (これは少しばかげているようです)。

  Handle1 := LoadLibrary('mydll.dll');
  Handle2 := LoadLibrary('mydll2.dll');

DLL ファイルは 1 つだけにして、その複数のインスタンスをロードする方法はありますか?

4

3 に答える 3

4

それは不可能だと思います。

dll をロードする .exe を作成する必要があります。次に、複数のプロセス (.exe) にまたがることができ、それぞれが dll の独自のインスタンスを実行します。.exe と通信するには、IPC (プロセス間通信) 手法を使用する必要があります。確かに実行可能ですが、まったく簡単ではありません。

于 2010-04-20T17:43:25.210 に答える
1

Windows は dll が既に読み込まれているかどうかをチェックし、同じハンドルを何度も返すため、LoadLibrary では機能しません。

実行可能ファイルにバインドされたリソースから dll をロードすることを意図したコードをいくつか取得しましたが、ファイルのコンテンツで満たされたメモリ領域に対しても同じことを行うことができると思います。2 回も機能しない理由はわかりませんが、テストしていません。

ここで見つけることができます: http://svn.berlios.de/viewvc/dzchart/utilities/dzLib/trunk/src/u_dzResourceDllLoader.pas?view=markup

これは、MPL で利用できる私のライブラリ dzlib の一部です。

于 2010-04-20T20:24:59.743 に答える
0

Windows XP では、Win32 DLL のサイド バイ サイド実行が導入されました (これらの人は、それについてよく知っています)。

多くのフープを使用して、次のことができるようになりました。

于 2010-04-20T19:59:44.157 に答える