Windows中句柄和ID的区别
2021-04-09 12:28
标签:术语 符号整型 语句 应该 现在 源文件 说明 信号 下拉 每个对象(如果需要)都有一个唯一的ID用来标示自己。而Handle则是另外一个实体(比如你的程序)为了处理其它的对象而得到的一个标示,这个标示只对操作主体有效,而且不同的操作主体拥有的同一个对象的Handle没有理由一定相同。 句柄和ID 在Windows程序设计中,句柄是无法精确定义的术语。随便找一个高手,让他给你讲讲句柄是什么,恐怕他都很难给你一个具体的定义来。 在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可以单独运行的副本,是唯一可以标志此实例的整数 Windows中句柄和ID的区别 标签:术语 符号整型 语句 应该 现在 源文件 说明 信号 下拉 原文地址:https://www.cnblogs.com/weekbo/p/9064188.htmlVC++菜单的句柄也可以理解成菜单的识别符(ID). 但如果指菜单项的ID, 那可能又是一回事了。按我的理解: 1. 句柄是程序运行中系统为其分配的,菜单项ID是编程者自己定义指定的。一般可在资源文件中定义也可在动态创建菜单时指定,程序中引用。 2. 菜单的句柄是属于菜单的,菜单项ID是属于菜单中某一个菜单项的。编程者通过菜单的句柄访问菜单,通过ID进行菜单项识别并进行消息处理。 3. 菜单的句柄类型是HMENU, 菜单项ID的类型是UINT(无符号整型)。当然这两种类型本质上并无差别,但编程者一般不混用。当然不排除强制类型转换,如有(HMENU)id. 4. 如果某菜单项是子菜单或下拉菜单,则动态创建插入该菜单项时, 子菜单或下拉菜单的句柄用作该菜单项的ID. 这时则有(UINT)hSubMenu的用法。 5.一个window对应一个句柄,一个控件可以对应一个ID
例如,每一个系统内存在的Process都有一个可以在系统内区别于其它Process的ID。而Process Handle,只有在其它的某个实体处理它时,对它进行一个Open操作(OpenProcess(),?),才能的到这个操作主体内与被操作的Process相关的Handle.