< 伝統形式 の 関数宣言 | NetServerGetInfo で ローカルコンピュータ名を取得する >

April 9, 2004

Dll 側で、自モジュールのパスを取得する

DLLよりコールした GetModuleFileName で取得されるパスにもコメントをいただいたのですが、DLL 内で GetModuleFileName を、1つ目の引数 hModuleNULL を指定して呼び出すと、その 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

コメント

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?