找回密码
 加入
搜索
查看: 14182|回复: 21

[原创] 句柄和ID,新手可以看下

 火... [复制链接]
发表于 2010-10-22 22:56:36 | 显示全部楼层 |阅读模式
句柄和ID
在Windows程序设计中,句柄无所不在,窗口有窗口的句柄HWND,线程和进程也有句柄HANDLE,甚至有人把套接字也称为句柄(我就是这样的)。

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

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

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

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

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

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

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


句柄一般是操作系统避免你直接对某个对象数据结构进行操作而引入的,可以通过句柄来使用某个对象,而不用知道句柄的内容。

句柄是一种指向指针的指针。我们知 道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道,Windows是一 个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化 了。如果地址总是如此变化,我们该到哪里去找该对象呢?为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。 Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。句柄地址(稳定)→记载着对象在内存中的地址→对象在内存中的地址(不稳定)→实际对象。但是,必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句柄还是原来的那个句柄,而且绝大多数情况的确不一样的。假如我们把进入电影院看电影看成是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次电影院售给我们的门票总是不同的一个座位是一样的道理。

句柄和控件ID的区别

你的家庭现在就好比是一个程序(窗体也是程序的一部分,实际窗体、控件都是由命令语句动态构建的,只是省了你自己写代码而已,autoit的窗体和控件好像就只能用代码构建,和vb还不一样),控件ID就好像你的名字,一般一个家庭(程序)里的众多成员(控件)之间是不会重名的,每个人在自己家(程序)里的名字(控件ID)都是唯一的,当你的家人(程序代码)需要找你,叫你名字的时候就直接称呼你的名字(控件ID)。

但是全国无数个家庭,就可能会有重名了吧,于是政府(系统)就不管你的名字(控件ID)是什么,直接分配给每个人(控件)一个身份证号码(句柄),公安局(其他程序)来找你(一个控件)的时候就使用你的身份证号(句柄)来保证在全国(内存)范围里也不会把你弄错。

每个家庭组成以后(运行了一个新程序),生下了小宝宝(构建新的控件)就会得到一个全国(内存)唯一的一个身份证号(句柄),以保证在国内(内存)的唯一性。当一个家庭的成员寿终正寝(控件销毁)的时候,身份证号码(句柄)同时被作废(系统收回,以后分配给新产生的控件)。

什么是“句柄”(handle),handle的本意是把柄,把手的意思。是你与操作系统打交道的东东。举个通俗的例子,比如你考上了大学,入学后,学校(操作系统)会给你一个学生证号。注意,这个号码是学校指定的,你无法自选。有了这个号码(学生证,假设一证多用)享受学校提供的服务:如你就可以去图书馆借书,去食堂吃饭,去教室上课等等。但你不能到食堂里买啤酒,因为学校不允许这种服务。而在计算机中系统提供的服务就是API调用,你有了HANDLE,就可以理直气壮地向系统提出调用API的服务。而指针的权力就大多了,有了指针你可以到处去喝酒,打架,学校(操作系统)管不着,所以句柄和指针的区别在于句柄只能调用系统提供的服务。而句柄虽然是一个能相互区别的号码,但与我们普通的ID号又有区别,普通的ID号是可以由程序员自己定义的,而句柄不行,它是对象生成时系统指定的,是为了区别系统中存在的各个对象,这个句柄不是由程序员符给的。

  句柄
    1.句柄,是整个windows编程的基础,一个句柄是指使用的一个唯一的整数值,是指一个四字节长的数值,用于标志应用程序中的不同对象和同类对象中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。应用程序能够通过句柄访问相应的对象的信息。
    2.句柄不是一个指针,程序不能利用它句柄来直接阅读文件中的信息。如果句柄不用在I/O文件中,它是毫无用处的。
    3.句柄是windows用来标志应用程序中建立的或是使用的唯一整数,windows使用了大量的句柄来来标志很多对象。
   说明:实例——在windows环境下,不但可以运行多个应用程序,还可以运行多个应用程序的多份拷贝,每个拷贝叫做一个实例,并且有不同的实例句柄。一个实例句柄是windows可以单独运行的副本,是唯一可以标志此实例的整数
发表于 2010-10-23 13:42:08 | 显示全部楼层
本帖最后由 zps26 于 2016-4-16 00:50 编辑

通俗易懂,容易理解

句柄和ID
发表于 2010-10-24 18:08:41 | 显示全部楼层
没什么说的     好人呢   学习了
发表于 2010-10-25 02:57:30 | 显示全部楼层
谢谢啦,正需要这方面的资料
发表于 2010-10-25 08:54:35 | 显示全部楼层
很好的东西,很适合新手
发表于 2010-10-26 08:40:58 | 显示全部楼层
通俗易懂,感谢楼主!~~~~~
发表于 2010-12-28 18:16:33 | 显示全部楼层
我在慢慢看呢
发表于 2010-12-29 15:12:41 | 显示全部楼层
认真拜读了!
发表于 2010-12-29 15:51:25 | 显示全部楼层
菜鸟必备   哈哈
发表于 2010-12-29 15:55:39 | 显示全部楼层
Window Handles / HWNDs
The variant datatype in AutoIt natively supports window handles (HWNDs). A window handle is a special value that windows assigns to a window each time it is created. When you have a handle you may use it in place of the title parameter in any of the function calls that use the title/text convention. The advantage of using window handles is that if you have multiple copies of an application open - which have the same title/text - you can uniquely identify them when using handles. When you use a window handle for the title parameter then the text parameter is completely ignored.

Various functions such as WinGetHandle, WinList and GUICreate return these handles. It is important to note that a window handle is not classed as a number or string - it is its own special type.

Note: Window handles will work no matter what WinTitleMatchMode is currently in use.

这是帮助文档的定义
发表于 2010-12-31 21:48:47 | 显示全部楼层
顶一下。。。。。。
发表于 2011-7-24 07:59:49 | 显示全部楼层
收藏了先,以后一定用得到
发表于 2011-7-24 16:15:14 | 显示全部楼层
看不太懂,还是谢谢楼主了。
发表于 2011-8-4 17:02:35 | 显示全部楼层
虽然不怎么懂,还是要谢谢楼主
发表于 2011-8-5 01:49:20 | 显示全部楼层
这个比喻太形象了啊,哈哈
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-21 22:04 , Processed in 0.076210 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表