MFC 擴展 DLL 是 MFC 類別庫的延伸,允許從現有 MFC 類別衍生可重複使用的新類別,並直接對外公開 MFC 類別介面。本文整理其核心特徵、入口函數差異、導出宏機制與使用限制。
| 類型 | MFC 使用方式 | 入口函數 | 介面特徵 | 呼叫端需求 |
|---|---|---|---|---|
| 非 MFC DLL | 不使用 MFC | 程式設計師自行實作 DllMain | 純 C 風格函數/變數 | 任何語言 |
| MFC 一般 DLL | 共享 MFC DLL 版本 | CWinApp 物件的 InitInstance/ExitInstance | C 風格函數(可內部用 MFC) | 任何語言 |
| MFC 擴展 DLL | 共享 MFC DLL 版本 | 精靈自動生成 DllMain | 可直接導出 MFC 類別 | 僅限共享 MFC 版本的 MFC EXE 或一般 DLL |
為了讓同一組標頭檔在 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;

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