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

时间:2012-02-21 02:36:15

标签: windows winapi dll

This question询问如何检索包含当前执行代码的DLL句柄。其中一个A link中的answers建议将__ImageBase的地址作为模块句柄。这对我有用。

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

修改:根据Raymond Chen__ImageBase仅适用于Microsoft链接器。 another question有更精确的答案,包括使用GetModuleHandleEx()的独立于链接器的方式。 Win2000和更早版本的解决方案还使用VirtualQuery()。问题仍然有效:为什么在可以轻松检索基地址时保​​存基地址?

1 个答案:

答案 0 :(得分:6)

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

使用VirtualQueryGetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,...)

在纯WinAPI中可以做同样的事情