MapViewOfFile返回具有相同句柄的不同地址

时间:2017-09-12 06:20:40

标签: c++ ipc

我正在尝试通过共享内存来实现IPC的学校作业。 我创建了一个名为SharedMemoryBuffer的类来处理创建文件映射和视图。

我的Init()函数如下所示:

BYTE * SharedMemoryBuffer::Init(const wchar_t * name, size_t bufferSize)
{

    FileMapHandle = OpenFileMapping(
        FILE_MAP_ALL_ACCESS,   // read/write access
        FALSE,                 // do not inherit the name
        name);               // name of mapping object

    if (FileMapHandle == NULL)
    {
        FileMapHandle =
            CreateFileMapping(INVALID_HANDLE_VALUE,
                NULL,
                PAGE_READWRITE,
                0,
                bufferSize,
                name);

        pBuf = (BYTE*)MapViewOfFile(FileMapHandle, // handle to map object
            FILE_MAP_ALL_ACCESS,  // read/write permission
            0,
            0,
            bufferSize);
    }
    else
    {
        pBuf = (BYTE*)MapViewOfFile(
            FileMapHandle,
            FILE_MAP_ALL_ACCESS,
            0,
            0,
            bufferSize
        );
    }
    return this->GetBuffer();
}

基本上,我传给它一个名称和大小,它试图用这个名字打开一个映射。如果失败,则会创建它。

我这样称呼它 this->ringBuffer.Init(widestr.c_str(), buffSize);

完成此操作后(我从同一个进程调用Init 4次2个缓冲区)我打印出缓冲区的地址(pBuf来自Init()),但它们都是不同的地址。 / p>

我无法对生命的热爱弄清楚为什么地址会有所不同! 我已经确定第二次使用相同名称调用Init(),确实可以成功打开文件映射。

来源:https://github.com/RavioliFinoli/SharedMemory

1 个答案:

答案 0 :(得分:1)

您在流程中将同一区域映射两次。您将获得两个不同的地址,但它们由相同的物理内存支持。写入第一个地址指向的缓冲区会修改第二个地址指向的缓冲区,因为它们实际上是相同的内存。