为什么框架要存储自己的 HMODULE,而可以使用 __ImageBase 或 GetModuleHandleEx() 检索它?

发布于 2025-01-07 07:42:37 字数 826 浏览 0 评论 0原文

这个问题询问如何检索包含当前执行代码的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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

慈悲佛祖 2025-01-14 07:42:37

__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 or GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,...)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文