This question询问如何检索包含当前执行代码的 DLL 的句柄。 A link在其中一个 answers建议取 __ImageBase
的地址作为模块句柄。这对我有用。
我的问题是:鉴于检索当前模块的句柄如此简单,为什么像 MFC 这样的框架(甚至我继承的代码库)通常存储传递给 DllMain()
的实例句柄?在一些全局变量中?有没有理由不依赖 __ImageBase
?
编辑:根据Raymond Chen , __ImageBase
仅适用于 Microsoft 链接器。有 another question有更精确的答案,包括使用 GetModuleHandleEx()
的独立于链接器的方式.对于 Win2000 和更早版本,还有一个使用 VirtualQuery()
的解决方案.问题仍然有效:既然可以轻松检索基地址,为什么还要保存基地址?
最佳答案
__ImageBase
是 Microsoft linker 提供的技巧并且可能不适用于其他编译器/链接器。即使该框架不支持其他工具集,他们也可能不知道这个魔法符号,所以这可能就是它使用不多的原因。
同样的事情可以在纯 WinAPI 中使用 VirtualQuery
或 GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,...)
关于windows - 当可以使用 __ImageBase 或 GetModuleHandleEx() 检索时,为什么框架存储自己的 HMODULE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9371376/