为什么 SetWindowsHookEx 采用 HINSTANCE 参数?

news2025/1/17 3:05:16

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

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

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

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

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

总结

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

最后

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1047289.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MATLAB 与 Cruise 的联合仿真

文章目录 检查matlab是否安装了编译器在 MATLAB 中添加路径联合仿真示例 检查matlab是否安装了编译器 第一步,先检查matlab是否安装了编译器: 关于编译器的配置,可以查看: https://blog.csdn.net/chengkai730/article/details/1…

FPGA的数字钟带校时闹钟报时功能VHDL

名称:基于FPGA的数字钟具有校时闹钟报时功能 软件:Quartus 语言:VHDL 要求: 1、计时功能:这是数字钟设计的基本功能,每秒钟更新一次,并且能在显示屏上显示当前的时间。 2、闹钟功能:如果当前的时间与闹钟设置的时…

echarts强制显示或不显示Y轴最大值最小值

echarts强制显示或不显示Y轴最大值最小值 axisLabel: {showMaxLabel: false,color: "rgba(230,247,255,0.5)", //刻度线标签颜色fontSize: 14,formatter: function (value) {console.log(value);if (value / 2 % 10 0) {return value;} else {return }}},

mysql超级聚合with rollup

超级聚合,是在group by的基础上,再次进行聚合。 它再次聚合的列,是select中没有用到聚合函数的列。 文章目录 例子1解释例子2表以及数据 例子1 mysql> SELECT year, country, product, SUM(profit) AS profitFROM salesGROUP BY year, c…

Dev C++安装与运行

参考: https://blog.csdn.net/Keven_11/article/details/126388791 https://www.cnblogs.com/-Wallace-/p/cpp-stl.html 2021年真题要求 2022年真题要求 河南省的考试环境 IDE环境 Dev C 安装 下载 安装 点击OK,选择我接受 修改安装路径为D盘d:\Program Fi…

6.1810: Operating System Engineering Lab: Xv6 and Unix utilities By:Haostart

前言 开学后要为一年后找实习做准备了,准备打一下基础,就做一下MIT-6.S081,是2022版的,地址如下 6.1810: Operating System Engineering Lab Lab 做实验前一定要清楚Xv6的系统调用有哪些!!! 做实验前一定要清楚Xv6的系统调用有哪些!!! 1. sleep 由于系统调用里已经有slee…

MySQL 开启配置binlog以及通过binlog恢复数据

目录 一、binlog日志基本概念二、开启binlog日志记录2.1、查看binlog日志记录启用状态2.2、开启配置binlog日志 三、制作测试数据(可以先不执行,这里是为后续数据恢复做准备,先看数据恢复流程)四、使用binlog日志恢复数据4.1、前置…

解决内网拉取企微会话存档代理问题的一种办法

问题:客户的服务都是内网的,不能直接访问外网;访问外网的话需要走kong网关才能出去。 会话存档官网说可以使用socket5、http方式拉取会话存档;我这边尝试了直接使用kong网关的ip和端口配置进去,是访问不了的 我后面就…

lazada、shopee卖家自养号测评的优势及环境搭建核心要点!

lazada、shopee卖家们都知道,流量对于店铺转化率具有非常重要的作用,要真正提升销售业绩和品牌知名度,仅仅依赖lazada、shopee内部的流量是不够的。这也就说明越来越多的卖家需要测评,用测评来提升产品的销量,留下好评…

MYSQL日志和事务原理

1)重做日志:在一个事务中会涉及到多个DML操作,修改的是在内存层面数据页中的数据,还没有及时的将修改之后的数据更新到磁盘中,真正的将更新后的数据写回到磁盘的时候才满足持久性,只是更新内存是不满足持久性的,如果只…

lv5 嵌入式开发-8 内存映射

目录 1 内存映射基本使用 1.1 内存映射概念 1.2 内存映射的使用 2 共享内存(古老的 System V IPC) 2.1 基本概念 2.2 共享内存使用步骤 2.3 共享内存使用 掌握:内存映射概念、内存映射使用、内存映射注意事项、了解SYSTEM V 共享内存概…

OV2640图像出现细小条纹问题

说明:条纹是随机生成的,有时候几根线,有时候10多根线 怀疑点: 1-走线,看网上说所有的时钟线和同步线不要交叉,不要太长没有验证 2-电源,1.2V和2.8的电源 刚开始以为是自己电路问题&#xff0c…

栈(Stack)和队列(Queue)

栈(Stack)和队列(Queue)都是常见的数据结构,用于存储和操作一组元素。 栈是一种后进先出(Last-In-First-Out,LIFO)的数据结构,类似于把元素堆在一起形成的一堆物体&…

PTA程序辅助实验平台——2023年软件设计综合实践_3(分支与循环)

第一题:7-1 印第安男孩 - C/C 分支与循环 朵拉编程的时候也想顺便练习英语。她编程从键盘读入一个整数n,如果n值为0或者1,向屏幕输出“0 indian boy.”或“1 indian boy.”;如果n大于1,比如9,则输出“9 in…

Ctfshow web入门 XSS篇 web316-web333 详细题解 全

CTFshow XSS web316 是反射型 XSS 法一&#xff1a; 利用现成平台 法二&#xff1a; 自己搭服务器 先在服务器上面放一个接受Cookie的文件。 文件内容&#xff1a; <?php$cookie $_GET[cookie];$time date(Y-m-d h:i:s, time());$log fopen("cookie.txt"…

SSM - Springboot - MyBatis-Plus 全栈体系(十四)

第三章 MyBatis 二、MyBatis 基本使用 1. 向 SQL 语句传参 1.1 mybatis 日志输出配置 mybatis配置文件设计标签和顶层结构如下&#xff1a; configuration&#xff08;配置&#xff09; properties&#xff08;属性&#xff09;settings&#xff08;设置&#xff09;typeAl…

7、SpringBoot_高级配置

一、配置高级 1.临时属性设置 1.1引出问题 如果目标电脑上8080端口已经使用&#xff0c;再次使用该端口会出现端口占用问题 解决方式 重新更换配置文件修改端口打包通过临时属性配置新端口更换配置文件 1.2添加临时属性配置 通过临时属性修改8080端口 java -jar 项目.jar…

zemax目镜调焦演示

目镜的焦距应当是可变的&#xff0c;就像我们使用显微镜时&#xff0c;可以通过旋转调节旋钮&#xff0c;使得图像变得清晰&#xff0c;目镜的焦距也可以调整&#xff0c;使得要被观察的像出现在合适的位置。 这样&#xff0c;不同的人都可以使用同一台仪器&#xff0c;不管近…

Spring5应用之AOP额外功能详解

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Spring5应用专栏_Aomsir的博客-CSDN博客 文章目录 前言MethodBefore…

Doris数据库FE——启动流程源码详细解析

Doris中FE主要负责接收和返回客户端请求、元数据以及集群管理、查询计划生成等工作。代码路径&#xff1a;doris/fe/fe-core/src/main/java/org/apache/doris/DorisFE.java 环境检查 在启动FE的时候&#xff0c;主要做环境检查。检查一些启动时必要的环境变量以及初始化配置…