Win16 vs Win32 記憶體模型差異
- Win16:單一 32-bit 線性位址空間,所有進程共享,**GlobalAlloc(GMEM_SHARE) + GlobalLock** 即可跨進程存取。
- Win32:每進程獨立 4GB 虛擬位址空間,**指標不跨進程有效**。需核心物件輔助共享實體記憶體。
四大主流 IPC 機制
1. 記憶體映射檔 (Memory-Mapped File, MMF) —— 推薦首選
- 核心物件,對應實體記憶體/分頁檔,多進程映射同一區域至各自虛擬空間。
- API:
CreateFileMapping (建立/開啟) → MapViewOfFile (映射視圖) → 直接讀寫指標 → UnmapViewOfFile → CloseHandle。
- 命名物件 (
lpName) 實現跨進程共享。
- 同步:需搭配
Mutex/Event/Semaphore 避免競態。
- 優點:高效、大資料量、支援檔案持久化、跨網路 (Distributed File System)。
建立共享記憶體範例
// 進程 A (建立者)
HANDLE hMap = CreateFileMapping(
INVALID_HANDLE_VALUE, // 使用分頁檔,非實體檔案
NULL,
PAGE_READWRITE,
0, 4096, // 4KB
"Global\\MySharedMem" // 名稱 (Global\ 供跨 Session)
);
LPVOID pView = MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0);
// 寫入資料
strcpy((char*)pView, "Hello from Process A");
// 進程 B (開啟者)
HANDLE hMap = OpenFileMapping(FILE_MAP_READ, FALSE, "Global\\MySharedMem");
LPVOID pView = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
// 讀取資料
printf("%s\n", (char*)pView);
2. 共享記憶體 DLL (Shared Data Segment)
- 在 DLL 中宣告
#pragma data_seg(".SHARED") 區段,#pragma comment(linker, "/SECTION:.SHARED,RWS") 設為可讀寫共享。
- 該區段變數自動在所有載入 DLL 的進程間共享。
- 缺點:僅限同機器、同位元數進程、難以同步、安全性差 (任何進程可寫入)。
3. WM_COPYDATA 訊息
- Windows 訊息機制傳遞結構化資料 (指標+長度)。
- 發送端:
SendMessage(hwndTarget, WM_COPYDATA, (WPARAM)hwndSelf, (LPARAM)&cds)。
- 接收端:
WM_COPYDATA 處理函數中取得 COPYDATASTRUCT*。
- 限制:同步阻塞、需知道目標視窗句柄、資料量小 (< 64KB 建議)、不可跨 Session (服務↔互動桌面)。
4. ReadProcessMemory / WriteProcessMemory
- 需
PROCESS_VM_READ/PROCESS_VM_WRITE/PROCESS_VM_OPERATION 權限 (通常需 Debug 權限或同用戶進程)。
- 適用於除錯器、外掛、訓練器等特殊場景,**不適合一般應用 IPC**。
- 極易導致目標進程崩潰、安全風險高。
其他 IPC 技術補充
| 技術 | 特點 | 適用場景 |
| Named Pipe | 雙向、可靠、支援網路、模擬 Client/Server | 進程間高頻通訊、服務與 UI 通訊 |
| Socket (TCP/Unix Domain) | 跨機器、標準化、非同步 | 分散式、微服務、跨平台 |
| COM / RPC | 物件導向、IDL 定義、自動編碼解碼 | 大型元件化系統、跨語言 |
| MailSlot | 單向、廣播、不可靠 | 簡單通知、網路廣播 |
| Clipboard | 用戶驅動、格式協商 | 用戶複製貼上 |
選型建議
- **同機器、高效能、大資料** → Memory-Mapped File + Mutex/Event。
- **同機器、雙向命令/回應、結構化** → Named Pipe。
- **跨語言、跨網路、服務化** → Socket (TCP) / gRPC / REST。
- **簡單通知、單向、小資料** → WM_COPYDATA / MailSlot。
- **既有 COM 元件** → COM/RPC。
同步物件速查
CreateMutex:互斥鎖,跨進程命名。
CreateEvent:手動/自動重置事件,通知機制。
CreateSemaphore:計數信號,資源池控制。
InitializeCriticalSection:**僅進程內**有效,不可跨進程。