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

VC++ 6.0 進程間通訊實戰:自定義訊息實現主控與底層程式協作

     編輯:VC 教學

為何選擇訊息機制?

IPC 方式眾多(共享記憶體、管道、Socket 等),訊息機制雖資料量小,但實作簡單、介面清晰,極適合「上層主控下發指令、底層回報狀態」的低頻互動場景。

Windows 訊息架構回顧

  • 每個執行緒擁有訊息佇列
  • PostMessage:投遞到佇列,不等待處理(非同步)
  • SendMessage:直接呼叫視窗程序,阻塞直到處理完畢(同步)

主控程式 (Sender) 實作

  1. 建立 MFC 單文檔專案 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 單文檔專案 Receiver
  2. InitInstance 末尾設定視窗標題:m_pMainWnd->SetWindowText(_T("Receiver"));
  3. 同樣定義 WM_COMM
  4. 訊息映射加入:ON_MESSAGE(WM_COMM, OnSendMsg)
  5. 處理函數:
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,主控程式會阻塞直到模態對話框關閉。若不希望阻塞,改用 PostMessage 即可。視業務需求決定:指令下發確認用同步,狀態通報用非同步。

擴展建議

  • 定義結構體透過 LPARAM 傳遞指標(需共享記憶體或序列化)
  • 加入心跳機制檢測對方存活
  • 使用 RegisterWindowMessage 取得系統唯一訊息 ID,避免衝突

結語

訊息式 IPC 以「契約(wParam/lParam 定義)」為介面,上下層解耦明確,是中小型專案快速落地的不二之選。

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