C++中对句柄Handle的理解

在C++的初学者中,很容易把句柄理解成指针, 但其实,句柄并不是指针. 

那么句柄是什么,一句话,句柄是资源(或项目)的唯一标识。 我们需要搞清楚的是,句柄Handle到底是怎么来标识资源的

在Windows程序中,有各种各样的资源(窗口,图标,光标等),系统在创建这些资源时为他们分配内存,并返回标识这些资源的标识号,即 句柄

HANDLE句柄其实是一个用16进制表示的32位整数, 你可以把它理解为一个”手柄“. 就好比我们炒菜的锅的把手,而这个HANDLE(句柄)就是win32下面各种"物件"的把手.  其实很多Windows API都需要一个HANDLE句柄来作为输入参数,因为很多Windows API它要和许多它看不见,不知道存储在哪里的一些windows对象打交道,那么它怎么来操作这些对象呢,它又没有这些对象的地址,没有指向这些对象的指针,也不知道这些对象存储在哪里。=》 只能通过句柄

看到这里,我们大概能够明白, HANDLE句柄有点像中间代理商(中间人)的角色,Window API/我们 不知道我们要找的那个windows对象在哪里,但是我们知道有个它的句柄,我们知道这个句柄,能找到这个句柄,我们通过这个句柄就可以操作这个我们不知道存储在哪里的windows对象

所以整个流程是这样的:

Windows创建一个对象,比如创建一个窗体,图标,光标  => 对每个新创建的对象,产生对应的句柄 => 句柄的内存地址是固定的,只要不销毁这个对象,它对应的这个句柄的内存地址就永远不会变化 => 对象移动,对应的内存地址变化。但是它对应的这个句柄HANDLE没有变化,HANDLE的内存地址也没有变化 => 对象销毁,HANDLE对应的句柄也销毁

句柄地址(稳定)→记录对象在内存中的地址→对象在内存中的地址(不稳定)→实际对象

 

注意点:

程序每次重新启动,系统是不能保证分配给这个程序的句柄HANDLE还是原来的那个句柄HANDLE, 在绝大多数的时候,都是不一样的. 

这好比我们做同一序列G231火车,每次都坐它回家,但是在不同的时间买票,每次分配到的座位号是不一样的

 

posted on 2023-01-06 10:37  新西兰程序员  阅读(885)  评论(0编辑  收藏  举报