iga*_*l k 1 c++ windows pointers shared-memory
我试图了解我应该如何提取MapViewOfFile的返回缓冲区大小。我使用以下命令分配共享内存
hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE, nullptr, PAGE_READWRITE, 0, dwDataSize, strSharedMemoryName.c_str());
Run Code Online (Sandbox Code Playgroud)
使用以下代码片段将其填充:
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);
Run Code Online (Sandbox Code Playgroud)
然后,在其他地方,尝试重新打开该共享内存并读取整个缓冲区:
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;
}
Run Code Online (Sandbox Code Playgroud)
我的下一行将是
std::string strData = pData; // use std::string::assign
Run Code Online (Sandbox Code Playgroud)
但是,我不知道有多大pData,一种选择是将缓冲区的整体大小发送出去,但是MSDN指出VirtualQueryEx可以做到这一点。
我试图执行以下代码片段:
MEMORY_BASIC_INFORMATION info;
SIZE_T szBufferSize = ::VirtualQueryEx(::GetCurrentProcess(), pData, &info, sizeof(info));
Run Code Online (Sandbox Code Playgroud)
但这会给我一个页面的大小,如果我没记错的话,我该如何利用它来给我整个缓冲区的大小?
谢谢!
据我所知,没有办法检索现有文件映射或文件映射视图的大小。您应该自己跟踪此信息。
MSDN指出VirtualQueryEx可以执行此操作。
否,所有VirtualQueryEx都可以确定为该视图保留的页面数。这意味着结果总是四舍五入到页面大小。此外,也没有明确保证MapViewOfFile将仅保留映射文件所需的最少页面数。例如,它可能选择将其舍入到分配粒度。