【 在 某 的大作中提到: 】
: 比如我有一个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基础之上。