分享
 
 
 

Win32问答之句柄篇

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

请栩栩如生地描绘一下“句柄”这个词,和它的用法

各位好,最近我看书上说,句柄就是控制进程在内存中的一些值,着实令人

费解,相信各位一定有更形象的此来描绘它

回复人: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(张旸)(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分

得到了句柄以后,可以有什么操作?是不是和窗口指针一样的功能?

回复人:

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有