我有一个静态库,可以链接到a .exe
或a .dll
.在运行时,我希望我的库函数可以获取HMODULE
静态库代码链接到的任何内容.
我目前使用以下技巧(灵感来自此论坛):
const HMODULE GetCurrentModule() { MEMORY_BASIC_INFORMATION mbi = {0}; ::VirtualQuery( GetCurrentModule, &mbi, sizeof(mbi) ); return reinterpret_cast(mbi.AllocationBase); }
有没有更好的方法来做这个看起来不那么hacky?
(注意:这样做的目的是加载一些我知道我的用户将与我的静态库同时链接的Win32资源.)
HMODULE GetCurrentModule() { // NB: XP+ solution! HMODULE hModule = NULL; GetModuleHandleEx( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)GetCurrentModule, &hModule); return hModule; }
__ImageBase
是链接器生成的符号,它是模块的DOS头(仅限MSVC).从那里你可以将其地址转换为HINSTANCE
或HMODULE
.所以它比通过API更方便.
所以你只需要这样做:
EXTERN_C IMAGE_DOS_HEADER __ImageBase; #define HINST_THISCOMPONENT ((HINSTANCE)&__ImageBase)
来自http://blogs.msdn.com/oldnewthing/archive/2004/10/25/247180.aspx