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

VC++ 實現 DLL 向 EXE 發送自定義消息的完整方案

     編輯:VC++

核心難點

DLL 與 EXE 屬於不同模塊,雖共享進程地址空間,但消息映射表各自獨立。實現跨模塊消息通信需解決:

  1. 雙方定義相同數值的自定義消息常量。
  2. EXE 將接收消息的窗口句柄 (HWND) 傳遞給 DLL。

消息定義規範

自定義消息建議從 WM_USER + 100 起步,預留 100 個給系統控件使用,避免衝突:

// 統一放在雙方共用的頭文件或各自 stdafx.h
#define WM_MY_CUSTOM_MSG (WM_USER + 102)

EXE 端實現(接收方)

  1. 聲明處理函數 (類頭文件 AFX_MSG 區):
    afx_msg LRESULT OnMyMsg(WPARAM wParam, LPARAM lParam);
  2. 消息映射 (實現文件):
    BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
        ON_MESSAGE(WM_MY_CUSTOM_MSG, OnMyMsg)
    END_MESSAGE_MAP()
  3. 處理函數體:
    LRESULT CTestDlg::OnMyMsg(WPARAM wParam, LPARAM lParam) {
        AfxMessageBox(_T("收到 DLL 消息!"));
        return 0;
    }

DLL 端實現(發送方)

  1. 導出函數聲明 (DLL 頭文件):
    extern "C" _declspec(dllexport) void StartSendMessage(HWND hwnd);
  2. 導出函數實現 (DLL 類成員):
    void CMessageDLLApp::SendMessage(HWND hwnd) {
        ::PostMessage(hwnd, WM_MY_CUSTOM_MSG, 0, 1); // 異步發送
    }
    
    extern "C" _declspec(dllexport) void StartSendMessage(HWND hwnd) {
        theApp.SendMessage(hwnd); // theApp 為 DLL 的 CWinApp 派生對象
    }

EXE 動態加載 DLL 並調用

void CTestDlg::OnBnClickedButton1() {
    typedef void (_cdecl *STARTSENDMESSAGE)(HWND);
    HMODULE hDll = LoadLibrary(_T("MessageDLL.dll"));
    if (!hDll) return;

    STARTSENDMESSAGE pfn = (STARTSENDMESSAGE)GetProcAddress(hDll, "StartSendMessage");
    if (!pfn) { FreeLibrary(hDll); return; }

    HWND hwnd = this->GetSafeHwnd();
    pfn(hwnd); // 傳遞自身窗口句柄

    // 測試用:也可直接 PostMessage 驗證映射表
    // ::PostMessage(hwnd, WM_MY_CUSTOM_MSG, 0, 1);
}

關鍵點對比:PostMessage vs SendMessage

特性PostMessageSendMessage
調用方式異步,投遞到消息隊列即返回同步,直接調用窗口過程,等待返回
阻塞風險無若接收方處理慢會阻塞發送線程
適用場景通知類、高頻事件、跨線程需即時返回值、同步操作

常見坑與避雷指南

  • 消息值不一致:雙方必須包含同一頭文件或數值完全一致。
  • HWND 傳遞錯誤:必須傳接收消息窗口的有效 HWND (如對話框 GetSafeHwnd()),不可傳 NULL 或錯誤句柄。
  • DLL 卸載時機:若 DLL 被 FreeLibrary 卸載,其導出函數指針失效,切勿在異步回調中使用已卸載 DLL 的代碼/數據。
  • 線程親和性:PostMessage 將消息投遞到創建窗口的線程隊列,確保接收方在 UI 線程處理,符合 MFC 單線程 UI 規範。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved