这里需要说明:

1.这里将句柄所能标识的所有东西(如窗口、文件、画笔等)统称为“对象”。

2.图中一个小横框表示一定大小的内存区域,并不代表一个字节,如标有0X00000AC6的横框表示4个字节。

3.图解的目的是为了直观易懂,所以不一定与源码完全对应,会有一定的简化。

让我们先看图,再解释。

其中,图1是程序运行到某时刻时的内存快照,图2是程序往后运行到另一时刻时的内存快照。红色部分标出了两次的变化。

简单解释:

Windows是一个以虚拟内存为基础的操作系统,很多时候,进程的代码和数据并不全部装入内存,进程的某一段装入内存后,还可能被换出到外存,当再次需要时,再装入内存。两次装入的地址绝大多数情况下是不一样的。也就是说,同一对象在内存中的地址会变化。(对于虚拟内存不是很了解的读者,可以参考有关操作系统方面的书籍)那么,程序怎么才能准确地访问到对象呢?为了解决这个问题,Windows引入了句柄。

系统为每个进程在内存中分配一定的区域,用来存放各个句柄,即一个个32位无符号整型值(32位操作系统中)。每个32位无符号整型值相当于一个指针,指向内存中的另一个区域(我们不妨称之为区域A)。而区域A中存放的正是对象在内存中的地址。当对象在内存中的位置发生变化时,区域A的值被更新,变为当前时刻对象在内存中的地址,而在这个过程中,区域A的位置以及对应句柄的值是不发生变化的。这种机制,用一种形象的说法可以表述为:有一个固定的地址(句柄),指向一个固定的位置(区域A),而区域A中的值可以动态地变化,它时刻记录着当前时刻对象在内存中的地址。这样,无论对象的位置在内存中如何变化,只要我们掌握了句柄的值,就可以找到区域A,进而找到该对象。而句柄的值在程序本次运行期间是绝对不变的,我们(即系统)当然可以掌握它。这就是以不变应万变,按图索骥,顺藤摸瓜。

所以,我们可以这样理解Windows句柄:

数值上,是一个32位无符号整型值(32位系统下);逻辑上,相当于指针的指针;形象理解上,是Windows中各个对象的一个唯一的、固定不变的ID;作用上,Windows使用句柄来标识诸如窗口、位图、画笔等对象,并通过句柄找到这些对象。

下面,关于句柄,再交代一些关键性细节:

1.所谓“唯一”、“不变”是指在程序的一次运行中。如果本次运行完,关闭程序,再次启动程序运行,那么这次运行中,同一对象的句柄的值和上次运行时比较,一般是不一样的。

其实这理解起来也很自然,所谓“一把归一把,这把是这把,那把是那把,两者不相干”(“把”是形象的说法,就像打牌一样,这里指程序的一次运行)。

2.句柄是对象生成时系统指定的,属性是只读的,程序员不能修改句柄。

3.不同的系统中,句柄的大小(字节数)是不同的,可以使用sizeof()来计算句柄的大小。

4.通过句柄,程序员只能调用系统提供的服务(即API调用),不能像使用指针那样,做其它的事。

参考:数据结构与算法

究竟什么是Windows句柄 - whatgorun - 博客园

Windows句柄-2相关推荐

  1. 浅谈windows句柄表

    windows定义了很多内核对象:进程对象.线程对象.互斥量对象.信号量对象.事件对象.文件对象等等.在调用相应的函数创建这些对象后,我们都可以通过HANDLE类型的句柄来引用它们.或许你在一些书上看 ...

  2. Windows句柄表学习笔记 —— 句柄表全局句柄表

    Windows句柄表学习笔记 -- 句柄表&全局句柄表 句柄表 实验一:在WinDbg中查看句柄表 第一步:打开一个Win32窗口程序 第二步:编译并运行以下代码 第三步:查看运行结果 第四步 ...

  3. Windows 句柄泄露学习总结

    句柄泄露实例分析 http://www.cnblogs.com/Leo_wl/p/5397274.html 在上篇文章.NET对象与Windows句柄(二):句柄分类和.NET句柄泄露的例子中,我们有 ...

  4. 转: Windows句柄数的限制

    转: Windows句柄数的限制 最近发现以前写的部分程序存在句柄数不断增加,系统运行一段时间后就会出现问题 检查发现这是由于创建线程完成以后没有调用CloseHandle,导致句柄数量不断增加,而操 ...

  5. Windows句柄剖析

    1 什么是句柄 句柄的概念:     在系统中指向某个控件或对象的唯一指针(也可叫句柄),系统可以通过这个句柄与所对应的控件或对象交互(控制它).控件或对象与句柄的关系就好比电视机与遥控器,通过遥控器 ...

  6. 图解说明——究竟什么是Windows句柄

    图解说明--究竟什么是Windows句柄 写在前面: 这里需要说明: 让我们先看图,再解释. 简单解释: 下面,关于句柄,再交代一些关键性细节: 写在后面: 转自 写在前面: 对于"句柄&q ...

  7. Windows句柄数的限制

    最近发现以前写的部分程序存在句柄数不断增加,系统运行一段时间后就会出现问题 检查发现这是由于创建线程完成以后没有调用CloseHandle,导致句柄数量不断增加,而操作系统对句柄最大数量是有限制的,经 ...

  8. 深入了解Windows句柄到底是什么

    总是有新入门的Windows程序员问我Windows的句柄到底是什么,我说你把它看做一种类似指针的标识就行了,但是显然这一答案不能让他们满意,然后我说去问问度娘吧,他们说不行网上的说法太多还难以理解. ...

  9. Windows句柄数限制

    设置 GDIProcessHandleQuota项设置GDI句柄数量,默认值为2710(16进制)/10000(10进制),该值的允许范围为 256 ~ 16384 ,将其调整为大于默认的10000的 ...

最新文章

  1. 一个点到多边形顶点距离相同_走进高维空间——所有点之间的距离都相等!奇妙、疯狂、不可思议...
  2. java-xpath学习
  3. 安装python后如何打开-Python的安装与使用
  4. js实现图片轮播效果
  5. java callable 详解_Java多线程详解(七)------Callable接口介绍
  6. 局域网内访问mysql数据库
  7. JAVA 10(多线程)
  8. python爬取文件归类_python爬取各类文档方法归类汇总
  9. Codeforces Round #345 (Div. 1) D. Zip-line 上升子序列 离线 离散化 线段树
  10. 【Qt串口调试助手】1.0 - 400行代码撸一个Qt5串口调试助手框架
  11. python爬虫中for循环无法每一段输出_Python入门到掌握只需要这3大,4类,5大,6种,即可,附教程...
  12. java编程题全集及答案_JAVA编程题全集(100题及答案)q
  13. 伺服电机功率计算选型与伺服电机惯量匹配
  14. mysql audit log_关于MySQL AUDIT(审计)那点事
  15. python操作符是什么意思_如何使用python操作符**与*?有什么区别?
  16. 实现LZW字典压缩算法
  17. Flink State 深度讲解
  18. 以CVPR顶会论文为例,探讨AI论文的阅读方法
  19. C#输出Word文档
  20. 微信小程序上传图片裁剪工具image-cropper使用

热门文章

  1. python时间函数详解_Python:Numpy库基础分析——详解datetime类型的处理
  2. 系统试运行总结报告_制药行业计算机化系统验证与数据可靠性实施精要
  3. VS与QT的路径查找差异
  4. python 给word添加背景图片_Python如何使用word文档插入图片和表格
  5. php正则表达式 匹配日期,正则表达式-正则表达式以匹配有效日期
  6. maven 加入第三方库_关于maven,你还要翻阅多少资料才能整理出这一份完整文档...
  7. myeclipse搭建php,MyEclipse配置JDK类库的简易流程
  8. nbiot开发需要掌握什么_什么是前端工程师?前端工程师需要掌握什么技能?
  9. python非数值型数据_Python机器学习实战:如何处理非数值特征
  10. log4j slf4j实现_slf4j 与log4j logback的区别以及使用场景