HMODULE GetModuleHandle(LPCTSTR ModuleName);
ただし、LoadLibraryがエントリポイントの呼び出し、ローカル記憶域の確保、参照カウントの増加などを行うのに対して、GetModuleHandleは純粋にハンドルを取得するのみである。従って、特別な意図がない限りFreeLibraryに渡してはならない。また、GetModuleHandleで取得したハンドルが将来に渡って有効とは限らない。別の個所でFreeLibraryが行われ、モジュールがアンマップされるかもしれないからである。
引数の意味は、以下の通り。
| ModuleName | ハンドルを取得するモジュールの名前。拡張子を省略した場合は、.DLLとみなされる。 |
戻り値は、モジュールのハンドルである。関数の実行に失敗した場合、NULLが返される。
/* 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);