2024年9月句柄是什么啊?什么是句柄举点实际例子呗!!

 更新时间:2024-09-21 06:54:00

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

  ⑵解析:对句柄本质的探讨我觉得自己对于指针理解比较透彻了,但关于句柄的理解,就容易犯理解成指针的错误.一般说:句柄是资源(或项目)的唯一标识.俺觉得这其实说得很不明白的,现在我想问的是句柄到底是怎么标识资源的:,句柄在位机上是位整型吗?,当HANDLEhandle;声明句柄时,handle是它的标识符吗?如inta;则a就是标识符.,既然句柄是一个整型值,那么,它在内存的什么位置呢?栈上吗?,句柄是通过在它所占内存中记录对象在内存中的首地址来“标识“对象的吗?如果是,那与指针在这方面就完全一样了.可能有点玄,大家谈论下吧.---------------------------------------------------------------对句柄的认识之前在编写MFC程序的时候,有时会碰到句柄这一概念,由于对它一直不是很重视,所以并没有主动去了解它.随着不断深入学习MFC,特别是看完候先生的《《深入浅出MFC》》后,对句柄的实质产生了很大的兴趣,于是到处收集资料,现在总结一下.handle的中文意思主要有多种,一种是作为名词:柄,把柄;一种是作为动词:处理.硬要从中文意思来说的话,这两种中文意思都可以用来勉强解释句柄.例如一个锅的手柄,你只要抓住了它,你就可以很好地操作那个锅,不过很明显你只能通过锅的手柄来做一些诸如炒菜之类的事,你不可能是因为抓住了锅的手柄才能去看电视.不能的物体都会至少有一个属于它的“手柄“.在MFC里面,有很多对象,例如对话框,窗口,画笔,显示器,打印机等,每个对象都会产生一个属于它自己的句柄.oh!慢着,似乎还没说清楚句柄的本质,下面再作详细的解说吧.如果查看各种HANDLE的定义,如HDC,HPEN,HINSTANCE等等,你会发现有这样一个声明:DECLARE_HANDLE(HDC);再把DECLARE_HANDLE这个宏展开来看一下:#defineDECLARE_HANDLE(name)structname##__{intunused;};typedefstructname##__*name这是什么意思?用HDC替换上面的name来看看,我们就得到了下面的一段代码:structHDC__{intunused;};typedefstructHDC__*HDCoh,原来句柄就是一个指向某一结构的指针,这个结构体只有一个成员,它是一个整数(不知为什么MS要把这个成员叫做unused,难道真的没有用吗?).嗯,我们再看一个HANDLE的定义,在winnt.h头文件中,我们看到了HANDLE的定义:typedefPVOIDHANDEL;PVOID是什么?再看它的定义:typedefvoid*PVOID;真相出来了,原来HANDLE不过是一个指向void型,即无类型的指针,嗯,目前的指针是位的吧.其实也不能说HANDLE是一种指针,它只充当一种索引的作用.真的很难解释HANDLE是什么,再往下看看,只能意会吧,呵呵.知道了HANDLE的本质(一个位的整数,用进制表示),再来说说HANDLE的作用.看我前面第二段的例子,你可以了解到为了控制一个物体,你需要找到它的“手柄“.HANDLE就是充当win下各种“物体“的“手柄“.事实上,很多windowsAPI都需要一个HANDLE作为输入参数,这是因为API需要和一些你看不见的对象打交道,这些对象是不能被你所移动或修改的,所以不能给你一个指针来对它进行操作.oh,指针的确是个好东西,它所拥有的能力实在太强大了,但所谓能力越大,责任越大,使用指针的时候千万要小心,不然会造成毁灭性的错误.所以,为了安全,还是给你一个HANDLE吧,通过这个HANDLE,你就可以对那些对象进行一些处理.HANDLE在这里充当什么角色呢?应该算是一个中间人吧,HANDLE是固定的,它不会变,但是对象的地址会变,当对象在内存中的位置发生改变后,我们不能通过之前的对象指针找到对象,怎么办呢?嗯,这时候HANDLE的用处就出来了,HANDLE就是用来记录对象的最新地址的.有点明白了吧?换一种说法吧,嗯,其实就是你知道HANDLE在哪里,但你不知道对象在哪里,而HANDLE知道对象在哪里,所以,只要你知道了HANDLE在哪里,你就能找到对象(尽管你还是不知那个对象住在内存的哪个地方,不过找到它就行了,不是吗?).嗯,是不是有点像索引的作用呢?为什么不给我们知道对象在内存中的位置呢?呵呵,操作系统怕你对它进行一些不利的操作啊.反正你通过HANDLE能让对象做它应该做的事,这就足够了.这就是封装吧,MS最喜欢做的事情,呵呵.其实对于HANDLE的定义,MS公司也不能说得清清楚楚,把HANDLE翻译成句柄也是不太合适的,但有时就是这样,英文能理解的东西,翻译到中文反而就混乱了,所以“句柄“这个名词比较适合初学者,如我.那些有丰富编程经验的人一定不喜欢使用“句柄“这个名词吧,还是用handle这个原版英文单词比较容易理解,句柄可以理解为用于指向或标识内存的一块“资源”,上面这些资源的句柄Handles都不过是指向struct的指针,所以Windows给每个使用GlobalAlloc等函数声明的内存区域指定一个句柄(本质上仍是一个指针,句柄实际上是一种指向某种资源的指针,这个索引更像是一种映射关系(从句柄到对象指针的映射,WINDOWS句柄有点象C语言中的文件句柄,这些项目包括:模块(module)、任务(task)、实例(instance)、文件(file)、内存块(blockofmemory)、菜单(menu)、控制(control)、字体(font)、资源(resource)。

  ⑶分类:电脑/网络解析:一、书上定义:《《MicrosoftWindowsDeveloper’’sWorkshop》》(MicrosoftPress,byRichardWilton)在Windows环境中,句柄是用来标识项目的,这些项目包括:模块(module)、任务(task)、实例(instance)、文件(file)、内存块(blockofmemory)、菜单(menu)、控制(control)、字体(font)、资源(resource),包括图标(icon),光标(cursor),字符串(string)等、GDI对象(GDIobject),包括位图(bitmap),画刷(brush),元文件(metafile,调色板(palette),画笔(pen),区域(region),以及设备描述表(devicecontext)。《《WINDOWS编程短平快》》(南京大学出版社):句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。二、MFC源代码:#ifdefSTRICTtypedefvoid*HANDLE;#defineDECLARE_HANDLE(name)structname##__{intunused;};typedefstructname##__*name#elsetypedefPVOIDHANDLE;#defineDECLARE_HANDLE(name)typedefHANDLEname#endifDECLARE_HANDLE(HMODULE);DECLARE_HANDLE(HINSTANCE);DECLARE_HANDLE(HLOCAL);DECLARE_HANDLE(HGLOBAL);DECLARE_HANDLE(HDC);DECLARE_HANDLE(HRGN);DECLARE_HANDLE(HWND);DECLARE_HANDLE(HMENU);DECLARE_HANDLE(HAEL);DECLARE_HANDLE(HTASK);三、理解:HANDLE就是PVOID,也就是无类型指针,上面这些资源的句柄Handles都不过是指向struct的指针,至于这个struct的用处,连M$都说unused了,现在解释下M$这么做的意义,这就是所谓数据封装,你可以在你的程序中把M$的内部结构指针传来传去,可是你却不知道它到底指向的内容是什么。句柄与指针确实是完全不同的两个概念。句柄仅仅是一个位整数,WIN中用于标记某个系统或进程的对象,可以理解为对象索引(由于M$未完全公开相关技术,在一定程度上只能如此理解,这个索引更像是一种映射关系(从句柄到对象指针的映射,而不是纯粹意义上的“数组下标”。句柄可以理解为用于指向或标识内存的一块“资源”,这些资源如:文件(file)、内存块(blockofmemory)、菜单(menu)等等。操作系统通过句柄来定位核心对象和系统资源。指针即为指向内存的“数据或指令”某一单元。说的确切一点,句柄实际上是一种指向某种资源的指针,但与指针又有所不同:指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据。Windows并不希望一般程序修改其内部数据结构,因为这样太不安全。所以Windows给每个使用GlobalAlloc等函数声明的内存区域指定一个句柄(本质上仍是一个指针,但不要直接操作它),平时你只是在调用API函数时利用这个句柄来说明要操作哪段内存。四、引喻:牧童遥指杏花村牧童的手为指针,杏花村的牌子为句柄,杏花村酒店为对象的实例.附注:获得窗口句柄三种方法.HWNDFindWindow(LPCTSTRlpClassName,LPCTSTRlpWindowName)HWNDFindWindowEx(HWNDhwndParent,HWNDhwndChildAfter,LPCTSTRlpClassName,LPCTSTRlpWindowName).HWNDWindowFromPoint(POINT&Point)//获得当前鼠标光标位置的窗口HWND.BOOLCALLBACKEnumChildProc(HWNDhwnd,LPARAMlParam)BOOLCALLBACKEnumChildWindows(HWNDhWndParent,WNDENUMPROClpEnumFunc,LPARAMlParam)BOOLCALLBACKEnumWindows(WNDENUMPROClpEnumFunc,LPARAMlParam)BOOLCALLBACKEnumWindowsProc(HWNDhwnd,LPARAMlParam)

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

  ⑸分类:电脑/网络》》程序设计》》其他编程语言问题描述:VC++高手的来啊!!!!!!!!!!!解析:对句柄本质的探讨我觉得自己对于指针理解比较透彻了,但关于句柄的理解,就容易犯理解成指针的错误.一般说:句柄是资源(或项目)的唯一标识.俺觉得这其实说得很不明白的,现在我想问的是句柄到底是怎么标识资源的:,句柄在位机上是位整型吗?,当HANDLEhandle;声明句柄时,handle是它的标识符吗?如inta;则a就是标识符.,既然句柄是一个整型值,那么,它在内存的什么位置呢?栈上吗?,句柄是通过在它所占内存中记录对象在内存中的首地址来“标识“对象的吗?如果是,那与指针在这方面就完全一样了.可能有点玄,大家谈论下吧.---------------------------------------------------------------对句柄的认识之前在编写MFC程序的时候,有时会碰到句柄这一概念,由于对它一直不是很重视,所以并没有主动去了解它.随着不断深入学习MFC,特别是看完候先生的《《深入浅出MFC》》后,对句柄的实质产生了很大的兴趣,于是到处收集资料,现在总结一下.handle的中文意思主要有多种,一种是作为名词:柄,把柄;一种是作为动词:处理.硬要从中文意思来说的话,这两种中文意思都可以用来勉强解释句柄.例如一个锅的手柄,你只要抓住了它,你就可以很好地操作那个锅,不过很明显你只能通过锅的手柄来做一些诸如炒菜之类的事,你不可能是因为抓住了锅的手柄才能去看电视.不能的物体都会至少有一个属于它的“手柄“.在MFC里面,有很多对象,例如对话框,窗口,画笔,显示器,打印机等,每个对象都会产生一个属于它自己的句柄.oh!慢着,似乎还没说清楚句柄的本质,下面再作详细的解说吧.如果查看各种HANDLE的定义,如HDC,HPEN,HINSTANCE等等,你会发现有这样一个声明:DECLARE_HANDLE(HDC);再把DECLARE_HANDLE这个宏展开来看一下:#defineDECLARE_HANDLE(name)structname##__{intunused;};typedefstructname##__*name这是什么意思?用HDC替换上面的name来看看,我们就得到了下面的一段代码:structHDC__{intunused;};typedefstructHDC__*HDCoh,原来句柄就是一个指向某一结构的指针,这个结构体只有一个成员,它是一个整数(不知为什么MS要把这个成员叫做unused,难道真的没有用吗?).嗯,我们再看一个HANDLE的定义,在winnt.h头文件中,我们看到了HANDLE的定义:typedefPVOIDHANDEL;PVOID是什么?再看它的定义:typedefvoid*PVOID;真相出来了,原来HANDLE不过是一个指向void型,即无类型的指针,嗯,目前的指针是位的吧.其实也不能说HANDLE是一种指针,它只充当一种索引的作用.真的很难解释HANDLE是什么,再往下看看,只能意会吧,呵呵.知道了HANDLE的本质(一个位的整数,用进制表示),再来说说HANDLE的作用.看我前面第二段的例子,你可以了解到为了控制一个物体,你需要找到它的“手柄“.HANDLE就是充当win下各种“物体“的“手柄“.事实上,很多windowsAPI都需要一个HANDLE作为输入参数,这是因为API需要和一些你看不见的对象打交道,这些对象是不能被你所移动或修改的,所以不能给你一个指针来对它进行操作.oh,指针的确是个好东西,它所拥有的能力实在太强大了,但所谓能力越大,责任越大,使用指针的时候千万要小心,不然会造成毁灭性的错误.所以,为了安全,还是给你一个HANDLE吧,通过这个HANDLE,你就可以对那些对象进行一些处理.HANDLE在这里充当什么角色呢?应该算是一个中间人吧,HANDLE是固定的,它不会变,但是对象的地址会变,当对象在内存中的位置发生改变后,我们不能通过之前的对象指针找到对象,怎么办呢?嗯,这时候HANDLE的用处就出来了,HANDLE就是用来记录对象的最新地址的.有点明白了吧?换一种说法吧,嗯,其实就是你知道HANDLE在哪里,但你不知道对象在哪里,而HANDLE知道对象在哪里,所以,只要你知道了HANDLE在哪里,你就能找到对象(尽管你还是不知那个对象住在内存的哪个地方,不过找到它就行了,不是吗?).嗯,是不是有点像索引的作用呢?为什么不给我们知道对象在内存中的位置呢?呵呵,操作系统怕你对它进行一些不利的操作啊.反正你通过HANDLE能让对象做它应该做的事,这就足够了.这就是封装吧,MS最喜欢做的事情,呵呵.其实对于HANDLE的定义,MS公司也不能说得清清楚楚,把HANDLE翻译成句柄也是不太合适的,但有时就是这样,英文能理解的东西,翻译到中文反而就混乱了,所以“句柄“这个名词比较适合初学者,如我.那些有丰富编程经验的人一定不喜欢使用“句柄“这个名词吧,还是用handle这个原版英文单词比较容易理解

您可能感兴趣的文章:

相关文章