< メモリ リークの検出と特定 | クラスのメンバ変数をstatic, const, あるいはその両方で宣言する >

March 15, 2004

DLLよりコールした GetModuleFileName で取得されるパス

実行モジュールのパスを取得する方法として、GetModuleFileName関数がある。この関数の1つ目の引数 hModule にNULLを指定すると、VBで言うところの App.Path の代わりに使えますよ、とした情報は多い。しかし、MSDNをひいてみると

hModule
[入力]モジュールのハンドルを指定します。このモジュールを含む実行可能ファイルのパスが取得されます。NULL を指定すると、現在のプロセスを作成するために使われたファイルのパスを取得します。

つまり、NULLを指定したときに取得できるのは、プロセスを起動したモジュールのパスであることがわかる。注意すべきはDLLの場合で、プロセスにアタッチするため、DLLをロードした大元のEXEファイル、ということになる。

おまけ。DLLの呼び出しもとがIDEからデバッグ実行中のVBアプリだったりすると、VBのパス(VB6のばあいはVB6.EXEのパス)が取得されてしまう。当たり前なんだけど、デバッグしにくい。

トラックバック

このエントリーにトラックバック:
http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/257

コメント

はじめまして、お世話になります。
DLL内で使えるApp.Pathの様な関数を探しています。
探している課程でこのサイトを知りました。
DLL自身のパスをDLL内から取得する方法を
ご存じでしたらお教え下さい。
GetModuleFileNameでは、DLL自身のパスを
取得できなくて困っています。
よろしくお願い致します。

はじめまして。
私もかなり探したのですが。。。

MFC DLL であれば、
theApp.m_pszHelpFilePath
が、App.Pathと、Exenameの拡張子を"hlp"に変えたものになりますので、
代用できると思うのですが、通常のDLLの場合は、ちょっと方法を思いつきません。
もし、その方法を見つけられましたら、また教えてください。m(_ _)m

補足:
またちゃんと調査後にエントリーとして記述しますが・・・
DllMain の引数の hModule を GetModuleFileName に渡した場合は、ちゃんとDLL自身のパスが取得できるようです。


BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved )
{
TCHAR szModuleFileName[ _MAX_PATH + 1 ] = _T( "" );
::GetModuleFileName( (HMODULE)hModule, szModuleFileName, _MAX_PATH );
::MessageBox( NULL, szModuleFileName, _T( "ModuleFileName" ), MB_OK );
return TRUE;
}

早速のご返答ありがとうございました。
DllMain のhModule を使わさせて頂きます。
大変助かりました。m(_ _)m

こちらでもいろいろ調べてみましたところ、
GetModuleHandleを使えばうまく取得できました。
あまり美しくないですが...^^;
以下サンプルです。

HMODULE hModule;
char dllpath[MAX_PATH];
char modname[] = "HOGEHOGE.dll"; // DLL名

// DLL名からモジュールハンドルを取得
hModule = GetModuleHandle(modname);
// モジュールハンドルからDLLのフルパスを取得
GetModuleFileName(hModule, dllpath, sizeof(dllpath));
// 確認メッセージ
MessageBox(NULL,dllpath,"DLL Path",MB_OK);

なるほど、たしかに DLL の名前は自分でわかってるし、
呼び出しプロセスからパスが通ってればその方法は使えますね。
ただし、LoadLibrary する時に、パスの通っていない場所のDLLをフルパスで指定すると使えない気がします(^-^;)
あまりDLLの位置をハードコーディングすることはないとは思いますが・・・
# TrackBackにもあるとおり、この話題、新規エントリーに起こしました。

コメントする

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

name:
email:

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

url:
情報を保存する ?