操作系统怎么根据一个HWND句柄,找到相应的代码

【 在 某 的大作中提到: 】

: 比如我有一个CMyButton的类,我现在有他的一个handle
: 编译器怎么根据这个句柄找到CMyButton的代码的?

【 在 某某 的大作中提到: 】
: 这个和OS/Compiler没关系,是库起的作用
: 以从某个文章里看的,说MFC用了一个大map,没验证过
: 有本讲GDI的书里,用了WNDCLASS里的extra bytes来实现的这个映射

 


MFC的应用里,每个MFC线程(必须要使用MFC方式启动的线程)都维护有一个MFC object和HWND之间的

mapping,整个MFC框架就是使用这个机制来实现应用级C++对象和系统级原生窗口内核对象之间的关联;

因为这个mapping是以线程为单位来维护的,每个线程间互不关联,所以,一个应用里对于涉及UI窗口的

任务最好是都放在同一个线程里面,一般就是当前进程的主线程,否则可能出现MFC object和HWND之间

关联不上的问题,而且这样的问题还很隐蔽。

至于WNDCLASS结构自带的extra bytes域,是以前缺乏应用框架的时代,使用Win32 API直接开发时,让每个

窗口类(这里的类,不是C++ class的概念,而是Windows系统窗口定义时的一种数据结构)都能有个附

带一些额外的自定义数据的空间,这个空间往往被用来存放与当前窗口类相关的用户数据,通常是指向

某个内存区域的指针,当程序操作这个属于这个窗口类的窗口时就可以根据这个附带的自定义数据(或

者指针)来操作对应的关联自定义数据;很多后来出现的框架,也都使用了这个extra bytes域,来存放

框架本身的一些和窗口类相关联的数据结构。从目前趋势看,直接使用WNDCLASS以及extra bytes的可能

性是微乎其微了,但是如果要做好原生应用的开发,很多底层的实现细节最要还是要知道一下,以便于

优化结构和性能,以及出错时的调试处理;因为无论是Winform/WPF,还是跨平台的WTL/QT/WxWindows等

等新型的机制或者框架、类库,只要是在Windows平台上搭建的,那都是基于前面说过的这套最基本也是

最核心的Win32 API基础之上。

 

posted on 2011-04-04 14:16 flagman 阅读(1716) 评论(4)  编辑 收藏 引用 所属分类: 设计 DesignC++

评论

# re: 操作系统怎么根据一个HWND句柄,找到相应的代码 2011-04-04 14:37 空明流转

其实这种extra byte的办法,很多库都有。.net的component也多有object类型的tag。这个是应用程序定制的好办法。  回复  更多评论   

# re: 操作系统怎么根据一个HWND句柄,找到相应的代码[未登录] 2011-04-04 19:01 vincent

你可以把一个handle比喻成一个内核对象在内核中的数组索引,当然,也许这个handle是索引处理过的东西
内核对象身上自然存储的有它相关的一些资源,属性或信息  回复  更多评论   

# re: 操作系统怎么根据一个HWND句柄,找到相应的代码[未登录] 2011-04-04 19:02 vincent

我又2了。。没仔细看题。。。真的要检讨了。。
同好奇。。  回复  更多评论   

# re: 操作系统怎么根据一个HWND句柄,找到相应的代码 2011-04-07 14:54 flagman

@空明流转
是这样,在MFC出现之前,纯Win32 API的时代,extra byte是最便捷的对窗口自定义数据的存储方法;.net framework的设计者很有可能参考了这种设计思路,所以在UI界面的components上也带有可携带自定义数据的tag field;

引申出去,常见很多人问,“某某技术要学吗”“某某库、框架要摸索一下吗”,真要把某个技术、库等等研究透了,就常常会发现有许多设计思路和方法是相似的。  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2011年4月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜