提取共享内存的大小

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)

但这会给我一个页面的大小,如果我没记错的话,我该如何利用它来给我整个缓冲区的大小?

谢谢!

Har*_*ton 5

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

MSDN指出VirtualQueryEx可以执行此操作。

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