如何使用命名共享内存?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用命名共享内存?相关的知识,希望对你有一定的参考价值。

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

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


    wchar_t data[100];
    if (ReadSharedMemory(TEXT("Global	estMem"), 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*

另外,在调用szData之前,在ReadSharedMemory内更新szData->append(dat);,如下UnmapViewOfFile(dat);

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

参考:UnmapViewOfFile function

以上是关于如何使用命名共享内存?的主要内容,如果未能解决你的问题,请参考以下文章

使用命名共享内存的 C++ 问题

如何在 c 中使用 posix 命名信号量和 Linux 上两个进程之间的共享内存?

共享命名内存 (Windows)

如何使用模块化代码片段中的LeakCanary检测内存泄漏?

df 报告磁盘使用情况,但在共享内存 /dev/shm 中没有文件

如何正确销毁 C 中多个进程使用的共享未命名信号量?