什么是句柄?为什么会有句柄?HANDLE

本文详细介绍了句柄在Windows系统中的概念、用途及实现方式,解释了句柄如何作为索引间接代表内核对象,以及句柄与其他关键概念如进程ID、HINSTANCE的关系。重点阐述了句柄在内存管理、进程间通信中的作用。

从广义上,能够从一个数值拎起一大堆数据的东西都可以叫做句柄。句柄的英文是"Handle",本义就是"柄",只是在计算机科学中,被特别地翻译成"句柄",其实还是个"柄"。从一个小东西拎起一大堆东西,这难道不像是个"柄"吗?

然后,指针其实也是一种"句柄",只是由于指针同时拥有更特殊的含义——实实在在地对应内存里地一个地址——所以,通常不把指针说成是"句柄"。但指针也有着能从一个32位的值引用到一大堆数据的作用,这不是句柄又是什么?

Windows系统中有许多内核对象(这里的对象不完全等价于"面向对象程序设计"一词中的"对象",虽然实质上还真差不多),比如打开的文件,创建的线程,程序的窗口,等等。这些重要的对象肯定不是4个字节或者8个字节足以完全描述的,他们拥有大量的属性。为了保存这样一个"对象"的状态,往往需要上百甚至上千字节的内存空间,那么怎么在程序间或程序内部的子过程(函数)之间传递这些数据呢?拖着这成百上千的字节拷贝来拷贝去吗?显然会浪费效率。那么怎么办?当然传递这些对象的首地址是一个办法,但这至少有两个缺点:

  1. 暴露了内核对象本身,使得程序(而不是操作系统内核)也可以任意地修改对象地内部状态(首地址都知道了,还有什么不能改的?),这显然是操作系统内核所不允许的;
  2. 操作系统有定期整理内存的责任,如果一些内存整理过一次后,对象被搬走了怎么办?

所以,Windows操作系统就采用进一步的间接:在进程的地址空间中设一张表,表里头专门保存一些编号和由这个编号对应一个地址,而由那个地址去引用实际的对象,这个编号跟那个地址在数值上没有任何规律性的联系,纯粹是个映射而已。

在Windows系统中,这个编号就叫做"句柄"。

Handle在Windows中的含义很广泛,以下关于谈到的Handle除非特别说明,将仅限于进程、线程的上下文中。

1、先来谈谈Handle

Handle本身是一个32位的无符号整数,它用来代表一个内核对象。它并不指向实际的内核对象,用户模式下的程序永远不可能获得一个内核对象的实际地址(一般情况下)。那么Handle的意义何在?它实际上是作为一个索引在一个表中查找对应的内核对象的实际地址。那么这个表在哪里呢?每个进程都有这样的一个表,叫句柄表。该表的第一项就是进程自己的句柄,这也是为什么你调用GetCurrentProcess()总是返回0x7FFFFFFF原因。

简单地说,Handle就是一种用来"间接"代表一个内核对象的整数值。你可以在程序中使用handle来代表你想要操作的内核对象。这里的内核对象包括:事件(Event)、线程、进程、Mutex等等。我们最常见的就是文件句柄(file handle)。

另外要注意的是,Handle仅在其所属的进程中才有意义。将一个进程拥有的handle传给另一个进程没有任何意义,如果非要这么做,则需要使用DuplicateHandle(),在多个进程间传递Handle是另外一个话题了,与这里要讨论的无关。

2、进程ID

首先,进程ID是一个32位无符号整数,每个进程都有这样的一个ID,并且该ID在系统范围内是唯一的。系统使用该ID来唯一确定一个进程。

深入些说,系统可能使用进程ID来计算代表该进程的内核对象的基地址(及EPROCESS结构的基地址),具体的计算公式你可以去问微软的OS开发人员。

3、HINSTANCE

HINSTANCE也是一个32无符号整数,它表示程序加载到内存中的基地址。

转载自什么是句柄?为什么会有句柄?HANDLE

### MATLAB 中的句柄概念与作用 #### 什么是句柄? 在 MATLAB 中,句柄Handle)是一个用于标识对象的唯一数字。每当创建一个图形对象(如图形窗口、坐标轴、按钮等)时,MATLAB 都会为该对象分配一个唯一的句柄[^1]。这个句柄可以看作是对象的“身份标识”,通过它可以在后续程序中访问和操作该对象句柄本质上是一个 16 位的无符号整数,类似于 C 语言中的函数指针,但与指针不同的是,句柄并不直接指向内存地址,而是由系统管理的对象标识符。程序员无法手动指定句柄,它由系统在对象创建时自动生成[^1]。 #### 句柄的作用 句柄的主要作用是允许用户对特定对象进行操作和属性修改。例如,通过句柄可以获取或设置对象的属性,从而实现对图形界面或数据可视化的动态控制。 例如,以下代码创建一个图形窗口,并获取其句柄: ```matlab h = figure(1); % 创建编号为 1 的图形窗口,并返回句柄 ``` 通过 `get` 函数可以查看该图形对象的属性: ```matlab get(h) % 获取句柄 h 所对应图形对象的所有属性 ``` 还可以通过 `set` 函数修改对象的属性: ```matlab set(h, 'Name', 'My Plot'); % 设置图形窗口的名称 ``` #### 句柄与函数句柄的区别 MATLAB 中还存在“函数句柄”(Function Handle),它与图形对象句柄不同,主要用于引用函数。函数句柄可以指向一个命名函数或匿名函数,支持灵活的函数调用和参数传递[^2]。例如: ```matlab f = @sin; % 函数句柄指向 sin 函数 result = f(pi/2); % 调用 sin(pi/2) ``` 匿名函数也可以使用函数句柄定义: ```matlab g = @(x) x^2 + 2*x + 1; % 定义一个匿名函数 y = g(3); % 计算结果为 16 ``` #### 句柄的应用场景 1. **图形对象管理**:通过句柄可以访问和修改图形界面中的控件、坐标轴、线条等对象的属性。 2. **回调函数**:在 GUI 编程中,句柄常用于传递对象信息给回调函数,实现事件驱动的交互。 3. **数据绑定**:句柄可用于将数据与图形对象绑定,例如通过 `UserData` 属性存储额外信息[^1]。 #### 示例:使用句柄管理图形对象 以下代码演示如何使用句柄隐藏坐标轴并存储自定义数据: ```matlab axHndl = gca; % 获取当前坐标轴句柄 set(axHndl, 'UserData', 'myData', 'Visible', 'off'); % 设置 UserData 并隐藏坐标轴 ``` 上述代码中,`UserData` 属性用于存储字符串 `'myData'`,而 `'Visible', 'off'` 则使坐标轴不可见[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值