首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

VC++ MFC 擴展 DLL 開發要點詳解

     編輯:更多程式設計知識

MFC 擴展 DLL 是 MFC 類別庫的延伸,允許從現有 MFC 類別衍生可重複使用的新類別,並直接對外公開 MFC 類別介面。本文整理其核心特徵、入口函數差異、導出宏機制與使用限制。

MFC 三種 DLL 類型比較

類型MFC 使用方式入口函數介面特徵呼叫端需求
非 MFC DLL不使用 MFC程式設計師自行實作 DllMain純 C 風格函數/變數任何語言
MFC 一般 DLL共享 MFC DLL 版本CWinApp 物件的 InitInstance/ExitInstanceC 風格函數(可內部用 MFC)任何語言
MFC 擴展 DLL共享 MFC DLL 版本精靈自動生成 DllMain可直接導出 MFC 類別僅限共享 MFC 版本的 MFC EXE 或一般 DLL

核心差異:無 CWinApp 物件

  • MFC 一般 DLL 由精靈建立 `CWinApp` 衍生類別物件,管理模組狀態。
  • MFC 擴展 DLL **不包含 CWinApp 物件**,僅由精靈生成 `DllMain` 函數。開發者必須在 `DllMain` 中撰寫初始化/清理程式碼(如 `AfxInitExtensionModule`、`AfxTermExtensionModule`)。

導出/導入宏機制:AFX_EXT_CLASS 等

為了讓同一組標頭檔在 DLL 建置時「導出」、呼叫端包含時「導入」,MFC 定義條件編譯宏:

// 標頭檔中
#ifdef _AFXEXT  // DLL 專案定義此宏(通常透過 /D _AFXEXT 編譯選項)
#define AFX_EXT_CLASS __declspec(dllexport)
#define AFX_EXT_API   __declspec(dllexport)
#define AFX_EXT_DATA  __declspec(dllexport)
#else
#define AFX_EXT_CLASS __declspec(dllimport)
#define AFX_EXT_API   __declspec(dllimport)
#define AFX_EXT_DATA  __declspec(dllimport)
#endif

// 使用範例
class AFX_EXT_CLASS CMyDerivedClass : public CObject { ... };
AFX_EXT_API void MyExportedFunction();
AFX_EXT_DATA int g_sharedVariable;

實作步驟摘要

  1. 專案類型選 **MFC AppWizard (dll)** → 選 **MFC Extension DLL**。
  2. 精靈自動生成 `DllMain`,在 `DLL_PROCESS_ATTACH` 區塊呼叫 `AfxInitExtensionModule`,`DLL_PROCESS_DETACH` 呼叫 `AfxTermExtensionModule`。
  3. 定義衍生類別時加上 `AFX_EXT_CLASS` 宏。
  4. 匯出函數/全域變數用 `AFX_EXT_API`/`AFX_EXT_DATA`。
  5. 呼叫端專案:
    ① 設為「使用共享 MFC DLL」。
    ② 包含 DLL 的標頭檔。
    ③ 連結 DLL 產生的 `.lib`(`#pragma comment(lib, "ExtDll.lib")`)。
    ④ 直接使用匯出的 MFC 類別/函數。

限制與注意事項

  • 二進位相容性:呼叫端與 DLL 必須使用**相同版本**的 MFC DLL(如 `MFC42.DLL`),否則會因類別配置不同導致崩潰。
  • 不可跨越 CRT 版本:Debug/Release 混用會造成堆疊損毀。
  • 不要在擴展 DLL 中建立執行緒區域儲存 (TLS) 邏輯,由 MFC 核心管理。

總結

MFC 擴展 DLL 是建構可重用 MFC 類別庫的標準方式,關鍵在於正確使用 `AFX_EXT_CLASS` 等宏、確保雙方共享同一 MFC DLL 版本、並在 `DllMain` 正確初始化/終止擴展模組。

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