Share via


動態連結至 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( ))

您還想知道關於哪些方面的詳細資訊?

另請參閱

在 Visual Studio 中建立 C++ DLL