首先,你要明白windows物件和c++物件的區別。
c++物件(即mfc類cwnd)實際上並沒有把整個windows物件都包裝在其中,它只是有乙個視窗控制代碼。(在msdn上檢視cwnd類的成員變數,確實只有乙個hwnd hwnd,成員函式有attach()和dettach()、create()等)。這個視窗控制代碼如果指向乙個實際存在的視窗物件,那麼這個c++物件就是有效的,否則這個mfc物件是空的。
如果你還不明白,請回憶一下,當我們使用mfc建立乙個視窗時,是分兩步進行的:
第一步,new乙個cwnd物件,這一步是建立c++物件,但是其中的hwnd還是非法的,因為對應的windows物件還沒有被建立出來;
第二步,呼叫cwnd的成員函式create建立真正的windows物件,同時,把先前建立的mfc的cwnd物件的hwnd成員指向該視窗,這樣才算建立完畢乙個視窗。
而如果你是用sdk方式,那麼只要建立乙個wndclass結構,然後呼叫create或者createex就建立了一 個視窗。
一. attach()
和detach()
的用法
用attach:其實就是讓乙個c++物件——cwnd物件的hwnd成員等於這個視窗控制代碼。這就是attach主要完成的任務。
第二個,關於detach。如前所述,wndclass其實和cwnd根本沒有什麼關係。它們之間只是通過cwnd的成員hwnd聯絡起來的。如果把 attach看做「聯姻」的話,那麼detach就是「離婚」了,通俗地說,就是切斷乙個cwnd物件和乙個有效視窗的臍帶。為什麼要切斷呢?因為 cwnd是c++的物件,c++的物件有乙個生存期的概念,脫離了該物件的作用域,這個物件就要被銷毀,但是windows物件沒有這個特點,當銷毀 cwnd物件的時候,我們不一定希望wndclass一起被銷毀,那麼在此之前,我們就先要把這個「臍帶」剪斷,以免「城門失火,殃及池魚」。
void cmycapview::onlbuttonup(uint nflags, cpoint point)
cview::onlbuttonup(nflags, point);
}
注意:所有臨時mfc物件和持久(permanent)mfc物件都是以執行緒為單位進行維護管理的。也就是說,乙個執行緒不能夠訪問另乙個執行緒的mfc包裝類物件,不管它是臨時的還是持久的。
為了在不同的執行緒間傳遞這些windows物件,總是應該通過handle型別傳遞。從乙個執行緒向另乙個執行緒傳遞mfc包裝物件將可能引起不可預料的結果。
二.控制代碼洩漏
一般,create()建立控制代碼後,一定要closehandle()關閉控制代碼,否則問題很麻煩。
#include void fun1(void);
void fun2(void);
void fun3(void);
void fun4(void);
int main(int argc,char*argv)
return 0;
}void fun1(void)
void fun2(void)
void fun3(void)
void fun4(void)
一般可以在windows任務管理器中檢視控制代碼數。 windows核心程式設計 核心物件和控制代碼洩漏
1 什麼是核心物件?核心物件是作業系統分配的乙個記憶體塊,該記憶體塊是乙個資料結構,用於管理物件的各種資訊。當應用程式要與系統裝置進行互動的時候,將使用到核心物件,出於安全的考慮,程序是不能直接訪問核心物件的,作業系統提供了對應的函式來對它們進行訪問。訪問符號物件 事件物件 檔案物件 作業物件 互斥...
Windows核心程式設計 控制代碼和偽控制代碼
getcurrentprocess duplicatehandle window中為什麼會有控制代碼的概念 從visual c 的標頭檔案來看,handle被typedef為void的指標,那是指向未確定資料結構的指標 typedef void handle 但是這並不說明任何問題,因為控制代碼遠遠...
Windows核心程式設計 控制代碼和偽控制代碼
getcurrentprocess duplicatehandle window中為什麼會有控制代碼的概念 從visual c 的標頭檔案來看,handle被typedef為void的指標,那是指向未確定資料結構的指標 typedef void handle 但是這並不說明任何問題,因為控制代碼遠遠...