从广义上,能够从一个数值拎起一大堆数据的东西都可以叫做句柄。句柄的英文是"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无符号整数,它表示程序加载到内存中的基地址。
分享到:
相关推荐
在C++编程语言中,句柄和指针是两种核心概念,它们承担着不同的角色,服务于内存中数据的访问与管理。虽然它们在功能上有一定的重叠,即通过一个较小的数据值来引用或控制大量数据,但它们的区别在概念和实际使用上...
VC++中句柄与指针的区别 在VC++中,句柄和指针是两个基本概念,但它们之间的区别却很少被人所了解。本文将对句柄和指针的区别进行详细的阐述,并从多方面对它们进行比较。 首先,指针是内存的编号,通过它我们可以...
"c++句柄、智能指针和指针的区别" 在C++编程中,句柄、智能指针和指针是三个相关但不同的概念。理解它们之间的区别对于初学者来说非常重要。 首先,让我们来讨论指针和句柄的区别。指针是指向物理内存地址的指针...
### C++指针及句柄详解 #### 一、引言 在计算机编程领域,特别是对于像C++这样的强类型语言来说,理解指针是非常重要的。指针是一种特殊的数据类型,它存储的是其他数据的内存地址。掌握指针的使用不仅能够帮助...
#### 五、指针与句柄的区别 1. **直接性**:指针直接指向内存地址,而句柄则通过一个映射表间接指向内存地址。 2. **安全性**:句柄提供了更高的安全性,因为即使句柄泄露也不会直接暴露实际的内存地址。 3. **可...
在C++编程中,句柄类是一种常见的设计模式,它用于封装对底层资源(如对象指针)的访问,提供安全、高效的管理机制。本文将深入探讨如何实现典型的句柄类,特别是在继承和多态环境下的应用。我们将讨论两种常用的...
内存句柄和指针在计算机编程中都是用来访问和操作内存中的对象的工具,但它们在使用和功能上有显著的区别。在Windows编程中,这两者尤其常见。 首先,内存句柄是一个由操作系统分配的唯一标识符,用于识别特定的...
- `GetDocument()`:在视图类中,获取与该视图关联的文档对象的指针。 - `GetActiveView()`:在`CMainFrame`中获取当前活动视图的指针。 - `GetFirstViewPosition()`和`GetNextView()`:在文档类中,获取所有视图...
以下是一个简单的C++句柄类实现示例: ```cpp class Resource { public: // 实际资源的构造和析构 Resource() { /* 初始化资源 */ } ~Resource() { /* 销毁资源 */ } private: // 防止复制和赋值 Resource...
本文旨在详细介绍如何在MFC中获取各种类型的句柄和指针,并提供具体的代码示例。 #### MFC中获取常见类句柄 在MFC开发中,经常需要访问文档类、视图类、框架类和应用程序类等的基本信息。以下是一些常用的方法: 1...
本文主要探讨了C++中的健壮指针和资源管理策略,旨在帮助开发者避免资源泄漏和提高程序的可靠性。 首先,资源是指程序运行过程中获取并需要在后续阶段释放的任何元素,如内存、文件句柄、系统资源等。对于这些资源...
指针在C++中是一个变量,它存储了另一个变量的地址,而在MFC中,类的指针通常用来指向类的对象。句柄则是操作系统用来标识和访问系统资源的一种机制,如窗口、菜单、控件等。 **MFC中获取常见类句柄** 1. **应用...
在C++编程中,指针和资源管理是至关重要的概念,因为它们直接影响程序的稳定性和内存效率。指针是C++中的一种强大工具,能够直接操纵内存,但也可能导致内存泄漏和悬空指针等问题。本篇文章将深入探讨指针的使用准则...
下面我们将深入探讨MFC中句柄与指针之间的转换,以及它们在不同类之间如何交互。 1. **句柄与指针的概念** - 句柄是Windows操作系统用来标识资源的一个整数值,它不是对象本身,而是一个可以用来查找对象的标识符...
2. 指针:指针是C/C++等低级语言中的一个重要概念,在易语言中也有使用。它是一个变量,存储了内存地址,可以用来间接访问存储在特定内存位置的数据。在易语言中,指针通常用于处理底层数据和内存操作,提高程序的...
C++中的智能指针是一种自动管理内存的对象,它们充当原始指针的角色,但同时也负责对象的生命周期管理,以防止内存泄漏和垂悬指针的问题。智能指针的出现主要是为了弥补C++中手动内存管理的缺陷,它借鉴了Java等语言...
句柄类存储和管理基类指针。指针所指的对象的类型可以变化,即可以指向基类对... 2、句柄类决定句柄接口屏蔽还是不屏蔽继承层次,如果不屏蔽继承层次,用户必须了解和使用基本层次中的对象。 我们将定义名为Sale
* LPVOID:在C++中,LPVOID类型是一个指针类型,而在C#中,它对应的是IntPtr或Object类型。 三、其他类型 在C++中,我们还有其他一些类型,如HRESULT、HANDLE、LPARAM等,而在C#中,我们也有相应的类型。下面是C++...
与代理类不同的是,句柄类不会创建一个新的对象,而是将对象的所有权交给调用者。 二、句柄类的实现 在实现句柄类时,我们需要定义一个类,该类拥有一个指针成员变量,用于指向对象的所有权。例如,下面是一个简单...