"句柄的概念和实现机理"
句柄是 Windows 操作系统中用来标识被应用程序所建立或使用的对象的唯一整数。它有点象 C 语言中的文件句柄,用于标识对象或者项目,每个对象或者项目都有一个不同的句柄。从数据类型上来看,句柄只是一个 16 位的无符号整数。
应用程序几乎总是通过调用一个 Windows 函数来获得一个句柄,之后其他的 Windows 函数就可以使用该句柄,以引用相应的对象。句柄是一种指向指针的指针,我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。
Windows 操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows 内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。
句柄的实现机理可以用以下公式来表示:
句柄地址(稳定)→记载着对象在内存中的地址────→对象在内存中的地址(不稳定)→实际对象本质
句柄的具体含义受 M$ 的帮助文档以及很多 Windows 编程书籍的影响,大家对句柄的认识是:句柄是一个整数,用以标识 Windows 对象,句柄不是一个指针。但实际上,这些不过是 M$ 进行数据封装的幌子而已。
句柄的定义可以在 Windef.h 中找到,DECLARE_HANDLE macro 是用来定义句柄的类型的,例如 DECLARE_HANDLE(HWND); DECLARE_HANDLE(HHOOK); …… DECLARE_HANDLE(HGDIOBJ); DECLARE_HANDLE(HBITMAP); DECLARE_HANDLE(HBRUSH); ……
typedef HANDLE HGLOBAL;
typedef HANDLE HLOCAL;
……
HANDLE 是一个无类型指针,DECLARE_HANDLE macro 只是将句柄定义为一个 struct 的指针,例如:
struct HWND__ { int unused; };
typedef struct HWND__ *HWND;
句柄的实现机理可以用来解决 Windows 操作系统中对象的内存管理问题,使得应用程序可以间接地访问对象,而不需要知道对象在内存中的实际地址。
句柄是 Windows 操作系统中用来标识对象的唯一整数,通过句柄可以间接地访问对象,而不需要知道对象在内存中的实际地址。