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

  • 写在前面:
  • 这里需要说明:
  • 让我们先看图,再解释。
  • 简单解释:
  • 下面,关于句柄,再交代一些关键性细节:
  • 写在后面:
  • 转自

写在前面:

对于“句柄”,在下一直停留在一知半解的认识层面,近日在下学习Windows编程,决定趁此机会将句柄彻底搞清楚。查阅了一些网络上的资料,发现网络上的讲解大概可以分为两类:一种是以比喻、类比的方式说明,这种方法虽然形象易懂,但并没有从原理上、本质上加以揭示,让人仍然想问“为什么?”、“怎么实现?”。另一种是给出源代码,无可厚非,这当然是最本质的说明了,但这样一来,又显得不够直观,初学者理解起来有一定的难度。鉴于此,在下尽微末之能,结合自己的愚见,在两者之间折中,用图解的方式来将原理呈现出来,做到一目了然。

这里需要说明:

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调用),不能像使用指针那样,做其它的事。

写在后面:

1.到此为止,有关Windows句柄就简单介绍到这里。需要说明的是,本文是面向初学者的,旨在让读者对句柄有一个完整而清晰的认知,既要避免知其然而不知其所以然的茫然困惑,又要避免深入源码的艰难晦涩。因此,本文并不能做到绝对的直达本质,同时也可能在个别细节上与真实情况稍有出入,但在下认为这并不贻害初学者对句柄的认识。因为对某一知识的认知,从几乎一无所知或是一知半解到“精通”,往往需要更多新知识的补充,短时间内很难达到,在不影响知识的使用的前提下,先把握整体,在逐步深入细节,不失为一个明智的选择。想进一步深入理解Windows句柄的读者,可以看在下的下一篇文章《源码剖析——深入Windows句柄本质》。

2.在下知识有限,理解不深,如有错误纰漏之处,这里再三恳请大家一定要为在下指出。大家的批评指正是在下进步的源泉。

转自

https://www.cnblogs.com/zpcdbky/p/4652151.html

原文的参考:

http://blog.csdn.net/newjerryj/article/details/4383701

http://www.cnblogs.com/yellowyu/archive/2009/06/07/1497910.html

图解说明——究竟什么是Windows句柄相关推荐

  1. Windows句柄-2

    这里需要说明: 1.这里将句柄所能标识的所有东西(如窗口.文件.画笔等)统称为"对象". 2.图中一个小横框表示一定大小的内存区域,并不代表一个字节,如标有0X00000AC6的横 ...

  2. Windows 句柄泄露学习总结

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

  3. 浅谈windows句柄表

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

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

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

  5. Oracle12c 的安装教程图解(安装系统:windows 2008R2)

    Oracle12c 的安装教程图解(安装系统:windows 2008R2) 第一节 安装和下载路径 1   官方下载路径: http://www.oracle.com/cn/products/dat ...

  6. 转: Windows句柄数的限制

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

  7. Windows句柄剖析

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

  8. 台式计算机怎么加一个硬盘,台式机加装一个机械硬盘图解 但建议直接在windows下...

    导读:聊到加装,我们很多人都知道,有朋友问台式机加装机械硬盘识别不了,当然了,还有人问一个台式电脑能装两个硬盘吗,这到底是咋回事?其实怎么在台式机加装硬盘呢,今天给大家说说台式机加装一个机械硬盘图解, ...

  9. Windows句柄数的限制

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

最新文章

  1. jQuery Datatable 实用简单实例
  2. 你一定不知道的 Linux 使用技巧
  3. Python中读取文件中的json串,并将其写入到Excel表格中
  4. 如何解决 linux socket TIME_WAIT 过多造成的问题(SYN、ACK、FIN、MSL、RST含义)netstat查看TCP连接数命令
  5. Twig模板语言入门
  6. C语言学习之分别用while、 for双重循环的方式编程绘制如下图形
  7. 教务管理及教材订购系统设计文档
  8. PHP程序中时间戳,php 时间戳常用代码
  9. 360更新补丁一直提示正在安装_远程利用POC公布|CVE20200796:微软发布SMBv3协议“蠕虫级”漏洞补丁通告...
  10. Android开发简单购物app源码,校园购物APP源码(适合新手学习)
  11. 10分钟掌握运输问题(一)
  12. ORACLE递归_ 树形遍历查询根节点、父节点、子节点_002
  13. 圆周率一千万亿位_圆周率2700万亿位完整版?
  14. c语言关键字code什么意思,C语言中的32个关键字分别是什么意思?
  15. 固态硬盘跟机械硬盘是怎么储存数据
  16. java开发的微信公众号服务端生产环境中的两个大坑
  17. Java实现邮箱发送(阿里云邮箱推送)
  18. 视频多少帧时才不卡顿
  19. 攻防世界 看雪看雪看雪
  20. 【OS】新国立nus操作系统知识点(中文版)

热门文章

  1. 清空手机微信浏览器缓存
  2. 小程序使用threejs第五篇—室内效果3D文件的加载,可旋转查看上下四周效果
  3. STC89C52引脚
  4. 服务器机房监控系统研究,机房环境及服务器运行状态的嵌入式监控系统设计
  5. 嗅探欺骗之Ettercap局域网攻击
  6. Office Component Enterprise Toolkit for .NET Crack
  7. 台湾老哥在深圳撸代码是怎么样的体验
  8. Tcl么么哒刷机包 乐蛙OS6第148期 新增信息前置开关 稳定流畅
  9. 【乐理】音程和半音数
  10. 编解码持续升级,「硬」实力铸就视频云最优解