目前位置: VCer资源中心 >>> VCer文章 >>> C++/MFC基础

[本帖已阅读1789次 分值140 回复3次] 张贴资源 发回信箱 控制面板

句柄大讨论(请各抒己见:)

提供者:kgj2008 张贴时间:2007-05-14 10:15:40.0 出处:http://blog.vckbase.com/arong/archive/2005/03/19/3732.html 作者:阿荣

句柄大讨论(请各抒己见:)(2007-05-14 10:15:40.0)


kgj2008


邮箱:tyter1223@163.com 有效期至:暂定2008年12月31日

 
级别: VCer排长
头衔: VCer会员

经验: 1473
作品: 33
分会: 华北分会
注册: 2005-04-04 04:47:33.0
登录: 2008-04-05 16:19:06.0

在Windows程序设计中,句柄是无法精确定义的术语。随便找一个高手,让他给你讲讲句柄是什么,恐怕他都很难给你一个具体的定义来。

在Windows程序设计中,句柄无所不在,窗口有窗口的句柄HWND,线程和进程也有句柄HANDLE,甚至有人把套接字也称为句柄(我就是这样的)。

句柄在英文中是handle,作为动词讲是处理的意思。简而言之,句柄是处理对象的一个接口,对于程序中所涉及的对象,你可以通过句柄去操作他。你不应该试图去回答句柄是什么,而应该从务虚的角度去理解他,知道他干什么即可。

有人说,因为handle的定义是void *,因此他是一个指针。有些熟悉内核的人说这是一个索引。这些说法都是不准确的。需要注意的是,微软并没有精确定义句柄的含义,也许在某个特殊的操作系统中,他使用了一种内部含义,但是在其他版本中,就不保证这样了。任何对句柄的内在假设都可能导致灾难性的后果。

API是接口,句柄是接口,两者有什么区别?API是一个通用的函数族,他处理所有的对象,而句柄是和某个具体对象相关联的数据结构。只有借助句柄,API才知道处理哪个对象。

有些对象有ID。句柄表示特殊的对象,ID也表示某个对象,为什么要两个东西来表示?

首先,句柄不能唯一表示对象。一个对象可以有多个句柄。例如:假设我们用CreateProcess创建一个进程,该进程的第一个线程的句柄会返回给调用CreateProcess的进程。同时,在新创建的进程中,该线程也会有一个句柄。这样,这个线程就有两个句柄。我们也可以用DuplicateHandle复制一个句柄,这个句柄和原来句柄是不一样的,但是他们都表示同一个对象。而每个有ID的对象,在系统范围内,ID肯定是唯一的。

其次,句柄所能实现的功能ID不能实现。毕竟ID只是一个数字,他不能记录很多信息。而句柄可能在其内部结构中记录了很多信息(如权限、有无信号等)。

总之,如果试图解释他到底是什么,学习句柄就会误入歧途。从虚的角度去理解,对于新手是难一点,但是这也许是唯一正确的办法。

 

一个名为ljk的网友是这样回的,感觉比较好理解:

“句柄是一种指向指针的指针。我们知 道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是

住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址 访问对象。但

是,如果您真的这样认为,那么您就大错特错了。我们知道,Windows是一 个以虚拟内存为基础的操作系统。在这

种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动

意味着它的地址变化 了。如果地址总是如此变化,我们该到哪里去找该对象呢?为了解决这个问题,Windows操作系

统为各应用程序腾出一些内存储地址,用来专门 登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)

本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样

我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统

分配给的,当系统卸载时(Unload)又释放给系统。句柄地址(稳定)→记载着对象在内存中的地址→对象在内存中的地

址(不稳定)→实际对象。但是,必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句柄还是原来的那个

句柄,而且绝大多数情况的确不一样的。假如我们把进入电影院看电影看成 是一个应用程序的启动运行,那么系统给

应用程序分配的句柄总是不一样,这和每次电 影院售给我们的门票总是不同的一个座位是一样的道理。 ”

注:转载文章需注明来源:VCer.net 文章地址:http://vcer.net/1179108940656.html

  如果你觉得VCer.net不错,而且你愿意为VCer.net捐赠一元钱,那么点击后面的捐赠按钮吧:) vcer.net捐赠

vcer为我,我为vcer!!!

[回复该贴] [加入个人书签]
[投票结果]

A: 评分 10 100% (6 票)
B: 评分 5 0% (0 票)
C: 评分 0 0% (0 票)
D: 评分 -5 0% (0 票)
E: 评分 -10 0% (0 票)

 


re:句柄大讨论(请各抒己见:)

最近一直再学习VC呢,其实说白了我个人认为句柄就是一种资源的标示,类似ID,考虑太多反而容易混淆呢

lyuranus 于 2007-10-22 20:49:23.0 编辑 [回复该贴]

re:句柄大讨论(请各抒己见:)

呵呵,有些不明白啊,既然是:

DECLARE_HANDLE(name)

#define DECLARE_HANDLE(name) struct name##__ { int unused; };

 

typedef struct name##__ *name

那么,就是说unused这个int,就“句柄可能在其内部结构中记录了很多信息(如权限、有无信号等)。”

不明白啊。

okrap 于 2007-09-07 20:11:11.0 编辑 [回复该贴]