模組化開發中,將共用類別與對話框封裝至 MFC 擴充 DLL (Extension DLL) 可實現程式碼複用、獨立編譯部署。本文以 CDogClass 類別與 CDlgDog 對話框為例,詳述從建立專案到測試程式整合的完整流程。
ExportClassCDogClass,基底類別 CObjectclass AFX_EXT_CLASS CDogClass : public CObject {
private:
int m_nNum;
CString m_sData;
public:
CDogClass();
virtual ~CDogClass();
void Init();
int ShowDlg(); // 呼叫對話框
void SetNum(int n) { m_nNum = n; }
int GetNum() const { return m_nNum; }
void SetData(const CString& s) { m_sData = s; }
CString GetData() const { return m_sData; }
};
關鍵:AFX_EXT_CLASS 宏確保類別正確導出/導入。
#include "stdafx.h"
#include "DogClass.h"
#include "DlgDog.h" // 對話框頭檔
CDogClass::CDogClass() { Init(); }
CDogClass::~CDogClass() {}
void CDogClass::Init() { m_nNum = 0; m_sData.Empty(); }
int CDogClass::ShowDlg() {
CDlgDog dlg;
dlg.m_nNum = GetNum();
dlg.m_sData = GetData();
if (dlg.DoModal() == IDOK) {
SetNum(dlg.m_nNum);
SetData(dlg.m_sData);
return 1;
}
return 0;
}
IDC_EDIT1 (int)、IDC_EDIT2 (CString)CDlgDog 類別,關聯資源,DDX 變數對應 m_nNum, m_sDataDlgDog.cpp 中的 #include "..." 佔位行stdafx.h 加入 #include "resource.h"ExportClass.dll, ExportClass.lib, DogClass.h, DlgDog.hDogClass.h、ExportClass.lib 至測試專案目錄ExportClass.dll 放入系統目錄或測試程式同目錄IDC_BUTTON1ExportClass.lib#include "DogClass.h" // 導出類別頭檔
void CTestExportClassDlg::OnButton1() {
CDogClass dog;
dog.Init();
if (dog.ShowDlg() != 0) {
CString str;
str.Format(L"Num is: %d, Data is: %s", dog.GetNum(), dog.GetData());
AfxMessageBox(str);
}
}
| 項目 | 說明 |
|---|---|
| AFX_EXT_CLASS | 定義/使用 DLL 時自動切換 __declspec(dllexport)/dllimport |
| 共享 MFC DLL | 擴充 DLL 必須與主程式使用相同 MFC 版本、相同 CRT 版本 |
| 資源處理 | DLL 內對話框資源由 MFC 自動尋找,需正確設定模組狀態 |
| 記憶體邊界 | DLL 與 EXE 共用 MFC/CRT 堆,new/delete 跨界安全 |
| CString 跨界 | 共享 MFC 狀態下 CString 參考計數正常運作 |
AFX_EXT_CLASS、.lib 正確加入、頭檔一致ExportClass.dll 放入 PATH 目錄或應用程式目錄stdafx.h 包含 resource.h、移除 ClassWizard 產生的佔位 include__declspec(dllexport)/dllimport 替代 AFX_EXT_CLASSstd::filesystem 替代 MFC 路徑操作MFC 擴充 DLL 仍是大型 MFC 專案模組化的經典方案,掌握其建立與整合流程,能有效管理共用程式碼、縮短建置時間、支援多人並行開發。