| 類型 | MFC 鏈接方式 | 客戶端要求 | 導出接口限制 | 適用場景 |
|---|---|---|---|---|
| MFC 擴展 DLL | 動態鏈接 MFC DLL | 必須動態鏈接 MFC,且版本一致 | 可導出 C++ 類、MFC 類型參數/返回值 | MFC 擴展庫、插件系統 |
| 常規 DLL (動態鏈接 MFC) | 動態鏈接 MFC DLL | 無 MFC 要求 | 接口僅限 C 風格:基本類型、結構體、非 MFC 指針 | 通用組件、跨語言調用 |
| 常規 DLL (靜態鏈接 MFC) | 靜態鏈接 MFC (體積大) | 無 MFC 要求,無需部署 MFC DLL | 同動態常規 DLL | 無 MFC 環境的目標機器 |
// 擴展 DLL 推薦宏(自動處理 dllexport/dllimport)
class AFX_EXT_CLASS CMyClass { ... };
// 通用寫法
class __declspec(dllexport) CMyClass { ... };
__declspec(dllexport) int g_nValue;
__declspec(dllexport) extern const COLORREF g_clrRed = RGB(255,0,0); // 常量需 extern
__declspec(dllexport) CRect g_rect(10,10,20,20); // 對象
注意: 僅限全局作用域;每個加載進程擁有獨立副本,修改不跨進程同步。
// C++ 風格(擴展 DLL)
__declspec(dllexport) int MyFunc(int x);
// C 風格(常規 DLL,跨語言調用)
extern "C" __declspec(dllexport) int MyFunc(int x);
// 常規 DLL 動態鏈接 MFC 時必加
extern "C" __declspec(dllexport) int MyFunc(int x) {
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// ...
}
__declspec(dllexport) int* g_pInt;
__declspec(dllexport) CMyClass* g_pObj = new CMyClass; // 初始化
生命週期管理:
DllMain 中處理 DLL_PROCESS_DETACH 釋放。CWinApp 派生類 ExitInstance 中釋放。.dll、.lib 到客戶端項目目錄。Debug/MyDll.lib (或 Release)。dllexport 改為 dllimport(或統一使用宏):
// 客戶端頭文件
__declspec(dllimport) int MyFunc(int);
__declspec(dllimport) int g_nValue;
__declspec(dllimport) CMyClass g_obj;
class __declspec(dllimport) CMyClass { ... };
AFX_EXT_CLASS 宏。除 __declspec 外,可在模塊定義文件 (.def) 中列出導出符號:
LIBRARY MyDll
EXPORTS
MyFunc @1
g_nValue DATA
??0CMyClass@@QAE@XZ ; 裝飾名導出類構造函數(不推薦,極難維護)
推薦統一使用 __declspec(dllexport),配合宏自動切換 dllexport/dllimport:
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
class MYDLL_API CMyClass { ... };