为什么 SetWindowsHookEx 采用 HINSTANCE 参数?

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

有开发者问了这样一个问题:既然 SetWindowsHookEx 的第一个参数总是会被转换为一个文件名,那为什么它的传参类型是 HINSTANCE 呢?这岂不是多此一举?

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

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

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

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

总结

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

责任编辑:武晓燕 来源: 今日头条
相关推荐

2023-06-26 07:31:29

中文编程编码

2019-12-30 08:34:40

ZabbixPrometheus监控

2015-08-27 16:48:11

FirefoxChrome

2021-07-15 10:17:24

混合云云计算云迁移

2022-04-02 09:32:06

大数据数据智能企业

2020-04-14 10:09:22

混合云公共云云计算

2022-10-28 10:01:43

云应用云计算

2018-05-31 21:50:12

云计算银行安全

2023-10-09 08:24:54

IPC机制Binder

2012-12-16 15:26:49

超级计算机LinuxHPC

2020-08-23 18:08:29

JavaScript命名参数位置参数

2021-03-05 13:02:31

物联网IoT

2021-03-23 09:00:00

比特币加密货币安全

2020-11-12 18:13:21

办公

2018-03-30 11:00:05

混合云云计算公共云

2022-03-28 11:51:00

深度学习机器学习模型

2021-09-15 09:39:56

公共云云迁移云端

2019-11-26 14:30:11

5G网络技术

2018-08-16 15:30:54

Java代码编程语言

2023-04-14 14:51:24

云计算云优先IT
点赞
收藏

51CTO技术栈公众号