永发信息网

什么是句柄?举点实际例子呗!!

答案:4  悬赏:0  手机版
解决时间 2021-12-23 09:12
VC++.net 高手的来啊!!!!!!!!!!!
最佳答案
对句柄本质的探讨
我觉得自己对于指针理解比较透彻了,但关于句柄的理解,就容易犯理解成指针的错误.
一般说:句柄是资源(或项目)的唯一标识.
俺觉得这其实说得很不明白的,现在我想问的是句柄到底是怎么标识资源的:
1,句柄在32位机上是32位整型吗?
2,当HANDLE handle;声明句柄时,handle是它的标识符吗?如int a;则a就是标识符.
3,既然句柄是一个整型值,那么,它在内存的什么位置呢?栈上吗?
4,句柄是通过在它所占内存中记录对象在内存中的首地址来"标识"对象的吗?如果是,那与指针在这方面就完全一样了.

可能有点玄,大家谈论下吧.

---------------------------------------------------------------

对句柄的认识
之前在编写MFC程序的时候,有时会碰到句柄这一概念,由于对它一直不是很重视,所以并没有主动去了解它.随着不断深入学习MFC,特别是看完候先生的<<深入浅出MFC>>后,对句柄的实质产生了很大的兴趣,于是到处收集资料,现在总结一下.
handle的中文意思主要有多种,一种是作为名词:柄,把柄;一种是作为动词:处理.硬要从中文意思来说的话,这两种中文意思都可以用来勉强解释句柄.例如一个锅的手柄,你只要抓住了它,你就可以很好地操作那个锅,不过很明显你只能通过锅的手柄来做一些诸如炒菜之类的事,你不可能是因为抓住了锅的手柄才能去看电视.不能的物体都会至少有一个属于它的"手柄".在MFC里面,有很多对象,例如对话框,窗口,画笔,显示器,打印机等,每个对象都会产生一个属于它自己的句柄.oh!慢着,似乎还没说清楚句柄的本质,下面再作详细的解说吧.

如果查看各种HANDLE的定义,如HDC,HPEN,HINSTANCE等等,你会发现有这样一个声明:

DECLARE_HANDLE(HDC);

再把DECLARE_HANDLE这个宏展开来看一下:

#define DECLARE_HANDLE(name) struct name##__ { int unused; };
typedef struct name##__ *name

这是什么意思?用HDC替换上面的name来看看,我们就得到了下面的一段代码:

struct HDC__

{

int unused;

};

typedef struct HDC__ *HDC

oh,原来句柄就是一个指向某一结构的指针,这个结构体只有一个成员,它是一个整数(不知为什么MS要把这个成员叫做unused,难道真的没有用吗?).

嗯,我们再看一个HANDLE的定义,在winnt.h头文件中,我们看到了HANDLE的定义:

typedef PVOID HANDEL;

PVOID是什么?再看它的定义:

typedef void *PVOID;

真相出来了,原来HANDLE不过是一个指向void型,即无类型的指针,嗯,目前的指针是32位的吧.其实也不能说HANDLE是一种指针,它只充当一种索引的作用.真的很难解释HANDLE是什么,再往下看看,只能意会吧,呵呵.

知道了HANDLE的本质(一个32位的整数,用16进制表示),再来说说HANDLE的作用.看我前面第二段的例子,你可以了解到为了控制一个物体,你需要找到它的"手柄".HANDLE就是充当win32下各种"物体"的"手柄".事实上,很多windows API都需要一个HANDLE作为输入参数,这是因为API需要和一些你看不见的对象打交道,这些对象是不能被你所移动或修改的,所以不能给你一个指针来对它进行操作.oh,指针的确是个好东西,它所拥有的能力实在太强大了,但所谓能力越大,责任越大,使用指针的时候千万要小心,不然会造成毁灭性的错误.所以,为了安全,还是给你一个HANDLE吧,通过这个HANDLE,你就可以对那些对象进行一些处理.HANDLE在这里充当什么角色呢?应该算是一个中间人吧,HANDLE是固定的,它不会变,但是对象的地址会变,当对象在内存中的位置发生改变后,我们不能通过之前的对象指针找到对象,怎么办呢?嗯,这时候HANDLE的用处就出来了,HANDLE就是用来记录对象的最新地址的.有点明白了吧?换一种说法吧,嗯,其实就是你知道HANDLE在哪里,但你不知道对象在哪里,而HANDLE知道对象在哪里,所以,只要你知道了HANDLE在哪里,你就能找到对象(尽管你还是不知那个对象住在内存的哪个地方,不过找到它就行了,不是吗?).嗯,是不是有点像索引的作用呢?为什么不给我们知道对象在内存中的位置呢?呵呵,操作系统怕你对它进行一些不利的操作啊.反正你通过HANDLE能让对象做它应该做的事,这就足够了.这就是封装吧,MS最喜欢做的事情,呵呵.

其实对于HANDLE的定义,MS公司也不能说得清清楚楚,把HANDLE翻译成句柄也是不太合适的,但有时就是这样,英文能理解的东西,翻译到中文反而就混乱了,所以"句柄"这个名词比较适合初学者,如我.那些有丰富编程经验的人一定不喜欢使用"句柄"这个名词吧,还是用handle这个原版英文单词比较容易理解
全部回答
就是某个资源(比如一个窗口)在内存中的名字. 就这样理解就行了. 内存中有那么多东西,不给它们取个名字,怎么找得到它们呢?它们的名字就是句柄了.
PH是酸碱性,是液体中活泼性的表现。如果太高太低就是H+和OH-离子过多,会产生各种强烈的化学反应
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
Without the contributions of Qian Xuesen,
读书郎g100初次充电短暂断开
如何扩展手机内存
挖机水散和油散距离是多少公分
下列现象中,属于化学变化的是A.干冰升华B.铁
有些事我都已忘记 但我现在还记得 在一个晚上
交通银行信用卡显示申办成功怎样查询邮政编码
竹埙怎么吹响
己知集合A={1,2,3,k},B={4,7,a4,a2+3a
农历92年二月十三日午时男生在2017年能脱单吗
世界之最英语怎么说
王大爷家今年收获了1157千克桃子,如果每13千
travel only possible in dead man's op
帆布鞋什么牌子好-?
1958年阴历2月26日出生的人,阳历是多少
推荐资讯
表格里的百分比怎么算
用一束光照射一刀片,发现屏上所成的阴影的边
说课稿教学反思怎么写
手机怎么查驾驶证分数
择天记宗教是好人还是坏人
陕西榆林到湖南张家界需要多少时间
桥梁学校有哪些好专业?有没有前途?
想知道: 抚州市东风标致4s店江西抚州在哪?
兔***后面是三个字,组成一个词
小龙潭派出所位置在什么地方啊,我要过去办理
正经的,本钱只有三十万,搞个什么副业好
魔兽世界常说的法师开门,是什么技能
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?