【 在 某 的大作中提到: 】
: 比如我有一個(gè)CMyButton的類,我現(xiàn)在有他的一個(gè)handle
: 編譯器怎么根據(jù)這個(gè)句柄找到CMyButton的代碼的?
【 在 某某 的大作中提到: 】
: 這個(gè)和OS/Compiler沒(méi)關(guān)系,是庫(kù)起的作用
: 以從某個(gè)文章里看的,說(shuō)MFC用了一個(gè)大map,沒(méi)驗(yàn)證過(guò)
: 有本講GDI的書里,用了WNDCLASS里的extra bytes來(lái)實(shí)現(xiàn)的這個(gè)映射
MFC的應(yīng)用里,每個(gè)MFC線程(必須要使用MFC方式啟動(dòng)的線程)都維護(hù)有一個(gè)MFC object和HWND之間的
mapping,整個(gè)MFC框架就是使用這個(gè)機(jī)制來(lái)實(shí)現(xiàn)應(yīng)用級(jí)C++對(duì)象和系統(tǒng)級(jí)原生窗口內(nèi)核對(duì)象之間的關(guān)聯(lián);
因?yàn)檫@個(gè)mapping是以線程為單位來(lái)維護(hù)的,每個(gè)線程間互不關(guān)聯(lián),所以,一個(gè)應(yīng)用里對(duì)于涉及UI窗口的
任務(wù)最好是都放在同一個(gè)線程里面,一般就是當(dāng)前進(jìn)程的主線程,否則可能出現(xiàn)MFC object和HWND之間
關(guān)聯(lián)不上的問(wèn)題,而且這樣的問(wèn)題還很隱蔽。
至于WNDCLASS結(jié)構(gòu)自帶的extra bytes域,是以前缺乏應(yīng)用框架的時(shí)代,使用Win32 API直接開(kāi)發(fā)時(shí),讓每個(gè)
窗口類(這里的類,不是C++ class的概念,而是Windows系統(tǒng)窗口定義時(shí)的一種數(shù)據(jù)結(jié)構(gòu))都能有個(gè)附
帶一些額外的自定義數(shù)據(jù)的空間,這個(gè)空間往往被用來(lái)存放與當(dāng)前窗口類相關(guān)的用戶數(shù)據(jù),通常是指向
某個(gè)內(nèi)存區(qū)域的指針,當(dāng)程序操作這個(gè)屬于這個(gè)窗口類的窗口時(shí)就可以根據(jù)這個(gè)附帶的自定義數(shù)據(jù)(或
者指針)來(lái)操作對(duì)應(yīng)的關(guān)聯(lián)自定義數(shù)據(jù);很多后來(lái)出現(xiàn)的框架,也都使用了這個(gè)extra bytes域,來(lái)存放
框架本身的一些和窗口類相關(guān)聯(lián)的數(shù)據(jù)結(jié)構(gòu)。從目前趨勢(shì)看,直接使用WNDCLASS以及extra bytes的可能
性是微乎其微了,但是如果要做好原生應(yīng)用的開(kāi)發(fā),很多底層的實(shí)現(xiàn)細(xì)節(jié)最要還是要知道一下,以便于
優(yōu)化結(jié)構(gòu)和性能,以及出錯(cuò)時(shí)的調(diào)試處理;因?yàn)闊o(wú)論是Winform/WPF,還是跨平臺(tái)的WTL/QT/WxWindows等
等新型的機(jī)制或者框架、類庫(kù),只要是在Windows平臺(tái)上搭建的,那都是基于前面說(shuō)過(guò)的這套最基本也是
最核心的Win32 API基礎(chǔ)之上。