什么是句柄,句柄有什么作用
对于“句柄”,在下一直停留在一知半解的认识层面,近日在下学习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调用),不能像使用指针那样,做其它的事。
**
写在后面:
**
到此为止,有关Windows句柄就简单介绍到这里。需要说明的是,本文是面向初学者的,旨在让读者对句柄有一个完整而清晰的认知,既要避免知其然而不知其所以然的茫然困惑,又要避免深入源码的艰难晦涩。因此,本文并不能做到绝对的直达本质,同时也可能在个别细节上与真实情况稍有出入,但在下认为这并不贻害初学者对句柄的认识。因为对某一知识的认知,从几乎一无所知或是一知半解到“精通”,往往需要更多新知识的补充,短时间内很难达到,在不影响知识的使用的前提下,先把握整体,在逐步深入细节,不失为一个明智的选择
什么是句柄,句柄有什么作用相关推荐
- 句柄的意义和作用以及句柄和指针的区别
句柄 什么是句柄?首先这个单词听起来就有点怪,只知道有把柄,句柄对应单词是handle,把手,一个门把手可以打开一扇房间的门,句柄是一个特殊的代号,windonw系统可以通过一个特定的句柄打开一个特定 ...
- linux上c语言hdc句柄,控制台窗口的绘图
最近和别人聊天,聊到了控制台绘图,曾经学了一些windows的API编程,却没想到直接在控制台窗口上进行绘图 今天有时间,便把代码写了出来 #include #include /*********** ...
- Matlab中的函数句柄@
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50699990 @是Matlab中的句柄 ...
- (批处理学习)句柄备份——个人见解之“>nul 3>nul“——记录学习过程(详细)
目录 发现问题 猜测原因 尝试1 尝试2 查询资料 分析 特别的 应用 解决办法(不完全) 缺陷 缺陷1 缺陷2 最佳策略 参考资料 使用的系统:(注:以下的探究过程均属于该计算机) 发现问题 最近学 ...
- Windows句柄剖析
1 什么是句柄 句柄的概念: 在系统中指向某个控件或对象的唯一指针(也可叫句柄),系统可以通过这个句柄与所对应的控件或对象交互(控制它).控件或对象与句柄的关系就好比电视机与遥控器,通过遥控器 ...
- Matlab中句柄对象行为
目录 句柄对象行为 什么是句柄? 句柄的副本 在函数中修改过的句柄对象 确定对象是否为句柄 删除的句柄对象 句柄对象行为 多个变量可以引用同一个句柄对象.因此,用户与句柄类的实例的交互不同于值类的实例 ...
- Matlab中的图形句柄(转载)
在matlab中,每一个对象都有一个数字来标识,叫做句柄.当每次创建一个对象时,matlab就为它建立一个唯一的句柄 句柄中包含有该对象的相关信息参数,可以在后续程序中进行操作,改变其中的参数,以便达 ...
- 进程句柄表初始化,扩展,插入删除句柄源码分析
一.为什么要有句柄 句柄是一个8字节的结构体,用途是指向内核对象.3环程序无法通过地址直接访问内核对象,所以需要用句柄来间接访问. 本文重点介绍句柄表,句柄本身则留到下一篇博客介绍.但因为接下来介绍句 ...
- 【C语言】控制台窗口图形界面编程(一)句柄和文本属性
00. 目录 文章目录 00. 目录 01. 句柄 02. GetStdHandle函数 03. CloseHandle函数 04. SetConsoleTextAttribute函数 05. 十进制 ...
- 用MATLAB编程课程设计,matlab课程设计报告---用Mtlab编程实现句柄图形应用
matlab课程设计报告---用Mtlab编程实现句柄图形应用 课程设计报告(论文)课程设计报告(论文) 课 程基于 Matlab 的数学实验 学 号 姓 名 班 级 任课教师 用用 M Mtlabt ...
最新文章
- 【Python基础】字符串专题总结
- Linux操作系统下Oracle主要监控工具介绍
- php css去除h1样式,HTML中怎么设置h1的字体样式你知道吗?
- 挑战10个最难的Java面试题(附答案)【下】
- 智能会议系统(9)---流媒体协议学习
- C++关键字 explicit
- Java数据类型转换
- arcgis软件界面字体太小
- Java毕设项目——智能仓储系统(java+SSM+Maven+Mysql+Jsp)
- mysql 空格显示问号_空格变成问号
- mysql ansi sql标准_Mysql数据库隔离级别(ANSI SQL92规范,行锁,间隙锁)
- 华为手机怎么使用读卡器_手机nfc功能怎么打开(华为手机nfc功能使用步骤)
- 【LOJ6713】「EC Final 2019」狄利克雷 k 次根 加强版(狄利克雷生成函数)
- SSM毕设项目仓库管理系统lyf55(java+VUE+Mybatis+Maven+Mysql)
- 关于CMake的使用介绍
- 微积分入门:无穷小之比与无穷小求和
- Forming a Magic Square
- 成功销售员应该具备的10大素质(上)
- Losses Can Be Blessings: Routing Self-Supervised Speech Representations Towards Efficient Multilingu
- c3p0连接池使用完毕后连接返还