我有一个静态库,可以链接到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资源.)
此问题询问如何检索包含当前执行代码的DLL的句柄.其中一个答案中的链接建议将地址作为模块句柄.这适合我.__ImageBase
我的问题是:鉴于检索当前模块的句柄非常简单,为什么像MFC(甚至我继承的代码库)这样的框架通常会存储传递给DllMain()某个全局变量的实例句柄?有理由不依赖__ImageBase吗?
编辑:根据Raymond Chen的说法,__ImageBase仅适用于微软链接器.还有另一个问题有更精确的答案,包括使用链接器无关的方式GetModuleHandleEx().还有一个Win2000和早期使用的解决方案VirtualQuery().问题仍然有效:为什么在可以轻松检索基地址时保存它?