句柄详解


1.什么是句柄
句柄是windows用来标识应用程序实例使用的对象的唯一整数。
类似C语言中的文件句柄。

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

windows为各应用程序腾出一块固定的内存,用于记录各应用对象在内存中的地址变化,windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。我们只需要记住这个句柄地址就可以间接知道对象具体在内存中的位置。这个句柄地址是对象装载时由系统分配的,当系统卸载时又释放给系统。

由上可知,windows程序并不是用物理地址来标识一个内存块的,相反的,windows给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。

2.句柄的类型
在windef.h文件中可以找到大多数句柄的定义:

DECLARE_HANDLE(HWND);

DECLARE_HANDLE(HHOOK);

……

DECLARE_HANDLE(HGDIOBJ);

DECLARE_HANDLE(HBITMAP);

DECLARE_HANDLE(HBRUSH);

……

typedef HANDLE HGLOBAL;

typedef HANDLE HLOCAL;

……

那么类型DECLARE_HANDLE和HANDLE具体都是什么类型呢?
winnt.h中,可以看到这两种类型的定义

#ifdef STRICT

typedef void *HANDLE;

#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name

#else

typedef PVOID HANDLE;

#define DECLARE_HANDLE(name) typedef HANDLE name

#endif

typedef HANDLE *PHANDLE;

可知,句柄HANDLE是无类型指针类型的。
句柄指针指向的是一个指针,这个指针指向的任意对象类型。我们可以通过句柄找到这个指针,然后找到指向的对象。

原文地址:https://www.cnblogs.com/shijingjing07/p/6536045.html