句柄是什么意思?(50分)

S

shijies

Unregistered / Unconfirmed
GUEST, unregistred user!
一个很基本的术语,Window编程中经常看到。
 
句柄在WIN32下就是一个32位整数。它是WINDOWS用来记录,控制所分配资源的一个控制点。 它的英文HANDLE(把手,把柄),可能更能使人明白
参考
http://www.sunistudio.com/cppfaq/references.html#[8.7]
 
句柄和ID
在Windows程序设计中,句柄是无法精确定义的术语。随便找一个高手,让他给你讲讲句柄是什么,恐怕他都很难给你一个具体的定义来。
在Windows程序设计中,句柄无所不在,窗口有窗口的句柄HWND,线程和进程也有句柄HANDLE,甚至有人把套接字也称为句柄(我就是这样的)。
句柄在英文中是handle,作为动词讲是处理的意思。简而言之,句柄是处理对象的一个接口,对于程序中所涉及的对象,你可以通过句柄去操作他。你不应该试图去回答句柄是什么,而应该从务虚的角度去理解他,知道他干什么即可。
有人说,因为handle的定义是void *,因此他是一个指针。有些熟悉内核的人说这是一个索引。这些说法都是不准确的。需要注意的是,微软并没有精确定义句柄的含义,也许在某个特殊的操作系统中,他使用了一种内部含义,但是在其他版本中,就不保证这样了。任何对句柄的内在假设都可能导致灾难性的后果。
API是接口,句柄是接口,两者有什么区别?API是一个通用的函数族,他处理所有的对象,而句柄是和某个具体对象相关联的数据结构。只有借助句柄,API才知道处理哪个对象。
有些对象有ID。句柄表示特殊的对象,ID也表示某个对象,为什么要两个东西来表示?
首先,句柄不能唯一表示对象。一个对象可以有多个句柄。例如:假设我们用CreateProcess创建一个进程,该进程的第一个线程的句柄会返回给调用CreateProcess的进程。同时,在新创建的进程中,该线程也会有一个句柄。这样,这个线程就有两个句柄。我们也可以用DuplicateHandle复制一个句柄,这个句柄和原来句柄是不一样的,但是他们都表示同一个对象。而每个有ID的对象,在系统范围内,ID肯定是唯一的。
其次,句柄所能实现的功能ID不能实现。毕竟ID只是一个数字,他不能记录很多信息。而句柄可能在其内部结构中记录了很多信息(如权限、有无信号等)。
总之,如果试图解释他到底是什么,学习句柄就会误入歧途。从虚的角度去理解,对于新手是难一点,但是这也许是唯一正确的办法
 
句柄的含义表示很简单,某个内部资源的数字标识符,当你要用某个API操作一个内部资源的时候,就必须知道表示这个资源的标识符,Windows给许多内部资源生成一个整数作为标识符,当你需要用某个API操作某个资源的时候,就必须给出这个标识符,Windows才能完成操作。最简单的,当创建一个窗体后,Windows会返回给你此窗体的HWND,这个值你必须自己保存好,以便下次想对这个窗体做操作的时候(比如发送消息),在调用API的时候告诉Windows你想操作的资源是什么。所以,句柄=内部资源的数字标识符。
 
再说几句,就容易理解了。如果你要开发操作系统,系统中肯定要自己保存很多对象吧?这些对象并不需要外界知道它们的结构,只要公开一些函数给外部调用就可以操作对象的状态。这个时候你会发现一个问题,对象太多,(比如,Windows),怎么知道用户使用API函数想操作哪个对象呢?总得给这些对象一个唯一的标识符来标识对象体吧?可是用什么标识呢?用一个结构?用一个指针?用一个整数?啊哈,整数就可以啊!内部保存一个整数列表,再把列表和对象关联起来,外部API调用的时候,只要给出一个存在于整数列表里面的整数,就可以找到实际操作的对象,然后就可以直接操作了。这不是很简单吗?为什么选整数?因为整数范围广(无符号整数可以多大40多个亿的表达范围——4294967295,一个计算机总不可能真正需要用到这么多内部对象吧?),还有比较统一,只是一个32位的数字而已,只占用4个字节而已,也不需要考虑语言差别问题(哪种编程语言不支持整形?)。太好了。找到解决办法了。于是Handle由此产生。呵呵,其实英文的Handle很能表达意思!中文翻译成“句柄”实在不敢恭维!
 
接受答案了.
 
顶部