Windows中句柄和ID的区别

本文详细解析了Windows编程中句柄与ID的概念及其区别。句柄作为一种标识符,由系统分配,用于操作对象;而ID通常由开发者定义,用于唯一标识特定对象。文章通过生动的比喻和实际案例帮助读者理解两者的不同应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


VC++菜单的句柄也可以理解成菜单的识别符(ID). 但如果指菜单项的ID, 那可能又是一回事了。按我的理解:
 1. 句柄是程序运行中系统为其分配的,菜单项ID是编程者自己定义指定的。一般可在资源文件中定义也可在动态创建菜单时指定,程序中引用。
 2. 菜单的句柄是属于菜单的,菜单项ID是属于菜单中某一个菜单项的。编程者通过菜单的句柄访问菜单,通过ID进行菜单项识别并进行消息处理。
 3. 菜单的句柄类型是HMENU, 菜单项ID的类型是UINT(无符号整型)。当然这两种类型本质上并无差别,但编程者一般不混用。当然不排除强制类型转换,如有(HMENU)id. 
4. 如果某菜单项是子菜单或下拉菜单,则动态创建插入该菜单项时, 子菜单或下拉菜单的句柄用作该菜单项的ID. 这时则有(UINT)hSubMenu的用法。
5.一个window对应一个句柄,一个控件可以对应一个ID
每个对象(如果需要)都有一个唯一的ID用来标示自己。而Handle则是另外一个实体(比如你的程序)为了处理其它的对象而得到的一个标示,这个标示只对操作主体有效,而且不同的操作主体拥有的同一个对象的Handle没有理由一定相同。
例如,每一个系统内存在的Process都有一个可以在系统内区别于其它Process的ID。而Process   Handle,只有在其它的某个实体处理它时,对它进行一个Open操作(OpenProcess(),?),才能的到这个操作主体内与被操作的Process相关的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可以行的副本,是唯一可以志此例的整数


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值