首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

MFC 擴充 DLL 導出類別與對話框完整實戰教學

     編輯:關於C++

模組化開發中,將共用類別與對話框封裝至 MFC 擴充 DLL (Extension DLL) 可實現程式碼複用、獨立編譯部署。本文以 CDogClass 類別與 CDlgDog 對話框為例,詳述從建立專案到測試程式整合的完整流程。

一、建立 MFC 擴充 DLL 專案

  1. Visual Studio 6.0 → File → New → Projects
  2. 選擇 MFC AppWizard (dll),專案名 ExportClass
  3. 選擇 MFC Extension DLL (using shared MFC DLL)
  4. 完成建立專案骨架

二、導出類別:CDogClass

1. 新增泛型類別

  • Insert → New Class → Generic Class
  • 類別名 CDogClass,基底類別 CObject

2. 類別定義 (DogClass.h)

class 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 宏確保類別正確導出/導入。

3. 實作 (DogClass.cpp)

#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;
}

三、導出對話框:CDlgDog

  1. Insert → Resource → Dialog,建立對話框資源 (IDD_DLG_DOG)
  2. 加入兩個編輯控制項:IDC_EDIT1 (int)、IDC_EDIT2 (CString)
  3. ClassWizard 建立 CDlgDog 類別,關聯資源,DDX 變數對應 m_nNum, m_sData
  4. 關鍵修正:
    • 移除 DlgDog.cpp 中的 #include "..." 佔位行
    • stdafx.h 加入 #include "resource.h"

四、編譯 DLL 產出檔案

  • 編譯成功產生:ExportClass.dll, ExportClass.lib, DogClass.h, DlgDog.h
  • 複製 DogClass.h、ExportClass.lib 至測試專案目錄
  • ExportClass.dll 放入系統目錄或測試程式同目錄

五、建立測試程式 (MFC 對話框應用程式)

1. 專案設定

  • 新建 MFC AppWizard (exe) → Dialog based
  • 加入按鈕 IDC_BUTTON1

2. 連結設定

  • Project → Settings → Link → Object/Library modules 加入 ExportClass.lib
  • 設定對象:All Configurations

3. 程式碼整合 (TestExportClassDlg.cpp)

#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 參考計數正常運作

七、常見問題與解決

  • 連結錯誤 LNK2001:確認 AFX_EXT_CLASS、.lib 正確加入、頭檔一致
  • 執行找不到 DLL:ExportClass.dll 放入 PATH 目錄或應用程式目錄
  • 對話框不顯示/當機:檢查 stdafx.h 包含 resource.h、移除 ClassWizard 產生的佔位 include
  • Debug/Release 不匹配:DLL 與 EXE 必須同為 Debug 或 Release 建置

八、現代化遷移建議 (VS2017+)

  • 專案類型:MFC Dynamic-Link Library (共享 MFC)
  • 使用 __declspec(dllexport)/dllimport 替代 AFX_EXT_CLASS
  • C++17 模組化、std::filesystem 替代 MFC 路徑操作
  • 考慮將純邏輯類別移至標準 C++ 靜態庫,僅 UI 相關留在 MFC DLL

MFC 擴充 DLL 仍是大型 MFC 專案模組化的經典方案,掌握其建立與整合流程,能有效管理共用程式碼、縮短建置時間、支援多人並行開發。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved