当前位置:首页 > 数码 >

句柄是什么(句柄通俗易懂的解释)

来源:原点资讯(www.yd166.com)时间:2024-06-23 17:38:23作者:YD166手机阅读>>

句柄是什么,句柄通俗易懂的解释(1)

任务管理器截图

上图中的内容相信大家都见过,红色框框中的句柄到底是什么,不知道大家有没有产生过疑问。今天我就来讲讲句柄。

由于windows是支持虚拟内存机制的(不明白的请先行补充一下),这就导致某对象在一次换进患出后的地址几乎不可能一致。为解决这个问题,Windows引入了句柄。

系统为每个进程分配一定大小的内存区域来存放句柄,即一个个64bit的无符号整数值。每个无符号整数值相当于一个指针,指向内存中的另一个区域(设为area),当对象的位置发生变化时,area的值被更新为此刻对象在内存中的地址。这样,只要我们掌握了句柄的值就可以找到区域area,进而找到对象。而句柄的值在程序的一次运行过程中是不会改变的,操作系统以句柄来寻找对象。

我们从一些头文件,以及一些windows早期的代码中看一看句柄的定义

在Winnt.h头文件中定义了通用句柄:

  1. #ifdef STRICT
  2. typedef void *HANDLE;
  3. #define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
  4. #else
  5. typedef Pvoid HANDLE;
  6. #define DECLARE_HANDLE(name) typedef HANDLE name
  7. #endif
  8. typedef HANDLE *PHANDLE;

在Windef.h种定义来特殊句柄:

  1. #if !defined(_MAC) || !defined(GDI_INTERNAL)
  2. DECLARE_HANDLE(HFONT);
  3. #endif
  4. DECLARE_HANDLE(HICON);
  5. #if !defined(_MAC) || !defined(WIN_INTERNAL)
  6. DECLARE_HANDLE(HMENU);
  7. #endif
  8. DECLARE_HANDLE(HMETAFILE);
  9. DECLARE_HANDLE(HINSTANCE);
  10. typedef HINSTANCE HMODULE; /* HMODULEs can be used in place of HINSTANCEs */
  11. #if !defined(_MAC) || !defined(GDI_INTERNAL)
  12. DECLARE_HANDLE(HPALETTE);
  13. DECLARE_HANDLE(HPEN);
  14. #endif
  15. DECLARE_HANDLE(HRGN);
  16. DECLARE_HANDLE(HRSRC);
  17. DECLARE_HANDLE(HSTR);
  18. DECLARE_HANDLE(HTASK);
  19. DECLARE_HANDLE(HWINSTA);
  20. DECLARE_HANDLE(HKL);

句柄是什么,句柄通俗易懂的解释(2)

内存与句柄

可以看出,通用句柄时一个void指针,显然是一个马甲,微软并不想泄露句柄的真实类型。当然,微软还是一不小心在其他地方泄露来句柄的本质。如果你定义一个强制类型检查STRICT,又定义了特殊类型句柄DECLARE_HANDLE,对于诸如DECLARE_HANDLE(HMENU)定义如下:

  1. typedef struct HMENU__
  2. {
  3. int unused;
  4. } *HMENU;

守得云开见日出了,句柄实际上是一种指向结构题的指针。一些大神猜测Windows的句柄结构类似如下:

  1. struct
  2. {
  3. int pointer; //指针段
  4. int count; //内核计数段
  5. int attribute; //文件属性段:SHARED等等
  6. int memAttribute; //内存属性段:MOVABLE和FIXED等等
  7. ...
  8. };

句柄是什么,句柄通俗易懂的解释(3)

内存管理器工作原理

在Windows系统中,内存管理器管理的直接对象就是句柄,以句柄管理指针。当Windows系统内存整理时检测内存属性端段,当可移动时,就移动逻辑地址,移动完之后更新新的地址到对应句柄的指针段中,当使用MOVABLE地址时必须LOCK,计数器将 1,内存管理器检测到计数器>0则不移动逻辑地址,此时才可获得固定的逻辑地址来操作无力内存,使用完之后再UNLOCK进行操作,内存管理器就可以再次移动逻辑地址来,所以在虚拟内存管理机制不会出现访问混乱的情况

感谢图片提供者

,

栏目热文

句柄通俗点讲什么意思(句柄是一个什么类型的值)

句柄通俗点讲什么意思(句柄是一个什么类型的值)

1 通俗化理解句柄句柄(Handle)是一个32位(4个字节,64位程序中为8字节)的无符号整数,实际上是Windows...

2024-06-23 17:00:21查看全文 >>

美不胜收的意思是什么(无与伦比美不胜收的意思)

美不胜收的意思是什么(无与伦比美不胜收的意思)

1. 美不胜收:美好的东西太多,来不及一一接受或欣赏。2. 美成在久:美好的事物成功于持久的努力。3. 美轮美奂:形容房...

2024-06-23 17:14:12查看全文 >>

妙趣横生和美不胜收造句(二年级两全其美怎么造句子)

妙趣横生和美不胜收造句(二年级两全其美怎么造句子)

以宽博的君子胸怀,以从容的儒雅之风,万里黄河在东营奔流入海。兵圣孙子在这里诞生,胜利油田在这里崛起,生态保护和高质量发展...

2024-06-23 17:21:02查看全文 >>

美不胜收的造句怎么造(美不胜收造句一年级简单)

美不胜收的造句怎么造(美不胜收造句一年级简单)

记者近日在洪湖公园看到,这里的落羽杉林针叶转红,色彩浓郁,层林尽染,飘落的红色针叶铺满大地,在阳光的照耀下犹如童话世界。...

2024-06-23 17:29:25查看全文 >>

怎么判断句柄有用(怎么知道句柄的位置)

怎么判断句柄有用(怎么知道句柄的位置)

自定义的句柄封装类要创建自定义的句柄封装类以提供更高级的句柄管理功能,可以继承SafeHandle类并重写一些方法。下面...

2024-06-23 16:50:31查看全文 >>

句柄是指针吗(句柄是什么意思通俗易懂)

句柄是指针吗(句柄是什么意思通俗易懂)

小编工作的单位性质偏向于服务制造。大家都知道,中国的高端装备基本都依赖进口,而其自带CAM软件一般都是全封闭的,不开放A...

2024-06-23 17:23:12查看全文 >>

什么叫窗口的句柄(关闭句柄是关闭了程序吗)

什么叫窗口的句柄(关闭句柄是关闭了程序吗)

昨天小编只是在微头条随手发了一条关于句柄的内容,没想到居然很多人感兴趣,由于微头条的结构限制并不能很好的将句柄讲清楚,今...

2024-06-23 17:29:31查看全文 >>

句柄是用来干嘛的(什么是句柄图片)

句柄是用来干嘛的(什么是句柄图片)

这篇接着聊句柄,也只是初步的介绍与理解,句柄深究起来其实很深奥~~。在上篇我们提到过句柄的概念:输入或输出数据流的位置被...

2024-06-23 17:06:50查看全文 >>

句柄名称由来(句柄是什么意思通俗易懂)

句柄名称由来(句柄是什么意思通俗易懂)

匈牙利命名法由来 该命名规范,要求前缀字母用变量类型的缩写,其余部分用变量的英文或英文的缩写,单词第一个字母大写。Exi...

2024-06-23 17:36:20查看全文 >>

文档排行