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

Win32 進程間通訊 (IPC) 技術全解析:共享記憶體、記憶體映射檔、WM_COPYDATA、Read/WriteProcessMemory

     編輯:VC 教學

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用戶驅動、格式協商用戶複製貼上

選型建議

  1. **同機器、高效能、大資料** → Memory-Mapped File + Mutex/Event。
  2. **同機器、雙向命令/回應、結構化** → Named Pipe。
  3. **跨語言、跨網路、服務化** → Socket (TCP) / gRPC / REST。
  4. **簡單通知、單向、小資料** → WM_COPYDATA / MailSlot。
  5. **既有 COM 元件** → COM/RPC。

同步物件速查

  • CreateMutex:互斥鎖,跨進程命名。
  • CreateEvent:手動/自動重置事件,通知機制。
  • CreateSemaphore:計數信號,資源池控制。
  • InitializeCriticalSection:**僅進程內**有效,不可跨進程。

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