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

VC++ DLL 編程深度解析(三):MFC 普通 DLL 創建、靜態/動態鏈接選擇與資源切換

     編輯:VC 教學

本系列第三部分詳細講解 MFC 普通 DLL (Regular DLL):內部可使用 MFC,但導出介面必須為 C 風格函數或非 MFC 類,可被任意語言(VB、Delphi、C#、純 C++)調用。核心難點在於靜態/動態鏈接 MFC 的選擇與模塊狀態切換。

MFC 普通 DLL 兩種鏈接模式對比

維度靜態鏈接 MFC動態鏈接 MFC (共享 MFC DLL)
MFC 代碼直接鏈接進 DLL 體積較大運行時依賴 MFCxx.dll 體積小
資源處理自動使用 DLL 自身資源,無需切換默認使用宿主 EXE 資源句柄,必須手動切換模塊狀態
適用場景簡單工具類 DLL、避免部署依賴大型 DLL、多 DLL 共享 MFC、插件架構

Visual C++ 6.0 專案設定位置

Project → Settings → General → Microsoft Foundation Classes 下拉選單:

  • Use MFC in a Static Library → 靜態鏈接
  • Use MFC in a Shared DLL → 動態鏈接(預設)

向導創建流程

  1. File → New → Projects → MFC AppWizard (dll)
  2. 步驟 1 選擇 Regular DLL using shared MFC DLL 或 Regular DLL with MFC statically linked。
  3. 可選支援:Automation(OLE 自動化)、Windows Sockets(自動加入 AfxSocketInit)、Source file comments。

動態鏈接模式下的資源切換機制

MFC 透過 AFX_MODULE_STATE 追蹤當前資源鏈。DLL 導出函數入口必須執行:

// 導出函數標準模板
extern "C" AFX_API_EXPORT void MyExportedFunction() {
    AFX_MANAGE_STATE(AfxGetStaticModuleState()); // 關鍵:切換到 DLL 模塊狀態
    // 此處安全使用 DLL 內資源:LoadIcon, DoModal, LoadString 等
    CMyDialog dlg;
    dlg.DoModal();
}

AFX_MANAGE_STATE 構造函數保存舊狀態並設定新狀態,析構函數自動恢復,確保線程安全與異常安全。

實戰範例:導出帶 MFC 對話框的函數

DLL 端資源

  • 資源視圖新增對話框 IDD_MYDLG,按鈕 IDC_HELLO。
  • ClassWizard 關聯 CMyDialog : CDialog,處理 BN_CLICKED 彈出 MessageBox。

導出函數

// MyDll.cpp
#include "stdafx.h"
#include "MyDll.h"
#include "MyDialog.h"

extern "C" AFX_API_EXPORT void ShowMyDialog() {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    CMyDialog dlg;
    dlg.DoModal();
}

應用程式調用

// 宿主 EXE (任意語言)
extern "C" __declspec(dllimport) void ShowMyDialog(); // VC++
// 或 Declare Sub ShowMyDialog Lib "MyDll.dll" () ' VB6

// 按鈕點擊
ShowMyDialog(); // 彈出 DLL 內對話框,資源正確加載

靜態鏈接模式下的簡化

無需 AFX_MANAGE_STATE,直接使用 DLL 內資源。但 DLL 體積膨脹(約 +300KB),且多個靜態鏈接 DLL 同時載入會有重複 MFC 代碼。

調試技巧

  • 將 DLL 專案與宿主 EXE 專案放入同一 Workspace,宿主設為啟動項。
  • DLL 導出函數處設置斷點,F11 單步進入 DLL 源碼。
  • 動態鏈接模式下,輸出目錄需有正確版本 MFC42.DLL / MSVCRT.DLL。

掌握「鏈接模式選擇 → 資源切換 → 導出介面設計」三部曲,即可游刃有餘開發高兼容性的 MFC 普通 DLL。

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