MFC定義了多種狀態信息,這裡要介紹的是模塊狀態、進程狀態、線程狀態。這些狀態可以組合在一起,例如MFC句柄映射就是模塊和線程局部有效的,屬於模塊-線程狀態的一部分。
模塊狀態
這裡模塊的含義是:一個可執行的程序或者一個使用MFC DLL的DLL,比如一個OLE控件就是一個模塊。
一個應用程序的每一個模塊都有一個狀態,模塊狀態包括這樣一些信息:用來加載資源的Windows實例句柄、指向當前CWinApp或者CWinThread對象的指針、OLE模塊的引用計數、Windows對象與相應的MFC對象之間的映射。只有單一模塊的應用程序的狀態如圖9-1所示。
m_pModuleState指針是線程對象的成員變量,指向當前模塊狀態信息(一個AFX_MODULE_STATE結構變量)。當程序運行進入某個特定的模塊時,必須保證當前使用的模塊狀態是有效的模塊狀態──是這個特定模塊的模塊狀態。所以,每個線程對象都有一個指針指向有效的模塊狀態,每當進入某個模塊時都要使它指向有效模塊狀態,這對維護應用程序全局狀態和每個模塊狀態的完整性來說是非常重要的。為了作到這一點,每個模塊的所有入口點有責任實現模塊狀態的切換。模塊的入口點包括:DLL的輸出函數;OLE/COM界面的成員函數;窗口過程。
在講述窗口過程和動態鏈接到MFC DLL的規則DLL時,曾提到了語句AFX_MANAGE_STATE(AfxGetStaticModuleState( )),它就是用來在入口點切換模塊狀態的。其實現機制將在後面9.4.1節講解。
多個模塊狀態之間切換的示意圖如圖9-2所示。
圖9-2中,m_pModuleState總是指向當前模塊的狀態。
模塊、進程和線程狀態的數據結構
MFC