Win32问答之句柄篇
请栩栩如生地描绘一下“句柄”这个词,和它的用法 |
各位好,最近我看书上说,句柄就是控制进程在内存中的一些值,着实令人 费解,相信各位一定有更形象的此来描绘它 |
回复人:vc60(vc60) (2001-2-19 11:53:00) | 得0分 |
进程管理一个数组来维护对象,每个对象占有一定内存。 句柄就是数组中的索引号 | |
回复人:crackx(世界末日) (2001-2-19 12:11:00) | 得0分 |
句柄和程序就像是门把和门一样,只有抓门把才能方便快捷的打开门,对吧。 | |
回复人:losthere(无忌) (2001-2-19 12:25:00) | 得0分 |
就像门牌号,如果你连门牌号都不知道,你能找到房子吗? | |
回复人:wwm(wwm) (2001-2-19 12:48:00) | 得0分 |
是一很宽泛的概念,跟地址类似,说到家就是一些标记来记录各类软硬件的资源,这好比人的名字一样。 | |
回复人:jackl(jackl) (2001-2-19 13:05:00) | 得0分 |
最形象的比喻,对象是苹果而句柄就是苹果把儿(抄来的:)) | |
回复人:hproof(好逍遥) (2001-2-19 13:21:00) | 得0分 |
是不是就可以简单的理解为“指针”/? | |
回复人:classfactory(void) (2001-2-19 13:59:00) | 得5分 |
但愿以后没有人再问这样的问题。参考以下伪代码: typedef struct tagWND { LPCTSTR lpszClassName; WNDPROC lpWndProc; UINT uStyle; UINT uExStyle; LPCTSTR lpszTitle; RECT rcWindow; RECT rcClient; .... } WND, *LPWND; typedef HWND LPWND; // 给用户的头文件中则可以定义HWND为HANDLE,或DWORD。 在上面的例子中,窗口结构向用户隐藏,你只能通过HWND句柄使用系统调用来完成窗口操作。而在系统内部,则直接使用这个结构(为了提高效率)。如以下伪码: BOOL GetWindowRect(HWND hWnd, LPRECT lpRect) { LPWND lpWnd32 = (LPWND)hWNd; // 首先应该判断地址是否合法,这里略 *lpRect = lpWnd->rcWindow; return TRUE; } 在很多场合下句柄应该是个指针。当然,在一些情况下也可能是数组的索引。这取决与系统的定义。引入句柄可以屏蔽掉系统的内部实现,对于系统的稳定、健壮意义巨大,使系统易于升级。这一点通过Win16到Win32的平滑过渡即可看出。不过,句柄的引入也给理解带来了一定的困难。 | |
回复人:stephenxue(小雨) (2001-2-19 14:23:00) | 得0分 |
我是VC菜鸟,我想问一下关于这段伪代码: 之前已经将LPWND定义为tagWND型的指针,而后又将其定义为HWND,会不会类型重复定义? 还有你说的“用户”是指的“程序员”还是“程序的用户”? | |
回复人:111222(111222@0451.com) (2001-2-19 15:25:00) | 得0分 |
句柄就好象是一个人的把柄,你想“操纵”一个人就先抓住他的把柄,然后,“胁迫”他做事...... 操作一个窗口就先抓住句柄,然后该干什么就干什么喽! | |
回复人:mkq2000(杰) (2001-2-19 15:28:00) | 得0分 |
classfactory , a perfect guy | |
回复人:classfactory(void) (2001-2-19 15:48:00) | 得5分 |
To stephenxue(小雨):你没用过条件编译吗? #ifndef #define XXX xxxx #endif 我可能说话有点词不达意,见谅!我这里的“用户”指的是使用Windows API编程的程序员。 另外,在commctrl.h中有类似的定义,这可是真实的,不是伪代码: struct _IMAGELIST; typedef struct _IMAGELIST NEAR* HIMAGELIST; 在Windows系统中,HANDLE大致有两种:系统的和进程的。系统的对象是在系统堆中分配内存,由系统统一管理。这可以保证对象的句柄是全局唯一的。而进程的对象通常是在进程的堆中分配内存。他们的句柄只在进程中有意义。 看来如果Microsoft不公开源代码的话,类似这种讨论将永远是“长盛不衰”的话题,呵呵。 | |
回复人:wjf(ww) (2001-2-19 20:52:00) | 得0分 |
MSDN里有篇技术文章叫give a handle, i will show you an object,不错的. | |
回复人:jiang_jixuan(qq犀牛) (2001-2-20 10:39:00) | 得0分 |
可以理解为地址!其实就是地址! | |
回复人:yarao(龙江老三) (2001-2-20 12:32:00) | 得2分 |
把局柄理解为地址是一种非常错误的看法!在Jeffer Richter的 《Advance Windows》的 第一章中有这种描述: 每一个进程都有一张Process Handle Table 里面纪录者进程打开 的所有内核对像的信息包括内核对象的局柄和内核对象的指针,这个所谓的局柄就是这张 Process Handle Table(其实就是一个纪录结构的数组)的索引。当你把局柄传给相应的 API函数时。API通过你的Process Handle Table的索引找到相应的对象地址的指针然后进行 操作的。 | |
回复人:llshore() (2001-2-20 13:36:00) | 得2分 |
句柄与指针确实是完全不同的两个概念。 句柄仅仅是一个32位整数,WIN32中用于标记某个系统或进程的对象,可以理解为对象索引(由于M$未完全公开相关技术,在一定程度上只能如此理解),象楼上说的《Advance Windows》中说的,但我觉得这个索引更像是一种映射关系,而不是纯粹意义上的“数组下标”。 | |
回复人:visual() (2001-2-20 14:28:00) | 得0分 |
csdn上有人说过:牧童遥指杏花村。 牧童的手为指针,杏花村的牌子为句柄,杏花村酒店为对象的实例. | |
回复人:classfactory(void) (2001-2-20 15:31:00) | 得2分 |
好深奥的比喻呀!俺得回去捉摸捉摸。 我最后再做一些分析,如下: 单从概念上讲,句柄指一个对象的标识,而指针是一个对象的首地址。从实际处理的角度讲,即可以把句柄定义为指针,又可以把它定义为同类对象数组的索引,这两种处理方法都有优缺点,至于选用哪种方式,完全应该看实际需要,这可以说是一种程序设计上的技巧。那种单纯认为句柄是指针或索引的想法都是机械的、不确切的。 其实,在Windows中类似的处理是很多的、很灵活的。再具个相似的例子: 我们知道,在Windows中有个函数叫做CallWindowProc。故名思义,它的作用就是向指定的窗口过程传递一个消息。你也许会想,既然我已经有了窗口过程的指针,为什么我不可以直接通过这个指针调用该函数(这是C语言的内建功能)?事实上,在Win16中确实可以这么做,因为GetWindowLong返回的确实是该函数的指针。但在Win32下,GetWindowLong返回的并不是该函数的指针,而是一个包含函数指针的数据结构的指针(MSDN上说返回的是一个窗口函数地址或它的句柄,就是指的这种情况)。该数据结构是可变的,但只要你使用CallWindowProc来调用的话是不会出错的。这里我们又看到使用句柄处理带来的好处。(补充说明一点:微软在这里之所以这么处理,是为了解决16位/32位以及ANSI/UNICODE的转化问题) 神呀,救救那些头脑呆板、一知半解的人吧! | |
回复人:kiss2() (2001-2-20 17:47:00) | 得0分 |
用API函数怎样查找控件为非可视状态时的句柄? | |
回复人:LHA() (2001-2-20 23:06:00) | 得0分 |
我想 句柄!=指针 但是句柄可以是指针。 句柄是一种索引,但它是整数还是指针,取决于具体的系统情况。 | |
回复人:mjk() (2001-2-21 8:03:00) | 得0分 |
句柄就是为了标识一个窗口、设备等等的身份证号码。在应用程序中具有唯一性 | |
回复人:netsong() (2001-2-21 9:04:00) | 得0分 |
曾经有一位大虾将其用一句诗来形容,简直是太妙了----“牧童遥指杏花村”。 你可以搜索一下。 | |
回复人:angband(笨笨) (2001-2-21 11:34:00) | 得0分 |
我的理解,句柄就象男人的那个东西,呵呵。 | |
回复人:ljxfs(肥仔) (2001-2-21 11:56:00) | 得0分 |
笨笨真聪明!我和你想的一样! | |
回复人:3nt(3nt) (2001-2-21 12:42:00) | 得0分 |
把HANDLE 翻成句柄实在是一种拙劣的翻译,也不知是谁开的头,就象第一次看到“向量计算机” 不知到向量指的是什么。 | |
回复人:zy61(张?D) (2001-2-21 12:43:00) | 得0分 |
句柄是指针的指针。 | |
回复人:xcex(可乐瓶) (2001-2-21 13:53:00) | 得0分 |
本来很清楚,越听越糊涂...... | |
回复人:kyokyo(kyokyo) (2001-2-21 14:27:00) | 得0分 |
句柄就是烤叉,用烤炉烤过鸭,鸡,牛,羊,狗么? 炉子里的东西是看不见,摸不到的,但你能用叉子去控制, 至于叉子上的是什么,你放进去前应该记住。呵呵 | |
回复人:kyokyo(kyokyo) (2001-2-21 16:33:00) | 得0分 |
只可意会,不可言传 在实践中慢慢体会吧! | |
回复人:hlqyq() (2001-2-21 18:01:00) | 得0分 |
句柄有时是指针,有时是索引,但他绝对是一把钥匙,内核句柄110的钥匙,GDI句柄是您的钥匙,只对您有效。 | |
回复人:hlqyq() (2001-2-21 18:01:00) | 得0分 |
句柄有时是指针,有时是索引,但他绝对是一把钥匙,内核句柄110的钥匙,GDI句柄是您的钥匙,只对您有效。 | |
回复人:fleg(若有所思) (2001-2-21 18:38:00) | 得0分 |
classfactory(void)兄感谢先,return TRUE; | |
回复人:kincaid(IT苦行僧) (2001-2-21 18:46:00) | 得0分 |
请教句柄是用木头做的还是金属做的? | |
回复人:bluish_fish() (2001-2-21 19:45:00) | 得0分 |
句柄就是控件中可着力的地方。(可操作之处) | |
回复人:yemagxy(野马) (2001-2-21 19:51:00) | 得0分 |
关注。 | |
回复人:jgyhuzhou(小狗狗) (2001-2-21 21:09:00) | 得0分 |
其实就是身份证, | |
回复人:jgyhuzhou(小狗狗) (2001-2-21 21:09:00) | 得0分 |
其实就是身份证, | |
回复人:chinani(chinani) (2001-2-21 22:33:00) | 得2分 |
句柄可以理解为一个正在进行的程序(也就是进程)的身份证号(也就是唯一标识),使系统能够识别每一个正在进行的程序. 进程与程序的关系我可以作一个形象的比喻: 一个人(系统)要做菜,他将做菜的步骤写在纸上(程序),在他按步骤做菜时(也就是这个程序在他(系统)的控制下进行了),这个过程就是进程.在他做菜的途中,他的儿子把手弄伤了;此时,他停下手头的工作(进程被打断),按照包扎步骤给儿子包扎(这个过程又是一个进程),弄好后,他接着做菜,完成被打断的进程. 在上述过程中,他处理了两个程序,那么他怎么样识别这两个程序呢?靠的是句柄,侮一个进程的唯一标识. 我解释的不是很确切,但易于理解.最后,准确的解释一下程序与进程: 要完成的步骤是程序,按步骤进行时,此时应称程序为进程(现在进行时).你能指出上述比喻不确切的地方吗? E_MAIL:CHINANI@ETANG.COM 欢迎来信共同探讨!!! | |
回复人:CAYU(中原) (2001-2-21 22:59:00) | 得0分 |
句柄: 就是代表你的东西,你最重要的部位,抓住了你的“句柄”,你就听我的吧。。。 | |
回复人:onion(葱头) (2001-2-25 17:57:00) | 得2分 |
不能理解为指针,我原来也以为是指针,看了API的老书才明白过来。但是功用类似于指针。是个标记。更具体的描述去看旧书吧,南开大学有一本旧书,这方面说的清楚。 | |
回复人:peasant() (2001-2-25 21:37:00) | 得0分 |
句柄不就是门牌号码嘛 | |
回复人:neatcat(细雨) (2001-2-25 22:10:00) | 得0分 |
好好看看windows内存管理,就会明白 | |
回复人:kovaschi(kovaschi) (2001-3-1 10:28:00) | 得0分 |
回复贴子: | |
回复人:xzjxu() (2001-2-2 10:43:00) | 得0分 |
就是某个东西的代号 | |
回复人:nichang() (2001-2-2 10:46:00) | 得0分 |
比如HWND就是窗口句柄。 若要使用API操作窗口,就要使用HWND来指示你要对哪一个窗口进行操作。 | |
回复人:NowCan(nowcan@21cn.com) (2001-2-2 10:49:00) | 得0分 |
打个不恰当的比方:就像身份证号码。 | |
回复人:zhg_gl(老猪) (2001-2-2 10:56:00) | 得0分 |
得到了句柄以后,可以有什么操作?是不是和窗口指针一样的功能? | |
回复人:
Tags:作者:佚名评论内容只代表网友观点,与本站立场无关! 评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论
本类热门阅览 |