介绍句柄前,先介绍指针。
或许你知道,指针的内容就是一个内存地址 ,通过指针的值,能找出所指向地址中的内容。
但很容易忽略的一点是:这个“内存地址”并不是真正的内存地址,而是经过操作系统映射过的。
做个实验,用VC分别创建两个工程,在工程一中创建一个整型指针 int *p1 = 123; watch窗口看到这个p1 的值为
0x00d30000 ;调试工程二, 打开view->Debug windows->memory, 输入0x00d30000 ,能看出在工程二里,0x00d30000 地址的内容不是123.
所以说,指针指向的是虚拟内存。
>>>>>>
现在开始说句柄,句柄的类型是HANDLE,
typedef void *HANDLE;
所以,HANDLE是指针类型。CreateFile(), CreateFileMapping()等函数返回值的类型是句柄类型。这些API函数返回的句柄指向了真正的内存地址,是由操作系统来管理的,因为内存的分配,常常会把某内存块的内容移动到另外的内存块中,当操作系统会把地址的改动报告给句柄。
另外,上面说的API返回的句柄值的地址内容是受到保护的,我们不能够接直访问得到,比如int a = *handle; 系统提示Access Violate错误。