MFCxx.dll),體積小、記憶體共享.lib、包含 .h,部署簡單ExportClassExportClass.h/.cpp、resource.h、StdAfx.h/.cppCDogClass,基類 CObjectDogClass.h:#pragma once
#include
class AFX_EXT_CLASS CDogClass : public CObject {
DECLARE_DYNAMIC(CDogClass)
private:
int m_nNum;
CString m_sData;
public:
CDogClass(); virtual ~CDogClass();
void Init();
int ShowDialog(); // 呼叫對話框
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; }
};
DogClass.cpp:
#include "DogClass.h"
#include "DlgDog.h" // 對話框類別標頭
IMPLEMENT_DYNAMIC(CDogClass, CObject)
CDogClass::CDogClass() { Init(); }
CDogClass::~CDogClass() {}
void CDogClass::Init() { m_nNum = 0; m_sData.Empty(); }
int CDogClass::ShowDialog() {
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;
}
IDD_DLG_DOG,放兩個編輯框 IDC_EDIT_NUM、IDC_EDIT_DATACDlgDog 基類 CDialog,關聯 IDD_DLG_DOGint m_nNum、CString m_sData// DlgDog.cpp 開頭
#include "stdafx.h" // 必須包含 stdafx.h (含 resource.h)
#include "DlgDog.h"
// 刪除 ClassWizard 產生的 "#include \"\ add additional includes here\""
// StdAfx.h 確保包含 resource.h
#include "resource.h"
ExportClass.dll、ExportClass.lib、ExportClass.expDogClass.h、ExportClass.lib 至測試專案目錄ExportClass.dll 至系統目錄或測試 EXE 同目錄TestExportClassIDC_BUTTON1,加入處理函數:
#include "DogClass.h"
void CTestExportClassDlg::OnButton1() {
CDogClass dog;
dog.Init();
if (dog.ShowDialog()) {
CString str;
str.Format(_T("Num: %d, Data: %s"), dog.GetNum(), dog.GetData());
AfxMessageBox(str);
}
}
ExportClass.lib| 錯誤 | 原因 | 解決 |
|---|---|---|
| unresolved external symbol _AFX_EXT_CLASS | 未定義 AFX_EXT_CLASS | 確認 DLL 專案定義 _AFXDLL、_USRDLL,類別前加 AFX_EXT_CLASS |
| LNK2001: CDlgDog::DoModal | 對話框資源未連結 | DLL 專案資源檔 .rc 已加入專案;EXE 不需包含對話框資源 |
| Run-time: DLL not found | 部署缺少 DLL | 複製 ExportClass.dll 至 EXE 目錄或 System32 |
| CRT 衝突 (debug/release 混用) | DLL/EXE 運行庫不一致 | 統一設定:MDd/MD/MTd/MT |
template class AFX_EXT_CLASS MyTempl; AfxSetResourceHandle(hDllInstance) 切換資源句柄存取MFC 擴展 DLL 導出類別/對話框的關鍵三步:
掌握此流程,即可將重複業務邏輯、通用 UI 封裝為二進制複用模組,大幅縮減大型專案編譯時間與程式碼重複。