IPC 機制總覽表
| 機制 | 跨機器 | 資料類型 | 同步/非同步 | 適用場景 | 複雜度 |
| 剪貼板 | 否 | 任意 (標準格式) | 同步 | 使用者手動複製貼上、少量資料交換 | 低 |
| COM/DCOM | 是 | 介面方法參數 | 同步/非同步 | 物件導向跨行程/跨機器呼叫、元件重用 | 高 |
| DDE | 否 | 文字/資料塊 | 非同步 | 舊版應用程式相容 (Excel、Word 早期版本) | 中 |
| 檔案映射 | 否 | 位元組流 (共享記憶體) | 需自行同步 | 大量資料高速共享、同機器多行程 | 中 |
| 郵件槽 | 是 (單向) | 資料包 (廣播/單播) | 非同步 | 簡單通知、日誌收集、尋找伺服器 | 低 |
| 管道 (無名) | 否 | 位元組流 | 同步/非同步 | 父子行程標準輸入輸出重導向 | 低 |
| 管道 (有名) | 是 | 位元組流/訊息模式 | 同步/非同步 | 客戶端-伺服器高可靠雙向通訊 | 中 |
| RPC | 是 | IDL 定義結構 | 同步/非同步 | 企業級分散式系統、COM 底層 | 極高 |
| Windows Sockets | 是 | 位元組流/資料包 | 同步/非同步 | 跨平台網路通訊、Web 服務、遊戲 | 中高 |
| WM_COPYDATA | 否 | 位元組塊 | 同步 | 同桌面視窗行程間簡單資料傳遞 | 極低 |
核心機制深度解析
檔案映射 — 高速共享記憶體
// 建立/開啟
HANDLE hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 4096, _T("Global\\MySharedMem"));
LPVOID pView = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
// 使用 pView 讀寫,需搭配 Mutex/Event 同步
UnmapViewOfFile(pView); CloseHandle(hMap);
- 支援大檔案分頁映射 (
MapViewOfFileEx 指定位址)。 INVALID_HANDLE_VALUE 表示使用系統分頁檔,不持久化。
有名管道 — 可靠雙向通訊
// 伺服器端
HANDLE hPipe = CreateNamedPipe(_T("\\\\.\\pipe\\MyPipe"),
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
PIPE_UNLIMITED_INSTANCES, 4096, 4096, 0, NULL);
ConnectNamedPipe(hPipe, &overlapped); // 非同步等待連線
// 讀寫用 ReadFile/WriteFile,訊息模式保證邊界
// 客戶端
HANDLE hPipe = CreateFile(_T("\\\\.\\pipe\\MyPipe"), GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
// 直接 ReadFile/WriteFile
郵件槽 — 輕量廣播
// 伺服器 (接收端)
HANDLE hSlot = CreateMailslot(_T("\\\\.\\mailslot\\MySlot"), 0, MAILSLOT_WAIT_FOREVER, NULL);
ReadFile(hSlot, buf, size, &read, NULL);
// 客戶端 (發送端,可廣播)
HANDLE hSlot = CreateFile(_T("\\\\*\\mailslot\\MySlot"), GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
WriteFile(hSlot, msg, len, &written, NULL);
- 單向、不可靠 (資料包可能遺失/亂序)、支援網域廣播 (
\\*)。
WM_COPYDATA — 視窗行程最簡 IPC
// 發送端
COPYDATASTRUCT cds = { 0, (DWORD)dataSize, pData };
SendMessage(hTargetWnd, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)&cds);
// 接收端 (視窗程序)
case WM_COPYDATA:
COPYDATASTRUCT* pcds = (COPYDATASTRUCT*)lParam;
// 處理 pcds->lpData, 大小 pcds->cbData
return TRUE;
- 僅限同桌面互動視窗行程,資料複製兩次 (發送端→核心→接收端),不適合大量資料。
選型決策樹
需要跨機器? → 是 → 需物件導向/標準化? → 是 → COM/DCOM / Web Service (SOAP/REST) / gRPC
→ 否 → 簡單通知/廣播? → 是 → 郵件槽
→ 否 → 高效能雙向流? → 是 → 有名管道 / Sockets
→ 否 → RPC (企業級)
同機器? → 大量資料高速共享? → 是 → 檔案映射 + 同步物件
→ 父子行程標準流? → 是 → 無名管道
→ 視窗行程簡單資料? → 是 → WM_COPYDATA
→ 一般客戶端-伺服器? → 是 → 有名管道 / 本地 Sockets (Loopback)
→ 舊系統相容? → DDE / 剪貼板