2009-04-23 5 views
1

私は、LoadLibrary()を使用して動的にロードする必要があり、__cdecl呼び出し規約を使用するサードパーティのDLLを持っています。 VB6からdllを使用できるようにする必要があるので、__stdcall呼び出し規約を使用し、必要な関数をエクスポートする独自のラッパーDLLを作成しました。サードパーティのDLLをラップする

追加の要件が今すぐに到着しました。管理方法を確認するのに苦労しています。ラップされたDLLは別のアプリケーションにAPIを提供し、アプリケーションの2つのインスタンスに同時に接続する必要があります。

tpc_connect("service1") 
// Do some stuff 
tpc_disconnect() 

をし、私が行うことができるために必要なもの

session1 = tpc_connect("service1") 
session2 = tpc_connect("service2") 
// Do some stuff with session1 
// Do some stuff with session2 
tpc_disconnect(session1) 
tpc_disconnect(session2) 

主な問題としてある:DLLは、セッションの概念がないので、これは問題である、典型的な相互作用は次のように希望します1つのプロセスが1つのサービスにしか接続できないことがわかったので、私が試みた最初の解決策は、ATLを使用してOut-of-Process COMサーバーを作成してDLLラッパーを別のプロセスに移動することでした。私が今問題となっているのは、COMサーバーのインスタンスが1つしかないということです。

私の質問(最終的には)は、ATL COMサーバーの新しいインスタンスを強制的に作成する方法ですか?これは問題への最善のアプローチですか、誰かがこれに取り組むためのより良い方法を考えることができますか?

おかげジャクソン

答えて

5

-don

私はあなたのCOMサーバーのアイデアをダンプし、元のDLLのコピーと一緒に行くことを示唆しています。私は、スレッドセーフではなく、複数のインスタンスをサポートしないライブラリの複数のインスタンスを取得するために、このアプローチを自分で使用しました。

ファイルが異なるため、Windowsはそれらをすべて別々のアドレススペースにロードして、それらを別々に保持します。

これは私がやったことです:

  • は、ライブラリのインスタンスを作成し、破壊するためにラッパーに機能を追加します。

  • 他のすべての関数を変更して、使用しているライブラリのインスタンスへのポインタを取得します。

  • インスタンス作成関数では、最初に、ランダムファイル名(つまりCreateHardLinkを使用)を使用して元のDLLへのハードリンクを作成します。それが失敗した場合は、ランダムな名前を使用してDLLの真のコピーを作成します。あなたがしたくない場合は、DLLエクステンションを使う必要はありません。そのDLLと関数ポインタのコピーを動的にロードし、内部構造体へのポインタを返します。

  • destroy関数では、DLLをアンロードして削除するだけです。

  • テンポラリディレクトリからDLLをロードする際にVistaに制限があるかどうかわかりませんが、クラッシュ時に削除できることが明らかになるように一時ディレクトリにコピーを作成することをお勧めします。

これはすべて私にとって完璧に機能します。

+0

ラッパーの実装が完了しました - コピーの代わりにCreateHardLinkを使用しましたが、私にとってはうまくいきませんでした。そのため、最後にDLLの完全コピーが付属していました。 – Jackson

+0

CreateHardLinkは、NTFSドライブでターゲットがソースと同じパーティションにある場合にのみ機能します。私のラッパーでは、まずCreateHardLinkを試してみます。これはファイルコピーを避け、高速になりますが、失敗した場合は実際のコピーを行います。あなたを助けてくれてうれしいです。 – brofield

1

あなたが唯一の2つのセッションが必要な場合は、元のDLLのコピーを作成し、他の何かそれに名前を付けることができるかもしれません。彼らはあなたのラッパーdllで2つの別々の呼び出し(各dllのために1つ)をエクスポートします。 あなたが持っていると思います:

session1 = tcp_connect("whatever")  'this points to dll1.dll 
session2 = tcp_connect2("whatever")  'this points to a copy of dll1 called dll2.dll 

を、これは他のアプリケーションの仕様に応じて動作する可能性があります。とにかくショットに値する。

関連する問題