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

VC++ 6.0 利用視窗訊息實現行程間通訊 (IPC) 完整範例

     編輯:關於VC++

前言

行程間通訊 (IPC) 方式眾多:共享記憶體、管道、郵槽、Socket 等。訊息機制雖資料量小、資訊有限,但實作簡單、靈活,適合主控程式與工作程式之間的命令/回應場景。

Windows 訊息機制回顧

  • PostMessage (進隊訊息):將訊息放入目標執行緒訊息隊列,立即返回,不等待處理完成
  • SendMessage (不進隊訊息):直接呼叫目標視窗程序,阻塞直到處理完成返回

MSG 結構包含:hwnd (目標視窗)、message (訊息編號)、wParam/lParam (參數)、time、pt (游標位置)。

主控程式 (Sender) 實作步驟

  1. 建立 MFC Single Document 專案 Sender
  2. 加入三個選單項目:「命令一/二/三」與對應處理函式
  3. 定義自訂訊息:#define WM_COMM WM_USER+100
  4. 發送邏輯:
void CSenderView::OnSendComm1() {
    CWnd* pWnd = CWnd::FindWindow(NULL, _T("Receiver"));
    if (pWnd) pWnd->SendMessage(WM_COMM, 0, 0);
}
void CSenderView::OnSendComm2() {
    CWnd* pWnd = CWnd::FindWindow(NULL, _T("Receiver"));
    if (pWnd) pWnd->SendMessage(WM_COMM, 0, 1);
}
void CSenderView::OnSendComm3() {
    CWnd* pWnd = CWnd::FindWindow(NULL, _T("Receiver"));
    if (pWnd) pWnd->SendMessage(WM_COMM, 1, 0);
}

底層工作程式 (Receiver) 實作步驟

  1. 建立 MFC Single Document 專案 Receiver
  2. InitInstance() 結尾設定視窗標題:m_pMainWnd->SetWindowText(_T("Receiver"));
  3. 定義相同自訂訊息 WM_COMM
  4. 訊息映射:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    ON_WM_CREATE()
    ON_MESSAGE(WM_COMM, OnSendMsg)
END_MESSAGE_MAP()
  1. 處理函式:
void CMainFrame::OnSendMsg(WPARAM wParam, LPARAM lParam) {
    if (wParam==0 && lParam==0) AfxMessageBox(_T("主控程式發送命令一!"));
    else if (wParam==0 && lParam==1) AfxMessageBox(_T("主控程式發送命令二!"));
    else if (wParam==1 && lParam==0) AfxMessageBox(_T("主控程式發送命令三!"));
}

執行行為差異

  • SendMessage:主控程式阻塞,直到 Receiver 處理完 (對話框關閉) 才繼續
  • PostMessage:主控程式不阻塞,適合非同步通知

實際專案應根據需求選擇,並設計完善的協議 (wParam/lParam 組合、自訂結構體配合 WM_COPYDATA)。

結論

訊息機制提供清晰的層級介面,上下層僅透過訊息協議通訊,降低耦合度。配合 FindWindow 或更穩健的進程列舉方式取得目標視窗控制代碼,可構建輕量級 IPC 系統。

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