當前模塊的句柄在程序進入點可以獲得,一般做法是保存為一個全局變量,以後使用這個全局變量即可。但有時在寫一些比較通用的代碼時剛好要用到模塊句柄,如果還去訪問這個全局變量就破壞了代碼的通用性。
下面函數可以取得當前模塊的句柄,無須保存,隨調隨得:
/*
通過一個地址取模塊句柄
*/
inline HMODULE ModuleHandleByAddr(const void* ptrAddr)
{
MEMORY_BASIC_INFORMATION info;
::VirtualQuery(ptrAddr, &info, sizeof(info));
return (HMODULE)info.AllocationBase;
}
/*
當前模塊句柄
*/
inline HMODULE ThisModuleHandle()
{
static HMODULE sInstance = ModuleHandleByAddr((void*)&ThisModuleHandle);
return sInstance;
}