如何使用命名共享内存

How to use named shared memory?

本文关键字:共享 内存 何使用      更新时间:2023-10-16

今天我正在尝试在进程(2 个 DLL)之间共享内存。现在我只想共享文本以进行一些调试。我似乎已经设法创建了命名的共享内存并读取了它,但是在读取时内存似乎是空的。我可能做错了什么?

VOID sharedMemory() {
    if (CreateSharedMemory(TEXT("GlobaltestMem"), TEXT("hello shared memory"))) {
        out = out + " | created shared memory";
    } else {
        out = out + " | failed to create shared memory";
    }

    wchar_t data[100];
    if (ReadSharedMemory(TEXT("GlobaltestMem"), data)) {
        std::wstring ws(data);
        out = out + " | shared memory: " + std::string(ws.begin(), ws.end());
    } else {
        out = out + " | no shared memory";
    }
}
BOOL ReadSharedMemory(TCHAR* memName, TCHAR* dat) {
    HANDLE hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, memName);
    if (hMapFile == NULL) {
        return FALSE;
    }
    dat = (LPTSTR)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 1024);
    if (dat == NULL) {
        CloseHandle(hMapFile);
        return FALSE;
    }
    UnmapViewOfFile(dat);
    CloseHandle(hMapFile);
    return TRUE;
}
BOOL CreateSharedMemory(TCHAR* memName, TCHAR* data) {
    HANDLE hMapFile = hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 1024, memName);
    if (hMapFile == NULL) {
        return FALSE;
    }
    LPCTSTR pBuf = (LPTSTR)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 1024);
    if (pBuf == NULL) {
        CloseHandle(hMapFile);
        return FALSE;
    }
    CopyMemory((PVOID)pBuf, data, (_tcslen(data) * sizeof(const wchar_t)));
    UnmapViewOfFile(pBuf);
    return TRUE;
}

输出为:

创建的共享内存 | 共享内存:

而不是BOOL ReadSharedMemory(TCHAR* memName, TCHAR* dat)
使用 BOOL ReadSharedMemory(TCHAR* memName, std::wstring *szData) 并将指针传递给 std::wstring 的实例而不是 TCHAR*

此外,在调用UnmapViewOfFile(dat);之前,请按如下方式更新ReadSharedMemory内部szData szData->append(dat);

原因是,"取消映射文件的映射视图会使该视图在进程的地址空间中占用的范围无效。

参考:UnmapViewOfFile 函数