Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

Windows 文件映射實現共享記憶體:C++ 完整封裝類與測試範例

編輯:系統常見問題解答

Windows 下利用 CreateFileMapping / MapViewOfFile API 可輕鬆實現進程間共享記憶體,類似 Linux shm 機制。下方提供一個可直接使用的 C++ 封裝類 shareMemory,支援檔案映射與分頁檔映射兩種模式。

核心類設計

class shareMemory {
private:
    LPWSTR shm_name_u;
    bool is_create_file;   // true=檔案映射,false=分頁檔映射
    void* sh_base;         // 映射基址
    HANDLE semaphore;      // 同步用信號量
    HANDLE file_mapping;   // 映射物件控制碼
    int addr_len;          // 映射大小

public:
    // 建構子:指定名稱與模式
    shareMemory(const std::string& name, bool create_file = false);

    // 開啟/建立映射區
    // addr: 指定映射位址(NULL 由系統決定)
    // length: 映射大小(位元組)
    // protect: PAGE_READWRITE / FILE_MAP_READ 等
    void* shm_open(void* addr, int length, DWORD protect);

    // 寫入資料,返回實際寫入位元組數
    int shm_write(void* dest, void* src, int size);

    // 讀取資料,返回實際讀取位元組數
    int shm_read(void* src, void* dest, int size);

    // 解構子:釋放所有資源
    ~shareMemory();
};

關鍵實現細節

  • 檔案映射模式(create_file=true):在磁碟建立同名檔案,資料持久化,進程結束後內容保留
  • 分頁檔模式(預設):不佔用磁碟,效能較高,進程結束即釋放
  • 信號量同步:WaitForSingleObject / ReleaseSemaphore 保護讀寫區段
  • 位址檢查:check_adress() 防止越界存取
  • 強制刷新:寫入後呼叫 FlushViewOfFile 確保資料落盤(檔案模式)

測試程式:寫入進程

int main() {
    shareMemory sm("boost", false);  // 分頁檔模式
    void* bs = sm.shm_open(NULL, 1000*4, FILE_MAP_WRITE);
    if (!bs) return -1;

    int a[10] = {0,1,2,3,4,5,6,7,8,9};
    sm.shm_write(bs, a, 10*4);
    Sleep(100000);  // 保持映射存活供讀取進程存取
    return 0;
}

測試程式:讀取進程

int main() {
    shareMemory sm("boost", false);
    void* bs = sm.shm_open(NULL, 1000, FILE_MAP_READ);
    if (!bs) return -1;

    int b[10];
    sm.shm_read(bs, b, 10*4);
    for (int i=0; i<10; ++i) std::cout << b[i] << " ";
    return 0;
}

編譯與執行建議

  • 需連結 kernel32.lib(Visual Studio 預設已包含)
  • 先啟動寫入進程,再啟動讀取進程
  • 若需跨使用者 Session 共享,映射名稱加 Global\\ 前綴,且需 SeCreateGlobalPrivilege 權限

此封裝類已涵蓋建立、開啟、讀寫、同步、清理完整生命週期,可直接整合至專案中作為高效 IPC 機制。

Copyright © Windows教程網 All Rights Reserved