图解说明——究竟什么是Windows句柄
图解说明——究竟什么是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句柄相关推荐
- Windows句柄-2
这里需要说明: 1.这里将句柄所能标识的所有东西(如窗口.文件.画笔等)统称为"对象". 2.图中一个小横框表示一定大小的内存区域,并不代表一个字节,如标有0X00000AC6的横 ...
- Windows 句柄泄露学习总结
句柄泄露实例分析 http://www.cnblogs.com/Leo_wl/p/5397274.html 在上篇文章.NET对象与Windows句柄(二):句柄分类和.NET句柄泄露的例子中,我们有 ...
- 浅谈windows句柄表
windows定义了很多内核对象:进程对象.线程对象.互斥量对象.信号量对象.事件对象.文件对象等等.在调用相应的函数创建这些对象后,我们都可以通过HANDLE类型的句柄来引用它们.或许你在一些书上看 ...
- Windows句柄表学习笔记 —— 句柄表全局句柄表
Windows句柄表学习笔记 -- 句柄表&全局句柄表 句柄表 实验一:在WinDbg中查看句柄表 第一步:打开一个Win32窗口程序 第二步:编译并运行以下代码 第三步:查看运行结果 第四步 ...
- Oracle12c 的安装教程图解(安装系统:windows 2008R2)
Oracle12c 的安装教程图解(安装系统:windows 2008R2) 第一节 安装和下载路径 1 官方下载路径: http://www.oracle.com/cn/products/dat ...
- 转: Windows句柄数的限制
转: Windows句柄数的限制 最近发现以前写的部分程序存在句柄数不断增加,系统运行一段时间后就会出现问题 检查发现这是由于创建线程完成以后没有调用CloseHandle,导致句柄数量不断增加,而操 ...
- Windows句柄剖析
1 什么是句柄 句柄的概念: 在系统中指向某个控件或对象的唯一指针(也可叫句柄),系统可以通过这个句柄与所对应的控件或对象交互(控制它).控件或对象与句柄的关系就好比电视机与遥控器,通过遥控器 ...
- 台式计算机怎么加一个硬盘,台式机加装一个机械硬盘图解 但建议直接在windows下...
导读:聊到加装,我们很多人都知道,有朋友问台式机加装机械硬盘识别不了,当然了,还有人问一个台式电脑能装两个硬盘吗,这到底是咋回事?其实怎么在台式机加装硬盘呢,今天给大家说说台式机加装一个机械硬盘图解, ...
- Windows句柄数的限制
最近发现以前写的部分程序存在句柄数不断增加,系统运行一段时间后就会出现问题 检查发现这是由于创建线程完成以后没有调用CloseHandle,导致句柄数量不断增加,而操作系统对句柄最大数量是有限制的,经 ...
最新文章
- jQuery Datatable 实用简单实例
- 你一定不知道的 Linux 使用技巧
- Python中读取文件中的json串,并将其写入到Excel表格中
- 如何解决 linux socket TIME_WAIT 过多造成的问题(SYN、ACK、FIN、MSL、RST含义)netstat查看TCP连接数命令
- Twig模板语言入门
- C语言学习之分别用while、 for双重循环的方式编程绘制如下图形
- 教务管理及教材订购系统设计文档
- PHP程序中时间戳,php 时间戳常用代码
- 360更新补丁一直提示正在安装_远程利用POC公布|CVE20200796:微软发布SMBv3协议“蠕虫级”漏洞补丁通告...
- Android开发简单购物app源码,校园购物APP源码(适合新手学习)
- 10分钟掌握运输问题(一)
- ORACLE递归_ 树形遍历查询根节点、父节点、子节点_002
- 圆周率一千万亿位_圆周率2700万亿位完整版?
- c语言关键字code什么意思,C语言中的32个关键字分别是什么意思?
- 固态硬盘跟机械硬盘是怎么储存数据
- java开发的微信公众号服务端生产环境中的两个大坑
- Java实现邮箱发送(阿里云邮箱推送)
- 视频多少帧时才不卡顿
- 攻防世界 看雪看雪看雪
- 【OS】新国立nus操作系统知识点(中文版)