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