Win32 - 进程间通信(IPC)共享内存

在 Windows 系统中,共享内存通过 文件映射对象(File Mapping Object) 实现。

核心思想是:

  • 由一个进程创建一个 命名的内存映射文件;
  • 其他进程通过该名称 打开同一个映射对象;
  • 通过 MapViewOfFile() 函数把这段共享区域映射到自己进程的虚拟地址空间;
  • 各进程即可读写同一段内存,实现数据共享。

 

示例代码:

服务端:

#include <iostream>
#include <Windows.h>
using namespace std;
 
#define BUF_SIZE 1024
 
int main()
{
    // 要共享的数据
    char szBuffer[] = "C/C++";
 
    // 1. 创建共享文件映射对象
    HANDLE hMapFile = CreateFileMapping(
        INVALID_HANDLE_VALUE, // 使用系统分页文件
        NULL,                 // 默认安全属性
        PAGE_READWRITE,       // 可读可写
        0,                    // 高32位文件大小
        BUF_SIZE,             // 共享内存大小
        L"LSEDU"              // 共享内存名称(标识)
    );
 
    if (hMapFile == NULL)
    {
        cout << "创建共享内存失败!错误码:" << GetLastError() << endl;
        return 0;
    }
 
    // 2. 映射到当前进程的地址空间
    LPVOID lpBase = MapViewOfFile(
        hMapFile,           // 映射对象句柄
        FILE_MAP_ALL_ACCESS, // 读写权限
        0, 0, BUF_SIZE
    );
 
    if (lpBase == NULL)
    {
        cout << "映射内存失败!错误码:" << GetLastError() << endl;
        CloseHandle(hMapFile);
        return 0;
    }
 
    // 3. 向共享内存写入数据
    strcpy((char*)lpBase, szBuffer);
    cout << "\n服务器程序端: " << (char*)lpBase << endl << endl;
 
    // 挂起等待客户端读取数据
    Sleep(20000);
 
    // 4. 释放资源
    UnmapViewOfFile(lpBase);
    CloseHandle(hMapFile);
 
    return 0;
}

 

客户端:

#include <iostream>
#include <Windows.h>
using namespace std;
 
#define BUF_SIZE 1024
 
int main()
{
    // 1. 打开已存在的共享内存对象
    HANDLE hMapFile = OpenFileMapping(
        FILE_MAP_ALL_ACCESS, // 访问权限
        FALSE,               // 不继承句柄
        L"LSEDU"             // 必须与服务端名称一致
    );
 
    if (hMapFile == NULL)
    {
        cout << "打开共享内存失败,请检查服务器是否启动。" << endl;
        return 0;
    }
 
    // 2. 映射到当前进程地址空间
    LPVOID lpBase = MapViewOfFile(
        hMapFile,
        FILE_MAP_ALL_ACCESS,
        0, 0, BUF_SIZE
    );
 
    if (lpBase == NULL)
    {
        cout << "映射失败!错误码:" << GetLastError() << endl;
        CloseHandle(hMapFile);
        return 0;
    }
 
    // 3. 从共享内存中读取数据
    char szBuffer[BUF_SIZE] = { 0 };
    strcpy(szBuffer, (char*)lpBase);
    cout << "\n客户端程序端: " << szBuffer << endl << endl;
 
    // 4. 释放资源
    UnmapViewOfFile(lpBase);
    CloseHandle(hMapFile);
 
    return 0;
}

 

运行结果:

image

posted @ 2026-06-09 23:21  [BORUTO]  阅读(10)  评论(0)    收藏  举报