句柄是什么?

所谓句柄实际上是一个数据,是一个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,  这样,可实现隐藏细节。  
---------------------------------------------------------------  

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


原文地址:http://blog.chinaunix.net/uid-20071539-id-1978403.html
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值