12

Lib.dll などの同じ dll を複数回ロードしたい!

-> LoadLibrary ごとに新しいプロセス (CreateProcess 関数) を作成する必要があります。

誰にも例やヒントがありますか?!

Thxと挨拶

4

3 に答える 3

23

DLL の各インスタンスに個別のデータ セグメントを持たせたいようです。それが私が質問について考えることができる唯一の理由です。

これを実現する唯一の方法は、 を呼び出すたびLoadLibraryに DLL のファイル名が異なるようにすることです。DLL をロードする必要があるたびに、一時ファイルに DLL をコピーし、使用する名前がロードされた DLL のインスタンスとは異なることを確認してください。

システム アーキテクチャの再設計を奨励する上記のコメントに同意します。

于 2012-09-21T15:34:09.903 に答える
7

同じ DLL を 1 つのプロセスに複数回ロードすることはできません (またはロードせず、何の効果もありません)。

あなたのコメントから、DLL は関数呼び出しの 1 つに応じて異なることを行うため、それぞれに個別のデータ セットを保持し、必要に応じて (別の呼び出しを介して) それらを作成し、ハンドルを渡す「セッション」システムを使用する必要があります。または各関数呼び出しに似ています。これは、ほとんどの Win32 API の動作方法です (ファイル ハンドル、ウィンドウ ハンドル、GDI オブジェクトなど)。

DLL を COM ホストにして COM オブジェクトを使用すると、これは各クラス インスタンスによって自動的に処理されます。

別のプロセスを使用したい場合は、DLL をホストするためだけに新しいプロセスを起動し、さまざまな形式の IPC のいずれかを使用して通信することで、それを行うことができます。

于 2012-09-21T12:06:03.923 に答える
1

DLL をオブジェクト インスタンスのように扱っています。これは、DLL の動作とはまったく異なります。DLL はオブジェクトではなく、コードとリソースの集まりです。これらのことは、理論的には DLL を何回ロードできたとしても変わりません。したがって、DLL の複数のインスタンスを同じプロセスにロードしても意味がありません。

これは、グローバル変数がよくない考えである理由の良い例です。データは、必要に応じてインスタンス化できる必要があります。

したがって、操作するオブジェクトの複数のインスタンスが必要な場合は、正確にそれを行うように DLL を設計する必要があります。他の人が言ったように、ある種のセッション、またはいつでもインスタンス化できるオブジェクトだけです。

これは、抽象的な質問に対する抽象的な回答です。この DLL が正確に何をするのか、なぜ複数のインスタンスが必要なのかについて詳しく説明できれば、大いに役立ちます。

于 2012-09-21T16:24:42.427 に答える