Dll 側で、自モジュールのパスを取得する
DLLよりコールした GetModuleFileName で取得されるパスにもコメントをいただいたのですが、DLL 内で GetModuleFileName
を、1つ目の引数 hModule に NULL
を指定して呼び出すと、その DLL をロードしたプロセスの実行ファイルのパスが取得されてしまいます。ほんで結局、DLL 側で、自分自身のパスを知る方法はないの?って話です。
コメントをいただいたときは、「MFC の DLL なら、theApp.m_pszHelpFilePath
の拡張子を"exe"に替えれば・・・」と、とぼけた答えを返してしまったのですが、ふと思いついて、DllMain
の宣言を見ると、引数に HANDLE hModule
というのがあるではありませんか。それを渡して GetModuleFileName
してみました。
BOOL APIENTRY DllMain (HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { TCHAR szModuleFileName [_MAX_PATH] = _T (""); GetModuleFileName ((HMODULE) hModule, szModuleFileName, _MAX_PATH); MessageBox (NULL, szModuleFileName, _T ("ModuleFileName"), MB_OK); return TRUE; }
結果はきちんと、DLL 自身のパスが表示されました。あとで、MSDN ライブラリの DllMain をみると、ちゃんと書いてありました。
DLL モジュールのハンドルを指定します。この値は、DLL のベースアドレスです。DLL の HINSTANCE は、DLL の HMODULE と同じことを意味します。(これらは混同されていることがあります。詳細については Knowledge Base の Q81496 の「Dealing with hModule and hInstance」を参照してください。MSDN ライブラリの[検索]タブでも Q81496 を参照できます。)。したがって、モジュールハンドルを必要とする GetModuleFileName 関数などを呼び出す際に、hinstDLL パラメータで指定した値を使うことができます。
ちゃんと読めよ、ということかしら・・・
トラックバック
- このエントリーにトラックバック:
- http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/312
コメント