当前位置:神舟问>生活百科>句柄是什么啊?

句柄是什么啊?

2024-05-30 17:58:28 编辑:join 浏览量:571

句柄是什么啊?

一、书上定义:

<<M其获亚扬存多外口款东icrosoftWin企述路直始些很该dows3Developer''sWorkshop>>(MicrosoftPress,byRichardWilton)

在Windows来自环境中,句柄是用来标识项目的,这些项目包括:模六维该愿块(module)、任务(task)、实例(instance)、文件(功file)、内存块(blockofm360问答emory)、菜单(东斤二呢注行调菜尼menu)、控制(contro视鸡某穿境l)、字体(font)、资源(resource)它地,包括图标(ic啊烈雷化爱增怎on),光标(cursor),字符串(string)等、GDI对象(GDIobject),包括位图(bitmap),画刷(brush),元文件(metafile),调色板(palette),画笔(pen),区域(region),以及设备描述表(devicecontext)。

<<WINDOWS编程短平快>>(南京大学出版社深花):

句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实照斯济盟画止还例,窗口,控制,位图,GDI对象等等。模神展WINDOWS句柄有点象C语言中的文件句柄。

二、MFC源代码:

#ifdefSTRICT

typedefvoid*十消孩封吸拿HANDLE;

#defineDECLARE_HANDLE(name)structname##__{intunused;};typedefstructname##__*name

#els久进e

typedefPVOIDHANDLE;

#defineDECLARE_HANDLE(name)typedefHANDLEname

#endif

DECLARE_HANDLE(察端片HMODULE);

DECLARE_HANDLE(HINSTANCE);

DECLARE_HANDLE(HLOCAL);

DECLARE_HANDLE(HGLOBAL);

DECLARE_HANDLE担晚的含行般需(HDC);

DECLARE_HANDLE(HRGN);

DECLARE_HANDLE(HWND);

DECLARE_HA调夫混要菜序NDLE(HMENU);

某而耐度病个花DECLARE_HANDLE(HACCEL);

DECLARE_HANDLE化计(HTASK);

三、理解:

HANDLE就是PVOID,也就是无类型指针,

上面这些资源的句柄Handles都不过是指向struct的指针,至于这个struct的用处,连M$都说unused了,现在解释下M$这么做的意义,这就是所谓数据封装,你可以在你的程序中把M$的内部结构指针传来传去,可是你却不知道它到底指向的内容是什么。

句柄与指针确实是完全不同的两个概念。句柄仅仅是一个32位整数,WIN32中用于标记某个系统或进程的对象,可以理解为对象索引(由于M$未完全公开相关技术,在一定程度上只能如此理解),这个索引更像是一种映射关系(从句柄到对象指针的映射),而不是纯粹意义上的“数组下标”。

句柄可以理解为用于指向或标识内存的一块“资源”,这些资源如:文件(file)、内存块(blockofmemory)、菜单(menu)等等。操作系统通过句柄来定位核心对象和系统资源。

指针即为指向内存的“数据或指令”某一单元。

说的确切一点,句柄实际上是一种指向某种资源的指针,但与指针又有所不同:指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据。Windows并不希望一般程序修改其内部数据结构,因为这样太不安全。所以Windows给每个使用GlobalAlloc等函数声明的内存区域指定一个句柄(本质上仍是一个指针,但不要直接操作它),平时你只是在调用API函数时利用这个句柄来说明要操作哪段内存。

四、引喻:

牧童遥指杏花村

牧童的手为指针,杏花村的牌子为句柄,杏花村酒店为对象的实例.

附注:获得窗口句柄三种方法

1.HWNDFindWindow(LPCTSTRlpClassName,LPCTSTRlpWindowName)

HWNDFindWindowEx(HWNDhwndParent,HWNDhwndChildAfter,LPCTSTRlpClassName,LPCTSTRlpWindowName)

2.HWNDWindowFromPoint(POINT&Point)//获得当前鼠标光标位置的窗口HWND

3.BOOLCALLBACKEnumChildProc(HWNDhwnd,LPARAMlParam)

BOOLCALLBACKEnumChildWindows(HWNDhWndParent,WNDENUMPROClpEnumFunc,LPARAMlParam)

BOOLCALLBACKEnumWindows(WNDENUMPROClpEnumFunc,LPARAMlParam)

BOOLCALLBACKEnumWindowsProc(HWNDhwnd,LPARAMlParam)

标签:句柄

版权声明:文章由 神舟问 整理收集,来源于互联网或者用户投稿,如有侵权,请联系我们,我们会立即处理。如转载请保留本文链接:https://www.shenzhouwen.com/life/355052.html
热门文章