为什么框架要存储自己的 HMODULE,而可以使用 __ImageBase 或 GetModuleHandleEx() 检索它?
这个问题询问如何检索包含当前执行代码的DLL的句柄。 链接位于其中一个 answers建议将__ImageBase
的地址作为模块句柄。这对我有用。
我的问题是:鉴于检索当前模块的句柄是如此简单,为什么像 MFC 这样的框架(甚至我继承的代码库)通常将传递给 DllMain()
的实例句柄存储在一些全局变量?有理由不依赖__ImageBase
吗?
编辑:根据Raymond Chen , __ImageBase
仅适用于 Microsoft 链接器。还有另一个问题有更精确的答案,包括使用GetModuleHandleEx()。对于 Win2000 及更早版本,还有一个使用
VirtualQuery()
的解决方案。问题仍然存在:当可以轻松检索基地址时,为什么要保存基地址?
This question asks how to retrieve the handle of the DLL that contains the currently executed code. A link in one of the answers suggests taking the address of __ImageBase
as module handle. This works for me.
My question is: Given that it is so astonishingly simple to retrieve the current module's handle, why do frameworks like MFC (and even the code base I inherited) usually store the instance handle passed to DllMain()
in some global variable? Is there a reason not to rely on __ImageBase
?
Edit: According to Raymond Chen, __ImageBase
is for Microsoft linkers only. There is another question that has more precise answers, including a linker-independent way using GetModuleHandleEx()
. There is also a solution for Win2000 and earlier using VirtualQuery()
. The question remains valid: Why saving the base address when it can be retrieved easily?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
__ImageBase
是 Microsoft 链接器<提供的一个技巧< /a> 并且可能无法与其他编译器/链接器一起使用。即使该框架不支持其他工具集,他们也可能不知道这个神奇的符号,因此这可能就是它不被大量使用的原因。可以在纯 WinAPI 中使用
VirtualQuery
或GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,...)
完成同样的操作__ImageBase
is a trick provided by the Microsoft linker and might not work with other compilers/linkers. Even if the framework does not support other toolsets they might not know about this magic symbol so that is probably why it is not used much.The same thing can be done in pure WinAPI with
VirtualQuery
orGetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,...)