请栩栩如生地描绘一下“句柄”这个词,和它的用法
各位好,最近我看书上说,句柄就是控制进程在内存中的一些值,着实令人
费解,相信各位一定有更形象的此来描绘它
回复人:
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