gpt4 book ai didi

c++ - 提取共享内存的大小

转载 作者:可可西里 更新时间:2023-11-01 11:06:06 25 4
gpt4 key购买 nike

我正在尝试了解我应该如何提取 MapViewOfFile 的返回缓冲区大小。我使用以下命令分配共享内存

hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE, nullptr, PAGE_READWRITE, 0, dwDataSize, strSharedMemoryName.c_str());

使用以下代码片段填充内容:

pBuffer = DynamicAPI::MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, dwDataSize);
if (nullptr == pBuffer || GetLastError() != 0)
{
LOG_ERROR(L"Failed to MapViewOfFile: " << GetLastError());
break;
}
// Copy buffer to the shared memory
::CopyMemory(pBuffer, pData, dwDataSize);

然后,在其他地方,尝试重新打开共享内存并读取整个缓冲区:

HANDLE hSharedMemory = OpenFileMapping(FILE_MAP_READ, FALSE, m_strSharedName.c_str());
if (nullptr == hSharedMemory)
{
return false;
}

LPVOID pData = nullptr;
if (nullptr == (pData = MapViewOfFile(hSharedMemory, FILE_MAP_READ, 0, 0, 0)))
{
LOG_ERROR(L"Failed to MapViewOfFile");
return false;
}

我的下一行是

std::string strData = pData; // use std::string::assign

但是,我不知道 pData 有多大,一种选择是在缓冲区中发送整体大小,但是 MSDN 指出 VirtualQueryEx 能够做到这一点

我尝试执行以下代码片段:

MEMORY_BASIC_INFORMATION info;
SIZE_T szBufferSize = ::VirtualQueryEx(::GetCurrentProcess(), pData, &info, sizeof(info));

但是,如果我没弄错的话,它会给我单个页面的大小,我如何利用它来给我整个缓冲区的大小?

谢谢!

最佳答案

据我所知,没有办法检索现有文件映射或文件映射 View 的大小。您应该自己跟踪此信息。

MSDN states that VirtualQueryEx is capable of doing such thing.

不,VirtualQueryEx 只能确定为 View 保留的页数。这意味着结果总是四舍五入到页面大小。此外,没有明确保证 MapViewOfFile 将仅保留映射文件所需的最少页面数。例如,它可能会选择将其四舍五入到分配粒度。

关于c++ - 提取共享内存的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34860452/

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