ウィンドウハンドルから実行ファイル名を取得する

前書き

昨日書いたのですが、間違って消してしまったのでもう一度投稿します。
ソースは残っているのですが、そのほかに何を書いたのかは忘れました。
グーグルキャッシュにも残ってなかった。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を使いましょう。