当前位置:首页 >休闲 >为什么 SetWindowsHookEx 采用 HINSTANCE 参数? 它不是采用E参这样工作的

为什么 SetWindowsHookEx 采用 HINSTANCE 参数? 它不是采用E参这样工作的

2024-05-29 02:24:15 [百科] 来源:避面尹邢网

为什么 SetWindowsHookEx 采用 HINSTANCE 参数?

作者:漫漫开发路 系统 Windows 即使到了 32 位 Windows,采用E参窗口管理器需要实例句柄才能将函数指针转换回 RVA,采用E参以便在将模块加载到另一个进程时可以找到函数。采用E参 有开发者问了这样一个问题:既然 SetWindowsHookEx 的采用E参第一个参数总是会被转换为一个文件名,那为什么它的采用E参传参类型是 HINSTANCE 呢?这岂不是多此一举?

原因是这样的:在 16 位 Windows 系统上,它不是采用E参这样工作的。16 位 Windows 上根本就没有 “钩子注入” 的采用E参概念。
所有 16 位 Windows 应用程序都是采用E参运行在同一个地址空间,所以就没有必要将代码注入到其他程序中。采用E参所以,采用E参就没有必要将实例句柄转换为一个文件名来注入代码。采用E参
实际的采用E参工作原理是这样的:实例句柄将会被用来增加引用计数,从而钩子函数就不会被意外释放掉。采用E参当钩子被卸载的采用E参时候,模块的采用E参引用计数会自动减一。

即使到了 32 位 Windows,窗口管理器需要实例句柄才能将函数指针转换回 RVA,以便在将模块加载到另一个进程时可以找到函数。

为什么 SetWindowsHookEx 采用 HINSTANCE 参数? 它不是采用E参这样工作的

如果你传递了带有模块路径的 LPCWSTR,则窗口管理器无论如何都必须执行 GetModuleHandle 来恢复实例句柄。

为什么 SetWindowsHookEx 采用 HINSTANCE 参数? 它不是采用E参这样工作的

由于大多数程序的实例句柄都随时可用,因此这是更自然的选择。(更不用说它将保持与 16 位 Windows 的源代码兼容性,这是试图让人们有兴趣将他们的代码移植到 Win32 时的一个重要标准。)

为什么 SetWindowsHookEx 采用 HINSTANCE 参数? 它不是采用E参这样工作的

总结

做 Windows 世界的良好公民,不要随意使用钩子。
除非迫不得已。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Why does SetWindowsHookEx take an HINSTANCE parameter?》

责任编辑:武晓燕 来源: 今日头条 WindowsRVA函数

(责任编辑:娱乐)

    推荐文章
    热点阅读