- 就是一个指针
在32位windows中占用4个字节 它指向内存的尺寸由它的类型决定 函数用句柄来传递数据
- 句柄在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 STRICT修饰符的意思是变量类型是否要求严格定义。在这里,我们可以看到HANDLE其实就是一个void类型的指针。这样有什么用呢?学过c/c++语言的人都知道,void类型的指针可以通过强制类型转换变为任何类型的指针,使用最灵活。 在很多情况下,句柄是一个对象的指针,或者说是地址,一个对象的地址。比如对于分配的一个内存块(对象),它的句柄就是它的首地址,这没什么问题。 但是这并不总是成立的,对于没有对象意义的句柄尤其如此。这就取决与系统的定义了。比如系统钩子的类型HHOOK,说它是地址就没有任何意义。对于窗口句柄也是如此。在这些情况下,我们可以把句柄理解为某事物在系统该类事物列表中的ID。 是不是加点分呀?我从来没回答过50分以下的题目。:)
- 句柄是对象的索引,这样隐藏了危险的地址信息,同时也使系统对象和应用程序隔离。
- 句柄,你可以把他想象成一个把子,让别人来拎的把子.至于怎么来拎,是操作系统的事情
句柄不是指针,作为内核对象他是系统一个内核对象指针的索引.可以间接的认为他是指针的指针. 呵呵,说不清楚,关键是不同的句柄,有不同的处理方法 你需要知道的是如何得到一个句柄,然后保存他,在需要的地方把他作为参数传给函数就可以了,具体是什么其实不需要知道:)
- 在32位Windows中,“句柄不是指针”这句话已经不再成立了,比如GlobalAlloc()等内存分配函数返回的句柄实际就是该内存的地址。因此才不需要使用GlobalLock()来锁定句柄以得到地址。这些东西n年以前在MSDN中就说明了。
事实上,有实际对象意义的东西(占用一段存储器),比如上面说的内存的句柄基本就是地址。其它没有对象意义的东西是系统索引。这些你只要看看Windows的那几个头文件就能理解了。 说句题外话,如果没有看过Windows标准头文件和MFC源程序就不能算是真正的Windows程序员。撑死是一个合格的c/c++程序员。
|