gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:00:25 26 4
gpt4 key购买 nike

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

我的 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);

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

我无法理解为什么地址会不同!我已确保我第二次使用相同的名称调用 Init() 时确实成功打开了文件映射。

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

最佳答案

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

关于c++ - MapViewOfFile 返回具有相同句柄的不同地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46169245/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com