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

MFC 擴充 DLL 開發入門:從建立到呼叫完整實例

     編輯:關於VC++

前言

MFC 擴充 DLL(Extension DLL)共享 MFC DLL 版本,適合在 MFC 應用程式之間共用類別與資源。本文以最簡單的「匯出函式」範例,示範建立 DLL 與載入呼叫的完整流程。

一、建立 MFC 擴充 DLL 專案

  1. VC++ 6.0 → 專案類型選 MFC AppWizard (dll) → 命名專案(如 MyMfcDll)。
  2. 精靈步驟選 MFC Extension DLL (using shared MFC DLL) → 完成。

二、定義匯出函式

在 MyMfcDll.cpp 中:

extern "C" __declspec(dllexport) void ShowMessage() {
    AFX_MANAGE_STATE(AfxGetStaticModuleState()); // 關鍵:切換模組狀態
    AfxMessageBox(_T("此函式來自 MFC 擴充 DLL"));
}
  • extern "C":避免 C++ 名稱修飾,利於非 C++ 語言呼叫。
  • __declspec(dllexport):宣告匯出(或在 .def 檔加入函式名)。
  • AFX_MANAGE_STATE:必須在每個匯出函式入口加入,確保 MFC 正確尋找資源。

三、編譯產出

建置專案,Debug/MyMfcDll.dll 與 .lib 自動產生。

四、建立呼叫端應用程式

  1. 新建 MFC AppWizard (exe) - 對話式 專案(如 UseDll)。
  2. 介面:一個編輯框顯示 DLL 路徑(變數 m_strPath),三個按鈕:選擇 DLL、執行函式、結束。

核心程式碼

void CUseDllDlg::OnSelect() {
    CFileDialog dlg(TRUE, _T("dll"), NULL, OFN_HIDEREADONLY,
        _T("DLL 檔案 (*.dll)|*.dll|所有檔案 (*.*)|*.*||"));
    if (dlg.DoModal() == IDOK) {
        m_strPath = dlg.GetPathName();
        UpdateData(FALSE);
    }
}

void CUseDllDlg::OnButtonRun() {
    UpdateData(TRUE);
    HMODULE hDll = ::LoadLibrary(m_strPath);
    if (!hDll) { AfxMessageBox(_T("載入 DLL 失敗")); return; }

    typedef void (*PFN_SHOW)();
    PFN_SHOW pShow = (PFN_SHOW)::GetProcAddress(hDll, "ShowMessage");
    if (!pShow) { AfxMessageBox(_T("找不到匯出函式")); }
    else { pShow(); } // 呼叫

    ::FreeLibrary(hDll);
}

五、進階補充

  • 匯出類別:在類別宣告前加 __declspec(dllexport),呼叫端包含標頭檔並連結 .lib 即可直接使用,無需 GetProcAddress。
  • 共享資源:DLL 中的對話框、圖示等資源,呼叫端需用 AfxSetResourceHandle(hDll) 切換資源鏈柄。
  • 記憶體管理:DLL 與 EXE 共用 CRT 堆積(需同樣用動態連結 MFC/CRT),new/delete 可跨邊界,但建議提供專用釋放函式。

總結

MFC 擴充 DLL 開發核心在於:正確設定專案類型、匯出介面加 AFX_MANAGE_STATE、呼叫端動態載入與函式指標轉型。掌握此流程即可輕鬆實現模組化開發與程式碼複用。

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