我有一个静态库,可以链接到a .exe
或a .dll
.在运行时,我希望我的库函数可以获取HMODULE
静态库代码链接到的任何内容.
我目前使用以下技巧(灵感来自此论坛):
const HMODULE GetCurrentModule()
{
MEMORY_BASIC_INFORMATION mbi = {0};
::VirtualQuery( GetCurrentModule, &mbi, sizeof(mbi) );
return reinterpret_cast<HMODULE>(mbi.AllocationBase);
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来做这个看起来不那么hacky?
(注意:这样做的目的是加载一些我知道我的用户将与我的静态库同时链接的Win32资源.)
Ser*_*ier 52
HMODULE GetCurrentModule()
{ // NB: XP+ solution!
HMODULE hModule = NULL;
GetModuleHandleEx(
GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
(LPCTSTR)GetCurrentModule,
&hModule);
return hModule;
}
Run Code Online (Sandbox Code Playgroud)
MSN*_*MSN 29
__ImageBase
是链接器生成的符号,它是模块的DOS头(仅限MSVC).从那里你可以将其地址转换为HINSTANCE
或HMODULE
.所以它比通过API更方便.
所以你只需要这样做:
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
#define HINST_THISCOMPONENT ((HINSTANCE)&__ImageBase)
Run Code Online (Sandbox Code Playgroud)
来自http://blogs.msdn.com/oldnewthing/archive/2004/10/25/247180.aspx
我会考虑GetModuleHandleEx()
使用 flag GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
。看起来您可以更改GetCurrentModule()
为调用此例程而不是VirtualQuery()
,并将 的地址GetCurrentModule()
作为lpModuleName
参数传递。
预计到达时间:
const HMODULE GetCurrentModule()
{
DWORD flags = GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS;
HMODULE hm = 0;
::GetModuleHandleEx( flags, reinterpret_cast<LPCTSTR>( GetCurrentModule ), &hm );
return hm;
}
Run Code Online (Sandbox Code Playgroud)
我没有尝试过,但我想这会达到你想要的效果。