Windows 当可以使用u ImageBase或GetModuleHandleEx()检索HMODULE时,为什么框架要存储自己的HMODULE?

Windows 当可以使用u ImageBase或GetModuleHandleEx()检索HMODULE时,为什么框架要存储自己的HMODULE?,windows,winapi,dll,Windows,Winapi,Dll,询问如何检索包含当前执行代码的DLL句柄。在其中一个示例中,建议将\uuu ImageBase的地址作为模块句柄。这对我有用 我的问题是:既然检索当前模块的句柄非常简单,为什么像MFC这样的框架(甚至是我继承的代码库)通常将传递给DllMain()的实例句柄存储在某个全局变量中?是否有理由不依赖于\uu ImageBase 编辑:根据,\u ImageBase仅适用于Microsoft链接器。还有一种方法有更精确的答案,包括使用GetModuleHandleEx()的独立于链接器的方法。Win2

询问如何检索包含当前执行代码的DLL句柄。在其中一个示例中,建议将
\uuu ImageBase
的地址作为模块句柄。这对我有用

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


编辑:根据,
\u ImageBase
仅适用于Microsoft链接器。还有一种方法有更精确的答案,包括使用
GetModuleHandleEx()
的独立于链接器的方法。Win2000和更早版本还提供了一个使用
VirtualQuery()
的解决方案。问题仍然有效:为什么要在可以轻松检索的情况下保存基址?

\uuu ImageBase
是由提供的技巧,可能无法与其他编译器/链接器一起使用。即使框架不支持其他工具集,他们也可能不知道这个神奇的符号,这可能就是为什么它没有被广泛使用的原因


同样的事情也可以在纯WinAPI中通过
VirtualQuery
GetModuleHandleEx(从\u地址获取\u MODULE\u HANDLE\u EX\u FLAG\u…)完成。

谢谢。我的问题更多的是关于设计问题——存储值与“计算”值。ImageBase仍然存储在某处,可能在PE文件的重新定位部分。计算速度较慢,需要更多的代码。从外观上看,MFC比_ImageBase和GetModuleHandleEx都要早,这很容易解释。您的代码库也可能早于它们,或者原始程序员可能不知道它们。保存模块句柄是一个非常好的解决方案,因此任何人都没有理由去寻找其他选项。除非您需要将句柄传递给不知道其存储位置的函数。-历史背景也是一个很好的观点。