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

MFC DLL 開發入門(一):DLL 類型選擇、導出語法與客戶端調用全流程

     編輯:關於VC++

一、MFC 支持的三種 DLL 類型

類型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 專案

  1. File → New → Projects → MFC AppWizard (dll)
  2. 選擇 DLL 類型(擴展/常規動態/常規靜態)
  3. Finish 生成樁代碼

三、導出語法大全

1. 導出類

// 擴展 DLL 推薦宏(自動處理 dllexport/dllimport)
class AFX_EXT_CLASS CMyClass { ... };

// 通用寫法
class __declspec(dllexport) CMyClass { ... };

2. 導出全局變量/常量/對象

__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); // 對象

注意: 僅限全局作用域;每個加載進程擁有獨立副本,修改不跨進程同步。

3. 導出函數

// 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());
    // ...
}

4. 導出指針

__declspec(dllexport) int* g_pInt;
__declspec(dllexport) CMyClass* g_pObj = new CMyClass; // 初始化

生命週期管理:

  • 擴展 DLL:在 DllMain 中處理 DLL_PROCESS_DETACH 釋放。
  • 常規 DLL:在 CWinApp 派生類 ExitInstance 中釋放。

四、客戶端調用配置

  1. 複製 .dll、.lib 到客戶端項目目錄。
  2. Project → Settings → Link → Object/library modules 添加 Debug/MyDll.lib (或 Release)。
  3. 包含導出頭文件,將 dllexport 改為 dllimport(或統一使用宏):
    // 客戶端頭文件
    __declspec(dllimport) int MyFunc(int);
    __declspec(dllimport) int g_nValue;
    __declspec(dllimport) CMyClass g_obj;
    class __declspec(dllimport) CMyClass { ... };
  4. 擴展 DLL 客戶端同樣用 AFX_EXT_CLASS 宏。

五、.def 文件導出替代方案

除 __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 { ... };
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved