什么是句柄啊?
问题点数:29、回复次数:9Top
1 楼tccb()回复于 2001-12-20 13:13:06 得分 0
当你program时,申请了系统的某些资源,如file,window等等,系统返回这个资源的ID号,即句柄。以后,你可以使用句柄操作系统资源.Top
2 楼glboy(星毅)回复于 2001-12-20 13:26:22 得分 29
好久没来了,呵呵。
handle是一个32位的整数,一般由操作系统管理,唯一标识对象。得到窗口句柄就能够
对窗口进行操作。
受M$的帮助文档以及很多Windows编程书籍的影响,大家对局柄比较普遍的认识是:句柄是一个整数,用以标识Windows对象,句柄不是一个指针……
而实际上,这些不过是M$进行数据封装的幌子而已,下面我们一起来分析一下HANDLE到底是什么。
请先到Windef.h找绝大多数句柄的定义:
DECLARE_HANDLE(HWND);
DECLARE_HANDLE(HHOOK);
……
DECLARE_HANDLE(HGDIOBJ);
DECLARE_HANDLE(HBITMAP);
DECLARE_HANDLE(HBRUSH);
……
typedef HANDLE HGLOBAL;
typedef HANDLE HLOCAL;
……
OK, 现在大家跟我一起翻到Winnt.h,看看DECLARE_HANDLE和HANDLE到底是什么:
#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就是PVOID,也就是无类型指针,
而DECLARE_HANDLE(HWND);就是:
struct HWND__ {
int unused;};
typedef struct HWND__ *HWND;
现在实际上都清楚啦,这些Handles都不过是指向struct的指针,至于这个struct的用处,连M$都说unused了,^o^
现在解释下M$这么做的意义,这就是所谓数据封装,你可以在你的程序中把M$的内部结构指针传来传去,可是你却不知道它到底指向的内容是什么,而且可以编个句柄的瞎话防止大家的质疑:)。而M$的程序大可以这么写:
#include <windows.h> //这个和大家用的一样
#include "windows_in.h" //这个是M$自用的,外人别想看到^o^
HSOMETHINGELSE DoSomething(HSOMETHING hSomething) {
struct RealSomething* p = (struct RealSomething*)hSomething; //先强制类型转换成内部结构指针
……do something……
return (HSOMETHINGELSE)pRealSomethingElse;//强制类型逆转换
}
Top
3 楼yinx(新星知我心)回复于 2001-12-20 13:27:41 得分 0
windows管理系统资源使用的东东,看看windows api就知道了Top
4 楼sandj(不了)回复于 2001-12-20 13:29:27 得分 0
同意!
实际上就是一个代号了。
英文中应该是HANDLE,
我在申请域名的时候就给了一个HANDLE,说以后我会需要这个HANDLE,
当时还迷糊干吗给我一个“把手”,后来慢慢明白,就类似于一个“USERNAME”
在数据库中有一堆资料和这个HANDLE相对应。
而我在以后使用的时候就可以简单的只提供这个 HANDLE 就可以了。Top
5 楼scsi(技术蚯蚓)回复于 2001-12-20 17:18:14 得分 0
所谓句柄,
就是跟你的那一根柄差不多,
只要你抓住了这一根柄,
你就可以想做你自己想做的事情了.
就这么简单.
do u understand?Top
6 楼xiaodaoren(*)回复于 2001-12-21 11:35:32 得分 0
对!glboy(星毅)说的全! Top
7 楼profwy(profwy)回复于 2001-12-21 12:11:26 得分 0
见识了Top
8 楼gyyggyy(方西瓜)回复于 2001-12-21 17:09:10 得分 0
我怎么给你们分数啊?Top
9 楼gyyggyy(方西瓜)回复于 2001-12-21 17:11:20 得分 0
我怎么给你们分数啊?Top