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

标签 windows winapi dll

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

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

编辑:根据Raymond Chen , __ImageBase仅适用于 Microsoft 链接器。有 another question有更精确的答案,包括使用 GetModuleHandleEx() 的独立于链接器的方式.对于 Win2000 和更早版本,还有一个使用 VirtualQuery() 的解决方案.问题仍然有效:既然可以轻松检索基地址,为什么还要保存基地址?

最佳答案

__ImageBaseMicrosoft linker 提供的技巧并且可能不适用于其他编译器/链接器。即使该框架不支持其他工具集,他们也可能不知道这个魔法符号,所以这可能就是它使用不多的原因。

同样的事情可以在纯 WinAPI 中使用 VirtualQueryGetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,...)

关于windows - 当可以使用 __ImageBase 或 GetModuleHandleEx() 检索时,为什么框架存储自己的 HMODULE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9371376/

相关文章:

python - 安装3.5后如何从win7 powershell启动python 2.7?

Ruby,Windows 剪贴板错误?

c++ - 为什么 LoadString 从资源中返回连接的字符串?

c - NtQuerySystemInformation - 内存泄漏

c# - C++ dll 将 utf8 作为 const char* 发送,c# 需要做什么……什么?

c++ - Windows 中套接字发送缓冲区的大小是多少?

windows - MS Visual Studio 2012 可以与 Windows Vista 一起使用吗?

delphi - 如何使用WinSpool API设置纸张尺寸?

C++ DLL 只读取 safearray 中包含的字符串的第一个字符

c++ - 使用制造商的 DLL 使用 C++ 通过 USB 控制步进 Controller