c++ - 如何使用命名共享内存?

标签 c++ windows memory shared named

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

VOID sharedMemory() {
    if (CreateSharedMemory(TEXT("Global\testMem"), 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\testMem"), 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;
}

输出是:

created shared memory | shared memory:

最佳答案

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

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

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

引用:UnmapViewOfFile function

关于c++ - 如何使用命名共享内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37590969/

相关文章:

c++ - C++ 中的堆栈、静态和堆

c++ - std::ftsream 的成员函数 bad() 用于检查

c++ - 对此很陌生。质数函数练习建议

c++ - Valgrind 错误读取大小为 4 无效

c++ - 使用带有可变参数模板函数的 decltype 的尾随返回类型

c++ - SetWindowPos中的客户坐标是什么意思

windows - 为什么 Git 命令的长结果会终止我的 PowerShell 提示符?

java - 鼠标显示颜色

无法释放指向先前分配的结构的指针

function - 为什么某些流行语言中的函数只返回一种类型的结果?