代码改变世界

handle句柄的理解

2015-07-23 17:41  莈檤理  阅读(3603)  评论(0编辑  收藏  举报

所谓句柄实际上是一个数据,是一个Long (整长型)的数据。

句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,
WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图
,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。

从上面的定义中的我们可以看到,句柄是一个标识符,是拿来标识对象或
者项目的,它就象我们的姓名一样,每个人都会有一个,不同的人的姓名
不一样,但是,也可能有一个名字和你一样的人。从数据类型上来看它只
是一个16位的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数
来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相
应的对象。

如果想更透彻一点地认识句柄,我可以告诉大家,句柄是一种指向指针的
指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个
程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个
内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的
这样认为,那么您就大错特错了。我们知道,Windows是一个以虚拟内存为
基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来
回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它
的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢?

为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,
用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位
置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对
象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就
可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载
(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。


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


本质:WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务
或动态装入模块的,相反的,WINDOWS API给这些项目分配确定的句柄,
并将句柄返回给应用程序,然后通过句柄来进行操作。


但是必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句
柄还是原来的那个句柄,而且绝大多数情况的确不一样的。假如我们把进
入电影院看电影看成是一个应用程序的启动运行,那么系统给应用程序分
配的句柄总是不一样,这和每次电影院售给我们的门票总是不同的一个座
位是一样的道理。


什么是句柄,有什么用?
就是指针
---------------------------------------------------------------

对于WINDOWS来说,可以是任意值
对于C++来说可以认为是封装资源的类
---------------------------------------------------------------

句柄是个指针,但它是个二级指针(指向指针的指针).如果你拥有了一个对象
的句柄. 你就可以操作对象的所有公共方法.
---------------------------------------------------------------

handle(句柄)是服务的推广。比如你去某快餐店吃饭,先去选餐,选完以后
付款,服务
员给你一个号,然后他就可以转向下一位顾客。当厨房把你的餐做出来了
,厨房并不认识
你,但是每个餐上有个号,根据这个号,厨房把你的餐送到。这个号就是
handle,是服务
约定的标志。你甚至因为等烦了可以拿这个号去厨房催促。这个标志,在
一定的时间空间
内是唯一的。比如,在同样的时间内,在该快餐店的另外一家连锁分店可
以在为表面上相
同的号服务,但是这两个号是分开处理的,不会张冠李戴。同样,你吃完
饭离开该店,那
号并不会随你离开,还会随机地分配给后来的客户。
handle的好处在于,你不需要管它背后是怎么实现的。它可以是用指针,也
可以是用表格
。这些完全不用你管,你也绝对不应该去关心它具体是如何实现的(当然原
理上你可以学习
技术)。因为这个技术本身就是隔绝实现和应用的直接耦合。

---------------------------------------------------------------

整型,对象的唯一标示
---------------------------------------------------------------

在32位环境中,每个程序都是独立的,你的指针可以任意指向一个地方,但
是总是操作你这个空间的那个指针,句柄不同,你获得了他,就可以操作
别的程序的东西。
---------------------------------------------------------------

句柄是操作系统在生成对象时分配给对象的唯一标识!
通过句柄可以获取操作系统提供的服务!
句柄不同于指针,如果你得到一个对象的指针,那你就可以在此对象上为所欲
为!那操作系统就惨了!于是系统不给你指针,而给你一个加了限制的,用于跟踪
对象的指针的标识——句柄!系统使用句柄向外提供服务就相对安全了!
操作系统是通过API提供服务的,对于用户来说,句柄等同于对象指针,但
实际上句柄和指针根本不是一回事
---------------------------------------------------------------

句柄既有指针的便利性,又消除了指针缺点,比如可能delete一个无效的指

---------------------------------------------------------------

其实句柄还是很好理解,它主要用在两个地方。
1。 减少编译量: 通常的编译,总是包括所有文件(*.h+*.cpp),如果你
改动的是CPP文件(而且通常是这样), 你就要编译包括头文件在内的全
部文件。 如果你在头文件中定义一个handle,你就可以在cpp中用一个指针
指向它, 编译的时候可以避免冗长的编译。
2。 隔离信息量:因为头文件一般来讲总是对用户公开的,你可通过handle
将关键实现部分封装在cpp中,编译后得到的全是obj, 这样,可实现隐藏
细节。
---------------------------------------------------------------

总的来说句柄类就是一个非继承的类,目的就是为了屏蔽一个类层次结构很
多类.

也就是说你操作一个句柄类就可以控制一个属于类层次结构具体类,这样你
就以同一的接口消除了层次结构的不同,而且可以把资源控制等很多底层的
操作放在具体实现类上面而句柄类对于用户来说不存在这样复杂的问题,用
户只需要用句柄类提供的简单接口就可以了.
---------------------------------------------------------------

就是某个对象的指针,
通过句柄就可以引用该对象。