MFC 擴充 DLL(Extension DLL)共享 MFC DLL 版本,適合在 MFC 應用程式之間共用類別與資源。本文以最簡單的「匯出函式」範例,示範建立 DLL 與載入呼叫的完整流程。
MyMfcDll)。在 MyMfcDll.cpp 中:
extern "C" __declspec(dllexport) void ShowMessage() {
AFX_MANAGE_STATE(AfxGetStaticModuleState()); // 關鍵:切換模組狀態
AfxMessageBox(_T("此函式來自 MFC 擴充 DLL"));
}
extern "C":避免 C++ 名稱修飾,利於非 C++ 語言呼叫。__declspec(dllexport):宣告匯出(或在 .def 檔加入函式名)。AFX_MANAGE_STATE:必須在每個匯出函式入口加入,確保 MFC 正確尋找資源。建置專案,Debug/MyMfcDll.dll 與 .lib 自動產生。
UseDll)。m_strPath),三個按鈕:選擇 DLL、執行函式、結束。void CUseDllDlg::OnSelect() {
CFileDialog dlg(TRUE, _T("dll"), NULL, OFN_HIDEREADONLY,
_T("DLL 檔案 (*.dll)|*.dll|所有檔案 (*.*)|*.*||"));
if (dlg.DoModal() == IDOK) {
m_strPath = dlg.GetPathName();
UpdateData(FALSE);
}
}
void CUseDllDlg::OnButtonRun() {
UpdateData(TRUE);
HMODULE hDll = ::LoadLibrary(m_strPath);
if (!hDll) { AfxMessageBox(_T("載入 DLL 失敗")); return; }
typedef void (*PFN_SHOW)();
PFN_SHOW pShow = (PFN_SHOW)::GetProcAddress(hDll, "ShowMessage");
if (!pShow) { AfxMessageBox(_T("找不到匯出函式")); }
else { pShow(); } // 呼叫
::FreeLibrary(hDll);
}
__declspec(dllexport),呼叫端包含標頭檔並連結 .lib 即可直接使用,無需 GetProcAddress。AfxSetResourceHandle(hDll) 切換資源鏈柄。new/delete 可跨邊界,但建議提供專用釋放函式。MFC 擴充 DLL 開發核心在於:正確設定專案類型、匯出介面加 AFX_MANAGE_STATE、呼叫端動態載入與函式指標轉型。掌握此流程即可輕鬆實現模組化開發與程式碼複用。