【前言1】已经感受到了杀气,看来来者不善,看来后续的斗争之路要多加小心。
【前言2】这篇文章备受好评,但是感觉进程ID和HINSTANSE说不是很清楚:)
【link】http://www.cppblog.com/mymsdn/archive/2009/02/19/handle-in-windows.html
从广义上,能够从一个数值拎起一大堆数据的东西都可以叫做句柄。句柄的英文是"Handle",本义就是"柄",只是在计算机科学中,被特别地翻译成"句柄",其实还是个"柄"。从一个小东西拎起一大堆东西,这难道不像是个"柄"吗?
然后,指针其实也是一种"句柄",只是由于指针同时拥有更特殊的含义——实实在在地对应内存里地一个地址——所以,通常不把指针说成是"句柄"。但指针也有着能从一个32位的值引用到一大堆数据的作用,这不是句柄又是什么?
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来唯一确定一个进程。
深入些说,系统可能使用进程ID来计算代表该进程的内核对象的基地址(及EPROCESS结构的基地址),具体的计算公式你可以去问微软的OS开发人员。
3、HINSTANCE
HINSTANCE也是一个32无符号整数,它表示程序加载到内存中的基地址。
分享到:
相关推荐
Handle(句柄小助手)是一款绿色免费的窗口句柄获取工具,该软件可以获取到指定窗口及与其相关窗口的句柄信息,这其中包括了窗口句柄、窗口关系、窗口类名、标题、进程名称、进程ID、路径、大小和状态,还可以修改标题...
Handle Tracer是一个英文的、免费的进程句柄获取查看 跟踪查看进程句柄的小工具 [10-05-2011] - v1.2.0.0 Added Accept EULA Updated Help File Minor fixes [04-03-2011] v1.0.0.0 Initial release
查看句柄,获取HANDLE,用于windows编程获取某窗口句柄
从打开的文件句柄获得文件的路径.根据HANDLE获得文件路径
列出打开了某个文件句柄的进程,找出谁在使用某个文件.zip
枚举当前系统的所有已打开文件的句柄及路径.zip
查看window文件句柄信息有用工具。协助开发人员查看句柄使用情况。
函数功能 在窗口列表中寻找与指定条件相符的第一个子窗口 。...如果函数成功,返回值为具有指定类名和窗口名的窗口句柄。如果函数失败,返回值为NULL。 若想获得更多错误信息,请调用GetLastError函数。
如何知道进程打开了哪些文件句柄handle
获取到qml窗口句柄的方法,以及怎样将QWidget嵌入到获取到的qml窗口中
得到指定进程所占用的句柄数handle_NtQueryInformationProcess第二个参数为20.zip
vc获取窗体句柄gethandle.pdf
1、在软件内有一个大的圆形图标,用鼠标左键进行拖拽到指定文件上会显示文件的所有属性 但不能左键一直拖动超过10秒,必须要松开一下在进行拖拽,否则会自动闪退,可能是因为电脑的性能问题导致的 2、软件内有十个...
易语言枚举进程所有句柄源码,枚举进程所有句柄,获取系统所有句柄信息,获取句柄名,获取句柄类型,获取句柄引用数,List,Count,GetItem,GetCurrentProcessId,GetCurrentProcess,RtlMoveMemory_SYSTEM_HANDLE_INFORMATION...
易语言根据图像取句柄源码,根据图像取句柄,释放图像句柄,获取图像句柄,Release,get_Type,get_Handle,GlobalAlloc,GlobalLock,RtlMoveMemory_字节集,GlobalUnlock,CreateStreamOnHGlobal,OleLoadPicture,CopyImage,...
绘图函数将不同的曲线或曲面绘制在图形窗口中,而图形窗口是由不同的对象(如:坐标轴、曲线、曲面、文字等)组成的图形界面。matlab给每个图形对象分配一个标识符,称为句柄。
接口的设计在协同开发工程落地中是必不可少的,对于 C++ 来说,用类成员函数做接口的比较多,对于 C 来说,我觉得用 handle 来设计接口很优雅,且网络上相关介绍资源并不多,故分享一下 欢迎下载参考、使用
C++中句柄和指针的区别,从广义上,能够从一个数值拎起一大堆...句柄的英文是"Handle",本义就是"柄",只是在计算机科学中,被特别地翻译成"句柄",其实还是个"柄"。从一个小东西拎起一大堆东西,这难道不像是个"柄"吗?
Delphi获取鼠标指定的空间的句柄,并获取控件的类名和属性值。鼠标拖动点击的特效,非常实用,功能简单,自己开发勿喷。