dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | flex | CRM | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>C/C++>文章内容
探讨Windows编程中句柄的本质
来源: vchelp 作者:
  一、书上定义

  <<Microsoft Windows 3 Developer's Workshop>>(Microsoft Press,by Richard Wilton)

  在Windows环境中,句柄是用来标识项目的,这些项目包括:模块(module)、任务(task)、实例 (instance)、文件(file)、内存块(block of memory)、菜单(menu)、控制(control)、字体(font)、资源(resource),包括图标(icon),光标 (cursor),字符串(string)等、GDI对象(GDI object),包括位图(bitmap),画刷(brush),元文件(metafile),调色板(palette),画笔(pen),区域 (region),以及设备描述表(device context)。

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

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

  二、MFC源代码

#ifdef STRICT
typedef void *HANDLE;
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
#else
typedef PVOID HANDLE;
#define DECLARE_HANDLE(name) typedef HANDLE name
#endif

DECLARE_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(HACCEL);
DECLARE_HANDLE(HTASK);

  三、理解

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

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

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

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

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

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

  四、引喻

  牧童遥指杏花村

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

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

  1.HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName)

  HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName)

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

  3.BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)

  BOOL CALLBACK EnumChildWindows(HWND hWndParent, WNDENUMPROC lpEnumFunc,LPARAM lParam)

  BOOL CALLBACK EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)
 
  BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)

  在Windows中所谓句柄不过是系统为了隔离用户直接操作系统中所定义的对象所给出的一种唯一码而已,其实Java中为了不让用户直接操作对象,采用了引用并通过HashCode标示对象也是其同一道理

上一篇:VC++内部COM插件的编程实现   下一篇:在MFC中应用CTreeCtrl控件的技巧
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·C语言学习
·C语言指针
·C语言数组排序小结
·c语言 最简单的推箱子游戏
·c语言 全国计算机编程大赛复赛试
·c语言 全国计算机编程大赛复赛试
·c++ 数组与指针
·C++中的内存管理(new、delete、
·如何用C语言开发DSP嵌入式系统
·如何用C语言开发DSP嵌入式系统
·Linux下C语言编程
·学习arm的话先看哪本书?
  相关文章
·VC++内部COM插件的编程实现
·在MFC中应用CTreeCtrl控件的技巧
·VC程序中树型控件节点拖动的完美
·简单SNMP管理程序的VC++代码实例
·VC实现类似Windows的颜色选择器
·利用VC++实现局域网实时视频传输
·利用VC打造自己的资源浏览器
·Visual C++程序调试方法入门
·VC技巧:在程序的状态栏中实现进
·OpenGL编程轻松入门之背景简介
·GIS系统三维地景仿真的设计之基
·OpenGL编程轻松入门之一个简单的
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763