Win32问答之句柄篇

类别:VC语言 点击:0 评论:0 推荐:
请栩栩如生地描绘一下“句柄”这个词,和它的用法
各位好,最近我看书上说,句柄就是控制进程在内存中的一些值,着实令人
费解,相信各位一定有更形象的此来描绘它    回复人: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([email protected]) (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(张旸) (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:[email protected] 欢迎来信共同探讨!!!  回复人: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([email protected]) (2001-2-2 10:49:00) 得0分 打个不恰当的比方:就像身份证号码。  回复人:zhg_gl(老猪) (2001-2-2 10:56:00) 得0分 得到了句柄以后,可以有什么操作?是不是和窗口指针一样的功能?  回复人:

本文地址:http://com.8s8s.com/it/it3860.htm