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

VC++ 6.0 利用 Windows 訊息機制實現進程間通訊 (IPC) 完整範例

     編輯:VC 教學

Windows 訊息機制回顧

Windows 是訊息驅動架構。每個執行緒擁有訊息佇列,訊息結構 MSG 包含:hwnd (目標視窗)、message (訊息 ID)、wParam/lParam (參數)、time、pt (滑鼠座標)。

  • PostMessage:投遞到佇列,**非阻塞**,立即返回。
  • SendMessage:直接呼叫視窗程序,**阻塞**直到處理完成返回。

訊息迴圈核心:GetMessage → TranslateMessage → DispatchMessage。

自定義訊息定義

#define WM_USER_COMMAND (WM_USER + 100)  // 避免與系統訊息衝突

主控程式 (Controller) 實作

單一文件專案,選單項目「命令一/二/三」對應處理函數:

void CMainFrame::OnSendCmd1() { SendCommand(0, 0); }
void CMainFrame::OnSendCmd2() { SendCommand(0, 1); }
void CMainFrame::OnSendCmd3() { SendCommand(1, 0); }

void CMainFrame::SendCommand(WPARAM wp, LPARAM lp) {
    CWnd* pWnd = CWnd::FindWindow(NULL, _T("Receiver")); // 依視窗標題尋找
    if (pWnd) pWnd->SendMessage(WM_USER_COMMAND, wp, lp);
}

受控程式 (Worker) 實作

1. 設定可辨識視窗標題

BOOL CWorkerApp::InitInstance() {
    // ... 框架初始化 ...
    m_pMainWnd->SetWindowText(_T("Receiver")); // 關鍵:讓主控端 FindWindow 找到
    return TRUE;
}

2. 訊息對應與處理

// MainFrm.h
#define WM_USER_COMMAND (WM_USER + 100)

class CMainFrame : public CFrameWnd {
    // ...
    afx_msg void OnUserCommand(WPARAM wp, LPARAM lp);
    DECLARE_MESSAGE_MAP()
};

// MainFrm.cpp
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    ON_MESSAGE(WM_USER_COMMAND, OnUserCommand)
END_MESSAGE_MAP()

void CMainFrame::OnUserCommand(WPARAM wp, LPARAM lp) {
    if (wp == 0 && lp == 0) AfxMessageBox(_T("收到命令一"));
    else if (wp == 0 && lp == 1) AfxMessageBox(_T("收到命令二"));
    else if (wp == 1 && lp == 0) AfxMessageBox(_T("收到命令三"));
}

執行行為差異

  • 使用 SendMessage:主控程式發送後**阻塞**,直到受控程式彈出的 AfxMessageBox 被關閉。
  • 改用 PostMessage:主控程式**不阻塞**,適合高頻非同步通知。

優缺點與適用場景

優點缺點適用場景
實作簡單、無需共用記憶體/管道資料承載量小 (僅兩個參數)上層控制下層工作流、簡單命令觸發
視窗句柄即天然連接點需目標視窗存在、單機限制GUI 應用程式間鬆耦合協作

擴展建議

  • 傳遞複雜資料:配合 WM_COPYDATA 結構體傳遞緩衝區指標。
  • 跨權限/Session:改用具名管道、Socket 或共用記憶體 + 事件同步。
  • 健壯性:雙方約定協議版本、心跳檢測、重試機制。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved