簡體   English   中英

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

[英]MapViewOfFile returns different addresses with same handle

我正在嘗試通過共享內存為學校作業實現IPC。 我制作了一個名為SharedMemoryBuffer的類來處理創建文件映射和視圖。

我的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次),打印出緩沖區的地址( Init() pBuf ),但它們都是不同的地址。

我不能為一生的愛弄清楚為什么地址會有所不同! 我已經確保第二次使用與確實打開文件映射相同的名稱調用Init()

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

您在過程中兩次映射同一區域。 您將獲得兩個不同的地址,但是它們由相同的物理內存支持。 寫入第一個地址指向的緩沖區會修改第二個地址指向的緩沖區,因為它們實際上是相同的內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM