在windows系统中,如何使用C++调用在不同进程间进行内存共享的方法及使用示例

在Windows系统中,实现不同进程间内存共享的方法通常涉及使用命名内存映射文件(Named Memory-Mapped Files)或者Windows的API来创建共享内存区域。以下是使用命名内存映射文件实现进程间内存共享的一个简单示例:

使用命名内存映射文件

创建共享内存的进程(Writer.cpp)

#include <iostream>
#include <fstream>
#include <windows.h>

int main() {
    const char* sharedMemoryName = "Global\\MySharedMemory";
    const size_t sharedMemorySize = 1024; // 1KB
    HANDLE hMapFile = CreateFileMappingA(
        INVALID_HANDLE_VALUE,   // 使用分页文件
        NULL,                    // 默认安全属性
        PAGE_READWRITE,         // 读写权限
        0,                       // 高32位文件大小
        sharedMemorySize,        // 低32位文件大小
        sharedMemoryName         // 共享内存名称
    );

    if (hMapFile == NULL) {
        std::cerr << "CreateFileMapping failed with error: " << GetLastError() << std::endl;
        return 1;
    }

    // 将文件映射对象映射到进程的地址空间
    char* pMapAddress = static_cast<char*>(MapViewOfFile(
        hMapFile,                  // 文件映射对象的句柄
        FILE_MAP_ALL_ACCESS,      // 读写权限
        0,                         // 偏移高32位
        0,                         // 偏移低32位
        0                          // 映射整个文件
    ));

    if (pMapAddress == NULL) {
        std::cerr << "MapViewOfFile failed with error: " << GetLastError() << std::endl;
        CloseHandle(hMapFile);
        return 1;
    }

    // 写入数据到共享内存
    std::strcpy(pMapAddress, "Hello from shared memory!");

    // 保持程序运行,以便其他进程可以读取数据
    std::cout << "Data written to shared memory. Press Enter to continue..." << std::endl;
    std::cin.get();

    // 解除映射
    if (!UnmapViewOfFile(pMapAddress)) {
        std::cerr << "UnmapViewOfFile failed with error: " << GetLastError() << std::endl;
    }

    // 关闭文件映射对象句柄
    CloseHandle(hMapFile);

    return 0;
}

读取共享内存的进程(Reader.cpp)

#include <iostream>
#include <windows.h>

int main() {
    const char* sharedMemoryName = "Global\\MySharedMemory";
    HANDLE hMapFile = OpenFileMappingA(
        FILE_MAP_ALL_ACCESS,   // 读写权限
        FALSE,                 // 不继承句柄
        sharedMemoryName       // 共享内存名称
    );

    if (hMapFile == NULL) {
        std::cerr << "OpenFileMapping failed with error: " << GetLastError() << std::endl;
        return 1;
    }

    // 将文件映射对象映射到进程的地址空间
    char* pMapAddress = static_cast<char*>(MapViewOfFile(
        hMapFile,                  // 文件映射对象的句柄
        FILE_MAP_ALL_ACCESS,      // 读写权限
        0,                         // 偏移高32位
        0,                         // 偏移低32位
        0                          // 映射整个文件
    ));

    if (pMapAddress == NULL) {
        std::cerr << "MapViewOfFile failed with error: " << GetLastError() << std::endl;
        CloseHandle(hMapFile);
        return 1;
    }

    // 从共享内存读取数据
    std::cout << "Data from shared memory: " << pMapAddress << std::endl;

    // 解除映射
    if (!UnmapViewOfFile(pMapAddress)) {
        std::cerr << "UnmapViewOfFile failed with error: " << GetLastError() << std::endl;
    }

    // 关闭文件映射对象句柄
    CloseHandle(hMapFile);

    return 0;
}

在上面的示例中,Writer.cpp创建了一个命名内存映射文件,并向其中写入了一个字符串。Reader.cpp则打开了这个命名内存映射文件,并读取了其中的数据。

请注意,在Windows上创建全局命名的共享对象(如共享内存、信号量、互

相关推荐

  1. MFC内存共享调用方法使用示例

    2024-03-15 12:44:02       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-15 12:44:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-15 12:44:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-15 12:44:02       82 阅读
  4. Python语言-面向对象

    2024-03-15 12:44:02       91 阅读

热门阅读

  1. Springboot参数分组校验

    2024-03-15 12:44:02       36 阅读
  2. 阿里云服务 安装 Docker

    2024-03-15 12:44:02       43 阅读
  3. 《数据库》复试问答题总结

    2024-03-15 12:44:02       38 阅读
  4. 软考网络工程师 第五章 第六节 WLAN安全

    2024-03-15 12:44:02       41 阅读
  5. C# tcp通信连接正常判断

    2024-03-15 12:44:02       44 阅读
  6. ARM/Linux嵌入式面试专栏前言

    2024-03-15 12:44:02       40 阅读