[技术学习]什么是句柄

来源:互联网 发布:手机金属探测器软件 编辑:程序博客网 时间:2024/03/28 21:08

最近转做Windows开发,天天跟句柄打交道,句柄是什么?   最开始把它当成是指针的等效物,这样理解似乎没问题,但感觉还是觉得句柄很神秘。 后来在<<Windows核心编程>>一书3.1节找到不完整的答案:

     “在32位Windows进程中,句柄是一个32位值;在64位Windows进程中,则是一个64位值。为了让操作系统知道我们要对哪个内核对象进行操作,我们需要将这个句柄传给各种Windows函数。“

     这个解释还是没说明白,句柄到底是什么? 似乎只能意会,不能言传。

     刚才在水木的MSDN版闲逛,在精华区发现一篇<<什么是句柄>>,终于把句柄的概念解释清了,文章内容如下:

=====================================================================

发信人: loury (冬瓜#深深的海洋~), 信区: MicroSoftTRD       
标  题: [范文][MicroSoftTRD]什么是句柄
发信站: BBS 水木清华站 (Sat May 11 11:20:10 2002)

【 以下文字转载自 New_board 讨论区 】
发信人: gonewind (小懒猫◎大海呀好多水~~), 信区: New_board       
标  题: [范文][MicroSoftTRD]什么是句柄
发信站: BBS 水木清华站 (Sat Apr 27 09:53:18 2002)


    句柄是一种指向指针的指针。我们知 道,所谓指针是一种内存地址。应用程序启动
后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个
内存的首地址,那么就可以随时用这个地址 访问对象。但是,如果您真的这样认为,
那么您就大错特错了。
    我们知道,Windows是一 个以虚拟内存为基础的操作系统。在这种系统环境下,
Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。
对象被移动意味着它的地址变化 了。如果地址总是如此变化,我们该到哪里去找该对象
呢?
    为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,
用来专门 登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本
身是不变的。
    Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄
地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪
个位置。

    这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给
系统 。句柄地址(稳定)→记载着对象在内存中的地址────→对象在内存中的地址
(不稳定) →实际对象
    但是,必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句柄还是
原来的那个句柄,而且绝大多数情况的确不一样的。假如我们把进入电影院看电影看成 是一个应用
程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次电 影院售给我们的门票总
是不同的一个座位是一样的道理。

=========================================================

 

2010.12.24 补记: 水木的这个说法还是不太好理解。 其实只要看完《Windows核心编程》第三章就知道句柄是什么了,就是一个数组索引而且。