除了在DllMain中保存DLL的实例句柄,还有没有其它办法在Dll中获取自身DLL的实例句柄?解决办法
除了在DllMain中保存DLL的实例句柄,还有没有其它办法在Dll中获取自身DLL的实例句柄?
如题:
一个EXE加载了一个DLL。我想在DLL中动态的获取DLL本身的实例句柄.有没有什么方法?
我不想使用DllMain中保存全局句柄的方法。
------解决方案--------------------
inline static HMODULE GetCurrentModule(BOOL bRef)
{
HMODULE hModule = NULL;
if (GetModuleHandleEx(bRef ? GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS : (GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT), (LPCWSTR)GetCurrentModule, &hModule))
{
return hModule;
}
return NULL;
}
------解决方案--------------------
糟糕,有个小bug,PE文件的DOS头魔法字MZ后面不一定是9000
改进版
如题:
一个EXE加载了一个DLL。我想在DLL中动态的获取DLL本身的实例句柄.有没有什么方法?
我不想使用DllMain中保存全局句柄的方法。
------解决方案--------------------
inline static HMODULE GetCurrentModule(BOOL bRef)
{
HMODULE hModule = NULL;
if (GetModuleHandleEx(bRef ? GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS : (GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT), (LPCWSTR)GetCurrentModule, &hModule))
{
return hModule;
}
return NULL;
}
------解决方案--------------------
糟糕,有个小bug,PE文件的DOS头魔法字MZ后面不一定是9000
改进版
- C/C++ code
HANDLE handle = NULL ; try { __asm { lea eax,get_label and eax,0xFFFFF000 get_Label: sub eax,0x1000 cmp word ptr [eax],0x5A4D jne get_Label mov handle,eax } } catch (...) { } printf("0x%p\r\n", handle);