ウィンドウハンドルから実行ファイル名を取得する
前書き
昨日書いたのですが、間違って消してしまったのでもう一度投稿します。
ソースは残っているのですが、そのほかに何を書いたのかは忘れました。
グーグルキャッシュにも残ってなかった。IEのキャッシュも更新しちゃった。
なので書き直します。
ソース
// // ウィンドウハンドルから、実行ファイル名を調べる。 // destのサイズが足りなくてもエラーにはならない。 // inline bool GetExeFileName( // 戻り値: 成功 true HWND hWnd, // 対象のHWND TCHAR *dest, // ファイル名の出力先(サイズはMAX_PATH+1を推奨) size_t size_including_null) // destのサイズ(NULLを含む) { // プロセスID DWORD processID = NULL; GetWindowThreadProcessId( hWnd, &processID); // プロセスハンドル HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID); if(!hProcess) return false; // モジュールハンドル HMODULE hModule = NULL; DWORD dummy = 0; if(!EnumProcessModules( hProcess, &hModule, sizeof(HMODULE), &dummy)) return false; // ファイル名(フルパス) memset( dest, 0, size_including_null); if(!GetModuleFileNameEx( hProcess, hModule, dest, size_including_null)) return false; CloseHandle( hProcess); // hModuleは自分で閉じちゃいけない return true; }
注意
- EnumProcessModulesは内部でスナップショットがどうのこうのなので、hModuleはCloseHandleしてはいけません。
- 自分以外のプロセスに対してGetModuleFileNameは使えません。GetModuleFileNameExを使いましょう。