2011-07-15 14 views
1

他のアプリケーション用のDLLを作成して、アプリケーションの一部の機能をロードして使用します。 DLLは、ロード元の実際のパスに依存します。Windowsプロセス(XP/Windows 7)でロードされたDLLへの実際のパスを見つけるには

<product_home>/bin/<DLL is here> 
       | 
       |----/configdir/configfile 
       |----/lib/<java jarfiles> 

それは

私のWindowsアプリケーションproloads特殊なDLLのconfigファイルとロードjarファイルなどを読み取ることproduct_homeの場所を必要とします。私はプロセス内でロードされたDLLへの実際のパスを見つけ、それを使って "HOME"変数を設定する必要があります。これは残りの処理で使用されます。外部的に設定された環境変数を使用すると、マシンに複数のバージョンのdllが存在すると失敗することがあります。私には、実際にロードされた場所を取得できる限り、DLLが独自の "product_home"を把握できるように見えます。

DLLこの記事Get Your DLL's Path/Nameは、このような方法を提供しています(まだ正常に実行されていますが、生成されたexeファイルはクラッシュします)。これは正しいアプローチですか?

答えて

5

私はあなたの必要性を理解していないか、言及したリンクが必要なものではありません。私があなたを正しく理解していれば、プロセスによってロードされた特定のDLLの完全なパスを取得したいと考えています。だから、DLLは "kernel32.dll"で、 "c:\ windows \ system32 \ kernel32.dll"を取得したいとします。私が間違っているなら、私を修正してください。

それはあなたが望むなら、そのための最も簡単な方法は、次のようになります。簡潔にするために省略

HMODULE hModule = GetModuleHandle(_T("kernel32.dll")); 
TCHAR dllPath[_MAX_PATH]; 
GetModuleFileName(hModule, dllPath, _MAX_PATH); 

障害チェック - GetModuleHandleGetModuleFileNameについての詳細を読みます。

+0

はい、私が質問を読む方法は、これは正解です。ハードコードされた名前文字列で 'GetModuleHandle'を呼び出すのはかなり役に立たないようです。 DLLに 'HMODULE'または' HINSTANCE'を既に持っていて、あなたがそのパスを探したいと思っているのははるかに意味があります。 –

+0

質問を改善していただきありがとうございます。 – Jayan

+0

@Codyあなたが知っている名前のDLLへの暗黙的なリンクを使用していた場合、名前部分だけを持つGetModuleHandle(つまりパスがない)を呼び出すことはまさにあなたが行うことです。 –

関連する問題