从广义上,能够从一个数值拎起一大堆数据的东西都可以叫做句柄。句柄的英文是"Handle",本义就是"柄",只是在计算机科学中,被特别地翻译成"句柄",其实还是个"柄"。从一个小东西拎起一大堆东西,这难道不像是个"柄"吗?

然后,指针其实也是一种"句柄",只是由于指针同时拥有更特殊的含义——实实在在地对应内存里地一个地址——所以,通常不把指针说成是"句柄"。但指针也有着能从一个32位的值引用到一大堆数据的作用,这不是句柄又是什么?

Windows系统中有许多内核对象(这里的对象不完全等价于"面向对象程序设计"一词中的"对象",虽然实质上还真差不多),比如打开的文件,创建的线程,程序的窗口,等等。这些重要的对象肯定不是4个字节或者8个字节足以完全描述的,他们拥有大量的属性。为了保存这样一个"对象"的状态,往往需要上百甚至上千字节的内存空间,那么怎么在程序间或程序内部的子过程(函数)之间传递这些数据呢?拖着这成百上千的字节拷贝来拷贝去吗?显然会浪费效率。那么怎么办?当然传递这些对象的首地址是一个办法,但这至少有两个缺点:

  1. 暴露了内核对象本身,使得程序(而不是操作系统内核)也可以任意地修改对象地内部状态(首地址都知道了,还有什么不能改的?),这显然是操作系统内核所不允许的;
  2. 操作系统有定期整理内存的责任,如果一些内存整理过一次后,对象被搬走了怎么办?

所以,Windows操作系统就采用进一步的间接:在进程的地址空间中设一张表,表里头专门保存一些编号和由这个编号对应一个地址,而由那个地址去引用实际的对象,这个编号跟那个地址在数值上没有任何规律性的联系,纯粹是个映射而已。

在Windows系统中,这个编号就叫做"句柄"。

Handle在Windows中的含义很广泛,以下关于谈到的Handle除非特别说明,将仅限于进程、线程的上下文中。

1、先来谈谈Handle

Handle本身是一个32位的无符号整数,它用来代表一个内核对象。它并不指向实际的内核对象,用户模式下的程序永远不可能获得一个内核对象的实际地址(一般情况下)。那么Handle的意义何在?它实际上是作为一个索引在一个表中查找对应的内核对象的实际地址。那么这个表在哪里呢?每个进程都有这样的一个表,叫句柄表。该表的第一项就是进程自己的句柄,这也是为什么你调用GetCurrentProcess()总是返回0x7FFFFFFF原因。

简单地说,Handle就是一种用来"间接"代表一个内核对象的整数值。你可以在程序中使用handle来代表你想要操作的内核对象。这里的内核对象包括:事件(Event)、线程、进程、Mutex等等。我们最常见的就是文件句柄(file handle)。

另外要注意的是,Handle仅在其所属的进程中才有意义。将一个进程拥有的handle传给另一个进程没有任何意义,如果非要这么做,则需要使用DuplicateHandle(),在多个进程间传递Handle是另外一个话题了,与这里要讨论的无关。

2、进程ID

首先,进程ID是一个32位无符号整数,每个进程都有这样的一个ID,并且该ID在系统范围内是唯一的。系统使用该ID来唯一确定一个进程。

深入些说,系统可能使用进程ID来计算代表该进程的内核对象的基地址(及EPROCESS结构的基地址),具体的计算公式你可以去问微软的OS开发人员。

3、HINSTANCE

HINSTANCE也是一个32无符号整数,它表示程序加载到内存中的基地址。

C 什么是句柄?为什么会有句柄?HANDLE相关推荐

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

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

  2. 【MATLAB】基本绘图 ( 句柄值 | 对象句柄值获取 | 创建对象时获取句柄值 | 函数获取句柄值 | 获取 / 设置 对象属性 | 获取对象属性 )

    文章目录 一.对象句柄值获取 1.句柄值 2.创建对象时获取句柄值 3.函数获取句柄值 4.获取 / 设置 对象属性 二.获取对象属性 1.获取 线 对象属性 2.获取 坐标轴 对象属性 一.对象句柄 ...

  3. c语言编程中句柄无效怎么解决,句柄无效,手把手教你句柄无效怎么解决

    英雄联盟是一款深受广大用户们欢迎的一款网络游戏,不过最近有位用户打开英雄联盟的时候提示句柄无效,无法进入游戏,不知道什么情况,那么运行英雄联盟提示句柄无效怎么解决呢?下面,小编给大家讲解句柄无效的处理 ...

  4. java 窗口鼠标句柄_c#获取窗体句柄模拟鼠标点击

    [实例简介] c#获取窗体句柄模拟鼠标点击实例2012年8月20日23:48:21,代码清楚,有详细注释,希望对大家有用 [实例截图] [核心代码] 获取窗体句柄模拟鼠标点击 └── 获取窗体句柄模拟 ...

  5. matlab怎么更改图形窗口的句柄值,matlab图形句柄属性

    句柄式图形常用函数: (1)get(h)返回句柄值h所指定的图形对象的所有属性名称与相对应的属性值 (2)a = get(h)返回由句柄值h所指定的图形对象的属性结构数组,并且该数组的字段名称就是该对 ...

  6. 在linux中查找运行程序句柄,Linux下查看句柄

    查看各个分区的句柄数 df -ih 查看句柄最大数 ulimit -n 查看23711进程连接句柄数 lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|mo ...

  7. python查看系统句柄数量,linux系统句柄数设置

    1.获取当前系统打开的句柄数 cat /proc/sys/fs/file-nr 1728    0    1620283 其中分别表示已分配文件句柄的数目 / 分配了但没有使用的句柄数目 / 文件句柄 ...

  8. 漫画:对象是如何被找到的?句柄 OR 直接指针?

    小贴士:想要使用并定位 Java 对象,就要用到 Java 虚拟机栈(Java Virtual Machine Stack),它描述的是 Java 方法执行的线程内存模型:每个方法被执行的时候,Jav ...

  9. 小实验:用创建进程()打开计算器,然后关闭进程句柄。再用打开进程(进程ID),使用两次,得到两个进程句柄。实验目的:这两个进程句柄都能控制这个进程吗?通过该试验加深对句柄的理解!!...

    小实验:用创建进程()打开计算器,然后关闭进程句柄.再用打开进程(进程ID),使用两次,得到两个进程句柄.实验目的:这两个进程句柄都能控制这个进程吗? .版本 2 .程序集 窗口程序集1 .子程序 _ ...

  10. limit-进程句柄限制

    在Linux下面部署应用的时候,有时候会遇上Socket/File: Can't open so many files的问题,比如还有Squid做代理,当文件打开数到900多时速能就非常快的下降,有可 ...

最新文章

  1. CSS3 常用属性
  2. FFMPEG音视频同步-音视频实时采集并编码推流-优化版本
  3. js正则贪婪模式_JavaScript正则表达式迷你书之贪婪模式-学习笔记
  4. 大型网站架构利器-CDN技术
  5. cross_val_score 如何对孤立森林_【收藏】森林防火手抄报素材汇总!
  6. 无人车飞速狂飙,黑科技如何为其加油打气?
  7. mysql 表与表之间的条件比对_十六年老司机笔记:MySQL性能优化之必备技能
  8. 【精】沐浴智慧之光:研究查找算法
  9. 5.2 LSTM、GRU tensorflow使用
  10. 33. vmstat
  11. 水晶报表中的主从表结构
  12. 老闪创业那些事儿(外传)——历经世事的魏爷
  13. 区块链:深入浅出零知识证明
  14. 苹果手机备份数据到电脑什么位置 iPhone备份到电脑上的东西在哪里
  15. Oracle dmp文件解析
  16. UVALive 6922 Reverse Polish Notation
  17. Excel根据单元格内容分类并插入空行的方法
  18. untiy 监听屏幕点击 物体(实现)
  19. HTM页面监听Crtl + C 事件
  20. android 杂项-备忘

热门文章

  1. c语言 字符串转整型
  2. 如何用C语言打印出ASCII码表
  3. c语言入门-程序运行的过程
  4. macOS Ventura 正式版发布 苹果官方详解macOS 13 Ventura正式版
  5. php 跨域问题解决方案
  6. C语言队列(排队)先进先出.实现全部函数
  7. 帆软报表使用心得(转)
  8. 我的世界 java错误_我的世界error错误信息 应用程序错误解决方法
  9. Otsu阈值分割详解
  10. spring boot动力电池数据管理系统毕业设计源码301559