MyMSDN

MyMSDN记录开发新知道

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

关键字:句柄, HANDLE, WINDOWS SDK, windows.h,

从广义上,能够从一个数值拎起一大堆数据的东西都可以叫做句柄。句柄的英文是"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无符号整数,它表示程序加载到内存中的基地址。

posted on 2009-02-19 00:10 volnet 阅读(25515) 评论(29)  编辑 收藏 引用

评论

# re: 什么是句柄?为什么会有句柄?HANDLE 2009-07-17 14:31 YUY

写的太好了,刚刚发现,继续关注  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE[未登录] 2009-08-24 10:10 波波

终于看到一篇分析透彻的文章,至少我找了这么多材料,是第一次稍微懂得一些句柄的含义了  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE 2009-10-03 16:44 小炳

纯技术性的讲解还真不如博主的一语点醒,谢谢了。看技术文章看到头来一头雾水,看楼主的解释,真是清晰万分,谢谢。可见语言的表达组织也是很重要的  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE 2010-04-18 19:08 峰峰

感谢楼主的亲情奉献
  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE 2010-04-28 13:59 yimu

谢谢提醒,收益匪浅
  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE 2010-10-05 12:20 tarzan_sp

感谢博主  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE 2010-11-18 16:04 armqq3

受益 真的很好  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE 2010-11-28 13:53 刘昭贤

不错,,易懂。。  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE 2010-12-05 19:16 s

very good  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE 2011-06-09 10:24 iMenn

楼主写得很好,比我去查资料清晰多了  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE 2011-10-03 11:52 liberalking

看楼主一席话,胜读十年书。  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE 2011-10-03 15:42 wanshu

HANDLE 讲的非常好  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE 2011-11-28 20:48 SS

GOOD JOB  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE 2012-02-03 11:59 dario

说得很清晰,很好理解!  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE 2012-02-15 11:01 贝贝

万分感谢楼主!!!以前没看过句柄,都明白了。  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE 2012-05-09 10:37 kirizgu

楼主好人一生平安  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE 2012-05-15 23:58 楼主好人

我一向看论坛不回复,但是今天破例。楼主一语点醒梦中人,让我彻底明白了句柄(之前看过不少材料,很迷糊),感谢楼主,再次感谢!  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE[未登录] 2012-06-12 10:42 Tim

一语中的,明白了!!!!谢谢!!!!!!!!!!  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE 2012-06-20 09:47 cjmfgt

一语中的,明白了!!!!谢谢!!!!!!!!!!   回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE 2012-07-05 13:21 阳光

楼主说得很清楚透彻啊……  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE 2012-10-09 00:23 辅导费

太好了,楼主万岁  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE 2013-03-10 14:07 刘雄斌

不错!  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE 2013-07-18 19:59 llyishi

nice  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE 2014-01-22 18:00 paltan

化抽象为具体,深入浅出啊  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE 2014-04-21 01:12

谢谢楼主,解释的很好  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE 2014-04-23 00:13 11

好  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE 2014-05-04 01:13 大侠

还是扯淡,说过去说过来,只是解释了为什么叫做“柄”,而没有说明白为什么叫做“句”柄。估计没有人能说明白,弄不好就是当初翻译这个词的人脑袋有病,故弄玄虚的结果。实际上叫做“内核地址”或者叫做“把手”“操作柄”都比那个脑残的“句柄”强。  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE[未登录] 2016-06-11 19:52 路人甲

非常好  回复  更多评论   

# re: 什么是句柄?为什么会有句柄?HANDLE 2016-07-14 16:34 xiaoming

HANDLE handle = GetCurrentProcess();
cout <<hex<< (unsigned int)handle << endl;
返回的是ffffffff,而不是什么7fffffff  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


特殊功能