動態連結至 MFC 之 MFC DLL 的模組狀態
動態將一般 MFC DLL 連結至 MFC DLL 的能力,可讓某些非常複雜的設定。 例如,一般 MFC DLL 和使用它的可執行檔可以動態連結至 MFC DLL 和任何 MFC 擴充 DLL。
此設定會對 MFC 全域數據造成問題,例如目前 CWinApp
物件的指標和處理對應。
在 MFC 4.0 版之前,此全域數據會位於 MFC DLL 本身,並由程式中的所有模組共用。 由於每個使用 Win32 DLL 的進程都會取得自己的 DLL 數據復本,因此此配置提供簡單的方法來追蹤每個進程的數據。 此外,因為 AFXDLL 模型假設程式中只有一個 CWinApp
物件,而且只有一組句柄對應,所以這些專案可以在 MFC DLL 本身中追蹤。
但是,由於能夠動態將一般 MFC DLL 連結到 MFC DLL,現在可以在進程中有兩個或多個物件,以及兩 CWinApp
組以上的句柄對應。 MFC 如何追蹤它應該使用哪些專案?
解決方案是為每個模組 (應用程式或一般 MFC DLL) 提供它自己這個全域狀態信息的複本。 因此,一般 MFC DLL 中 AfxGetApp 的呼叫會傳回 DLL 中物件的指標,而不是可執行檔中的物件CWinApp
。 MFC 全域數據的這個每個模組複本稱為模塊狀態,如 MFC 技術附註 58 中所述。
MFC 通用視窗程式會自動切換至正確的模塊狀態,因此您不需要在一般 MFC DLL 中實作的任何訊息處理程式中擔心。 但是,當您的可執行檔呼叫一般 MFC DLL 時,您必須將目前的模塊狀態明確設定為 DLL 的模組狀態。 若要這樣做,請在 從 DLL 導出的每個函式中使用 AFX_MANAGE_STATE 巨集。 這可藉由將下列程式代碼行新增至從 DLL 導出的函式開頭來完成:
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))