MFC 定義了三種層級的狀態資訊,它們層層疊加,共同維護應用程式的執行上下文:
CWinApp/CWinThread 指標、OLE 參考計數、Windows 物件與 MFC 物件的對應映射表(Handle Map)。m_pModuleState 指標(指向當前有效模組狀態)、訊息快取、臨時視窗對應等。AFX_MANAGE_STATE當執行緒進入不同模組(如呼叫 DLL 匯出函式、OLE 介面方法、視窗程序)時,必須確保 m_pModuleState 指向正確的模組狀態。MFC 提供巨集 AFX_MANAGE_STATE(AfxGetStaticModuleState()) 在入口點自動完成切換與還原(利用 RAII 機制)。
// DLL 匯出函式範例
extern "C" __declspec(dllexport) void MyExportedFunction()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); // 切換至本 DLL 模組狀態
// ... 使用 MFC 資源、物件映射等 ...
} // 離開時自動還原原執行緒模組狀態
AFX_MODULE_STATE此結構體封裝了模組級資料:
m_hCurrentResourceHandle:當前資源控制代碼,AfxGetResourceHandle() 即返回此值。m_pCurrentWinApp / m_pCurrentWinThread:應用程式/執行緒物件指標。m_factoryList:OLE 類別工廠鏈表。m_handleMap:HWND→CWnd*、HD→CDC* 等映射表。問題: 在 DLL 中彈出對話框或使用資源時發生斷言失敗或資源找不到。
原因: 忘記在入口點呼叫 AFX_MANAGE_STATE,導致使用主程式模組狀態載入 DLL 資源。
解決: 所有 DLL 公開介面(匯出函式、COM 方法、視窗程序、執行緒函式)開頭必須加上此巨集。