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

什么是句柄,句柄有什么作用相关推荐

  1. 句柄的意义和作用以及句柄和指针的区别

    句柄 什么是句柄?首先这个单词听起来就有点怪,只知道有把柄,句柄对应单词是handle,把手,一个门把手可以打开一扇房间的门,句柄是一个特殊的代号,windonw系统可以通过一个特定的句柄打开一个特定 ...

  2. linux上c语言hdc句柄,控制台窗口的绘图

    最近和别人聊天,聊到了控制台绘图,曾经学了一些windows的API编程,却没想到直接在控制台窗口上进行绘图 今天有时间,便把代码写了出来 #include #include /*********** ...

  3. Matlab中的函数句柄@

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50699990 @是Matlab中的句柄 ...

  4. (批处理学习)句柄备份——个人见解之“>nul 3>nul“——记录学习过程(详细)

    目录 发现问题 猜测原因 尝试1 尝试2 查询资料 分析 特别的 应用 解决办法(不完全) 缺陷 缺陷1 缺陷2 最佳策略 参考资料 使用的系统:(注:以下的探究过程均属于该计算机) 发现问题 最近学 ...

  5. Windows句柄剖析

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

  6. Matlab中句柄对象行为

    目录 句柄对象行为 什么是句柄? 句柄的副本 在函数中修改过的句柄对象 确定对象是否为句柄 删除的句柄对象 句柄对象行为 多个变量可以引用同一个句柄对象.因此,用户与句柄类的实例的交互不同于值类的实例 ...

  7. Matlab中的图形句柄(转载)

    在matlab中,每一个对象都有一个数字来标识,叫做句柄.当每次创建一个对象时,matlab就为它建立一个唯一的句柄 句柄中包含有该对象的相关信息参数,可以在后续程序中进行操作,改变其中的参数,以便达 ...

  8. 进程句柄表初始化,扩展,插入删除句柄源码分析

    一.为什么要有句柄 句柄是一个8字节的结构体,用途是指向内核对象.3环程序无法通过地址直接访问内核对象,所以需要用句柄来间接访问. 本文重点介绍句柄表,句柄本身则留到下一篇博客介绍.但因为接下来介绍句 ...

  9. 【C语言】控制台窗口图形界面编程(一)句柄和文本属性

    00. 目录 文章目录 00. 目录 01. 句柄 02. GetStdHandle函数 03. CloseHandle函数 04. SetConsoleTextAttribute函数 05. 十进制 ...

  10. 用MATLAB编程课程设计,matlab课程设计报告---用Mtlab编程实现句柄图形应用

    matlab课程设计报告---用Mtlab编程实现句柄图形应用 课程设计报告(论文)课程设计报告(论文) 课 程基于 Matlab 的数学实验 学 号 姓 名 班 级 任课教师 用用 M Mtlabt ...

最新文章

  1. 【Python基础】字符串专题总结
  2. Linux操作系统下Oracle主要监控工具介绍
  3. php css去除h1样式,HTML中怎么设置h1的字体样式你知道吗?
  4. 挑战10个最难的Java面试题(附答案)【下】
  5. 智能会议系统(9)---流媒体协议学习
  6. C++关键字 explicit
  7. Java数据类型转换
  8. arcgis软件界面字体太小
  9. Java毕设项目——智能仓储系统(java+SSM+Maven+Mysql+Jsp)
  10. mysql 空格显示问号_空格变成问号
  11. mysql ansi sql标准_Mysql数据库隔离级别(ANSI SQL92规范,行锁,间隙锁)
  12. 华为手机怎么使用读卡器_手机nfc功能怎么打开(华为手机nfc功能使用步骤)
  13. 【LOJ6713】「EC Final 2019」狄利克雷 k 次根 加强版(狄利克雷生成函数)
  14. SSM毕设项目仓库管理系统lyf55(java+VUE+Mybatis+Maven+Mysql)
  15. 关于CMake的使用介绍
  16. 微积分入门:无穷小之比与无穷小求和
  17. Forming a Magic Square
  18. 成功销售员应该具备的10大素质(上)
  19. Losses Can Be Blessings: Routing Self-Supervised Speech Representations Towards Efficient Multilingu
  20. c3p0连接池使用完毕后连接返还

热门文章

  1. xtwpro2编程器_zadig v2.4编程软件下载|XTW100编程器软件(附USB驱动) - 驱动无忧
  2. maven下载安装及配置
  3. 交叉小波分析matlab,[转载]Matlab 小波分析及物理含义
  4. opencv与计算机视觉
  5. Python中利用scipy库进行最小二乘回归分析(金融相关)
  6. 一文搞定十大排序算法(动画图解)
  7. composition API
  8. k8s Storage Classes
  9. 熟悉Keil C51和STC-ISP下载烧录软件
  10. mysql的数据备份及恢复