GetModuleHandle ロードされているモジュールのハンドルを取得

Cの宣言:

HMODULE GetModuleHandle(LPCTSTR ModuleName);

説明:

現在呼び出し元プロセスにロードされているexeやdllのメモリ上の位置を示すアドレスを返す。従って、GetModuleHandleの返すハンドルはLoadLibrary関数で返されたハンドルと同様の扱いで、他のAPI関数に渡すことができる。

ただし、LoadLibraryがエントリポイントの呼び出し、ローカル記憶域の確保、参照カウントの増加などを行うのに対して、GetModuleHandleは純粋にハンドルを取得するのみである。従って、特別な意図がない限りFreeLibraryに渡してはならない。また、GetModuleHandleで取得したハンドルが将来に渡って有効とは限らない。別の個所でFreeLibraryが行われ、モジュールがアンマップされるかもしれないからである。

引数の意味は、以下の通り。
ModuleName ハンドルを取得するモジュールの名前。拡張子を省略した場合は、.DLLとみなされる。

戻り値は、モジュールのハンドルである。関数の実行に失敗した場合、NULLが返される。

Cのサンプル:

/* SystemディレクトリにあるDLLの内現在のプロセスがロードしているものを表示する */
void DispLoadedDLL()
{
	char SysDir[1000];
	WIN32_FIND_DATA fd;
	HANDLE hFind;
	HMODULE hModule;

	GetSystemDirectory(SysDir, 1000);
	lstrcat(SysDir, "\\*.dll");

	hFind = FindFirstFile(SysDir, &fd);
	for(;;) {
		hModule = GetModuleHandle(fd.cFileName);
		if(hModule) printf("%s\n", hModule, fd.cFileName);

		if(!FindNextFile(hFind, &fd)) break;
	}

	FindClose(hFind);
}

メモコード:

(with debug privilege...)
buf = RtlCreateQueryDebugBuffer(0, 0);
RtlQueryProcessDebugInformation(hProcess, 1, buf);
RtlDestroyQueryDebugBuffer(buf);

(original text:1998/12/25 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。