句柄 Handle

句柄类似于指向指针的指针

进程通过句柄找到对象指针,进而访问该对象

HANDLE类型其实就是void* 类型

Windows系统中有许多内核对象,比如打开的文件、创建的线程、程序的窗口等等。这些重要的对象肯定不是4个字节或者8个字节足以完全描述的,它们拥有大量的属性。为了保存这样一个"对象"的状态,往往需要上百甚至上千字节的内存空间,那么怎么在程序间或程序内部的子过程(函数)之间传递这些数据呢?拖着这成百上千的字节拷贝来拷贝去吗?显然会浪费效率。那么怎么办?当然传递这些对象的首地址是一个办法,但是这样的话暴露了内核对象本身,使得程序也可以任意地修改对象的内部状态(首地址都知道了,还有什么不能改的?),这显然是操作系统内核所不允许的。

所以,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来唯一确定一个进程。

句柄 Handle

时间: 2024-11-09 22:41:50

句柄 Handle的相关文章

句柄handle c++

1.句柄是什么? 在windows中,句柄是和对象一一对应的32为无符号整数值.对象可以映射到唯一的句柄,句柄也可以以映射到唯一的对象. 2.为什么我们现在需要句柄? windows需要向程序员提供必要的编程接口,在这些编程接口中,允许程序员访问.创建和销毁对象.但是,出于封装性考虑,windows并不想向coder返回指针.指针包含了太多的信息.首相,指针给出了对象存储的exact adds:其次,要操作一个指针,coder必须知道指针所指对象的内部结构特征,that's to say,win

$cast使用,父类与子类句柄(handle)的关系

?The handle of a child class can be assigned to a parent handle without any problem. ?Using $cast to assign the handle of a parent class to a child handle. class Parent; int m1 = 2; endclass class Child extends Parent; int m2 = 5; endclass initial be

深入了解Windows句柄到底是什么(句柄是逻辑指针,或者是指向结构体的指针,图文并茂,非常清楚)good

总是有新入门的Windows程序员问我Windows的句柄到底是什么,我说你把它看做一种类似指针的标识就行了,但是显然这一答案不能让他们满意,然后我说去问问度娘吧,他们说不行网上的说法太多还难以理解.今天比较闲,我上网查了查,光是百度百科词条“句柄”中就有好几种说法,很多叙述还是错误的,天知道这些误人子弟的人是想干什么. 这里我列举词条中的关于句柄的叙述不当之处,至于如何不当先不管,继续往下看就会明白: 1.windows 之所以要设立句柄,根本上源于内存管理机制的问题—虚拟地址,简而言之数据的

深入了解Windows句柄到底是什么

原文链接:http://blog.csdn.net/wenzhou1219/article/details/17659485[侵删] 目录(?)[-] 虚拟内存结构 句柄结构 总是有新入门的Windows程序员问我Windows的句柄到底是什么,我说你把它看做一种类似指针的标识就行了,但是显然这一答案不能让他们满意,然后我说去问问度娘吧,他们说不行网上的说法太多还难以理解.今天比较闲,我上网查了查,光是百度百科词条"句柄"中就有好几种说法,很多叙述还是错误的,天知道这些误人子弟的人是想

Matlab中函数句柄@的作用及介绍

问:[email protected](x)acos(x)表示什么意思?其中@代表什么?答:表示f为函数句柄,@是定义句柄的运算符.[email protected](x)acos(x) 相当于建立了一个函数文件:% f.mfunction  y=f(x)y=acos(x); 若有下列语句:[email protected](x)1/2.*(x==-1/2)+1.*(x>-1/28&x<1/2)+1.2.*(x==-1/2); 则相当于建立了一个函数文件: % xsqual.m fun

句柄详解

1.什么是句柄句柄是windows用来标识应用程序实例使用的对象的唯一整数.类似C语言中的文件句柄. 句柄的本质是一种指向指针的指针.应用程序启动后,组成这个程序的各对象是驻留在内存的.那是否我们获知了这个内存的首地址,就可以随时用这个地址访问对象呢?答案是否定的,因为windows是一个以虚拟内存为基础的操作系统,在这种系统环境下,windows内存管理器经常在内存中来回移动对象,依此满足各种应用程序的内存需要.对象被移动意味着它的地址变化了.那我们该如何去找这个对象呢? windows为各应

获取真正的进程/线程句柄

首先在开始正文之前先介绍最简单的获取进程/线程句柄方法.那就是可以在创建进程/线程时获取句柄. 创建进程/线程是获取句柄. //进程创建函数 BOOL CreateProcess( PCTSTR pszApplicationName, PTSTR pszCommandLine, PSECURITY_ATTRIBUTES psaProcess, PSECURITY_ATTRIBUTES psaThread, BOOL bInheritHandles, DWORD fdwCreate, PVOID

Windows中句柄和ID的区别

VC++菜单的句柄也可以理解成菜单的识别符(ID). 但如果指菜单项的ID, 那可能又是一回事了.按我的理解:  1. 句柄是程序运行中系统为其分配的,菜单项ID是编程者自己定义指定的.一般可在资源文件中定义也可在动态创建菜单时指定,程序中引用.  2. 菜单的句柄是属于菜单的,菜单项ID是属于菜单中某一个菜单项的.编程者通过菜单的句柄访问菜单,通过ID进行菜单项识别并进行消息处理.  3. 菜单的句柄类型是HMENU, 菜单项ID的类型是UINT(无符号整型).当然这两种类型本质上并无差别,但

句柄的概念

1.这里将句柄所能标识的所有东西(如窗口.文件.画笔等)统称为“对象”. 2.图中一个小横框表示一定大小的内存区域,并不代表一个字节,如标有0X00000AC6的横框表示4个字节.    程序运行到某时刻的内存快照               程序往后运行到另一时刻时的内存快照 Windows是一个以虚拟内存为基础的操作系统,很多时候,进程的代码和数据并不全部装入内存,进程的某一段装入内存后,还可能被换出到外存,当再次需要时,再装入内存.两次装入的地址绝大多数情况下是不一样的.也就是说,同一对象