MapViewOfFile returns 具有相同句柄的不同地址
MapViewOfFile returns different addresses with same handle
我正在尝试通过共享内存为学校作业实施 IPC。
我制作了一个名为 SharedMemoryBuffer
的 class 来处理创建文件映射和视图。
我的 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()
,它确实成功打开了文件映射。
您在进程中两次映射同一区域。您将获得两个不同的地址,但它们由相同的物理内存支持。写入第一个地址指向的缓冲区会修改第二个地址指向的缓冲区,因为它们实际上是相同的内存。
我正在尝试通过共享内存为学校作业实施 IPC。
我制作了一个名为 SharedMemoryBuffer
的 class 来处理创建文件映射和视图。
我的 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()
,它确实成功打开了文件映射。
您在进程中两次映射同一区域。您将获得两个不同的地址,但它们由相同的物理内存支持。写入第一个地址指向的缓冲区会修改第二个地址指向的缓冲区,因为它们实际上是相同的内存。