为什么框架在使用__ImageBase或GetModuleHandleEx()检索时可以存储自己的HMODULE?

krl*_*mlr 2 windows dll winapi

此问题询问如何检索包含当前执行代码的DLL的句柄.其中一个答案中的链接建议将地址作为模块句柄.这适合我.__ImageBase

我的问题是:鉴于检索当前模块的句柄非常简单,为什么像MFC(甚至我继承的代码库)这样的框架通常会存储传递给DllMain()某个全局变量的实例句柄?有理由不依赖__ImageBase吗?

编辑:根据Raymond Chen的说法,__ImageBase仅适用于微软链接器.还有另一个问题有更精确的答案,包括使用链接器无关的方式GetModuleHandleEx().还有一个Win2000和早期使用的解决方案VirtualQuery().问题仍然有效:为什么在可以轻松检索基地址时保​​存它?

And*_*ers 6

__ImageBaseMicrosoft链接器提供的技巧,可能无法与其他编译器/链接器一起使用.即使框架不支持其他工具集,他们也可能不知道这个神奇的符号,这可能就是为什么它没有被大量使用.

同样的事情可以用纯的WinAPI用VirtualQuery或用GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,...)