句柄就是void **p
windows下的句柄功能强大,涉及到了win下编程的方方面面,对其解释也含含糊糊,让人很感性,很迷惑。
但句柄无非下C/C++下的产物,再神秘也超不出这个范围,所以我猜想……
做以下猜测:
可以把句柄理解为就是一个指针的指针,windows为了让实际地址隐藏起来,只由操作系统来管理,所以没有把直接的地址给用户,需要间接访问。
比如你申请了一个内存空间(对象),系统返回 p_handle, 可以猜测 p_handle是以下结构:
void *handle_list[NUM]; //句柄链表,这里写为指针数组,由操作系统管理
handle_list[n_using] = new XXX; //申请内存,操作系统管理
p_handle = (HANDLE)& handle_list[n_using]; //给句柄赋值,句柄是指向存放实际内存地址的指针的指针。
总结一句话:
void * p= new XXX;
void ** handle= &p;
这样你可以用p_handle来传达操作的对象,但对象的地址却由操作系统来控制,它可以改变handle_list[n_using]指向的地址,用户却不用关心。
windows对句柄的操作都由函数完成,所以用户自己处理不了句柄,句柄也就成谜了,嘿嘿
休闲之余,大家说说自己的看法。
[解决办法]
//winnt.h#ifdef STRICTtypedef void *HANDLE;#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name#elsetypedef PVOID HANDLE;#define DECLARE_HANDLE(name) typedef HANDLE name#endiftypedef HANDLE *PHANDLE;
[解决办法]
是void*
[解决办法]
句柄就是dword 数值,相当于索引。
用这个索引到当前进程的句柄表,经过计算就可以从表中查询的该对象的地址。
[解决办法]
多写写驱动,看看WRK就明白了