This question询问如何检索包含当前执行代码的DLL句柄。其中一个A link中的answers建议将__ImageBase
的地址作为模块句柄。这对我有用。
我的问题是:鉴于检索当前模块的句柄非常简单,为什么像MFC这样的框架(甚至我继承的代码库)通常会存储传递给DllMain()
的实例句柄。变量?是否有理由不依赖__ImageBase
?
修改:根据Raymond Chen,__ImageBase
仅适用于Microsoft链接器。 another question有更精确的答案,包括使用GetModuleHandleEx()
的独立于链接器的方式。 Win2000和更早版本的解决方案还使用VirtualQuery()
。问题仍然有效:为什么在可以轻松检索基地址时保存基地址?
答案 0 :(得分:6)
__ImageBase
是Microsoft linker提供的技巧,可能无法与其他编译器/链接器一起使用。即使框架不支持其他工具集,他们也可能不知道这个神奇的符号,这可能就是为什么它没有被大量使用。
使用VirtualQuery
或GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,...)