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

MFC 擴展 DLL 導出類別與對話框:從零建立到呼叫的完整圖文教程

     編輯:VC 教學

為什麼選擇 MFC 擴展 DLL?

  • 共享 MFC DLL (MFCxx.dll),體積小、記憶體共享
  • 導出完整 C++ 類別(含虛函數、RTTI、例外),非僅 C 風格函數
  • 支援導出對話框、視圖、文件等 MFC 物件
  • 宿主 EXE 僅需連結 .lib、包含 .h,部署簡單

一、建立 MFC 擴展 DLL 專案

  1. VS6: File → New → Projects → MFC AppWizard (dll),專案名 ExportClass
  2. 步驟 1: 選擇 MFC Extension DLL (using shared MFC DLL) → Finish
  3. 專案產生骨架:ExportClass.h/.cpp、resource.h、StdAfx.h/.cpp

二、導出類別 CDogClass

  1. Insert → New Class → Generic Class,名稱 CDogClass,基類 CObject
  2. 編輯 DogClass.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; }
};
  1. 編輯 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;
}

三、建立導出對話框 CDlgDog

  1. Insert → Resource → Dialog,ID IDD_DLG_DOG,放兩個編輯框 IDC_EDIT_NUM、IDC_EDIT_DATA
  2. ClassWizard (Ctrl+W) → 新類別 CDlgDog 基類 CDialog,關聯 IDD_DLG_DOG
  3. 為編輯框加入變數:int m_nNum、CString m_sData
  4. 關鍵修正:
// 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"

四、編譯 DLL 產出導入庫

  • Build → ExportClass.dll、ExportClass.lib、ExportClass.exp
  • 複製 DogClass.h、ExportClass.lib 至測試專案目錄
  • 複製 ExportClass.dll 至系統目錄或測試 EXE 同目錄

五、建立測試 EXE 專案

  1. 新建 MFC AppWizard (exe),選 **Dialog based**,名稱 TestExportClass
  2. 對話框放一按鈕 IDC_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);
    }
}
  1. 專案設定:
  • Project → Settings → Link → Object/Library modules 加入 ExportClass.lib
  • C/C++ → Preprocessor → Additional include directories 加入 DLL 專案目錄(含 DogClass.h)

六、常見編譯/連結錯誤與解決

錯誤原因解決
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

七、進階:導出模板類別、內聯函數、資源

  • 模板類別:無法直接導出,需在 DLL 內顯式實例化 template class AFX_EXT_CLASS MyTempl;
  • 內聯函數:導出類別的內聯函數實際在標頭檔,EXE 直接編譯,無需導出
  • 資源 (圖示、字串表):DLL 內資源 ID 需唯一,EXE 可用 AfxSetResourceHandle(hDllInstance) 切換資源句柄存取

八、總結

MFC 擴展 DLL 導出類別/對話框的關鍵三步:

  1. AFX_EXT_CLASS 修飾導出類別
  2. IMPLEMENT_DYNAMIC 支援動態建立/序列化
  3. StdAfx.h 包含 resource.h 解決資源符號解析

掌握此流程,即可將重複業務邏輯、通用 UI 封裝為二進制複用模組,大幅縮減大型專案編譯時間與程式碼重複。

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