如何使用命名共享内存
How to use named shared memory?
今天我正在尝试在进程(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 函数
相关文章:
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 字符串共享内存映射的向量
- CUDA 使用共享内存平铺 3D 卷积实现
- 共享内存:MapViewOfFile 返回错误 5
- 如何在多写入器情况下对文件支持的共享内存中的大页面出错
- 有没有办法列出所有共享内存对象的名称?
- 共享内存的升压容器是否实现锁定?
- 共享内存中的健壮互斥锁不是那么健壮
- 使用IPC/共享内存将Integer数组从C++传递到Python
- 共享内存和性能
- 在这种特殊情况下,我是否需要在共享内存中使用原子类型
- 是否可以在专用内存空间中分配一个为提升管理共享内存而创建的对象
- fork(),在C中共享内存和指针
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- 提升进程间共享内存open_or_create每次都会引发异常
- 通过 mmap-ed 共享内存传递可变长度 C 字符串
- 越界访问 CUDA 共享内存
- 在共享内存中插入映射映射时出现编译器错误
- 矩阵矢量产品 CUDA 通过平铺和共享内存提高性能
- 如何更改在 c++ 中使用提升库创建的共享内存的路径