window c++ 如何将一个size 大于1000的 string结构数据存入共享内存中,然后在另一个进程中取出数据
时间: 2023-12-14 21:39:47 浏览: 76
Window C++ DXGI视频捕获源码(包含了共享纹理/cpu直接拿RGBA数据)
5星 · 资源好评率100%
可以使用以下步骤将一个size大于1000的string结构数据存入共享内存中,然后在另一个进程中取出数据:
1. 创建共享内存区域
```c++
#include <Windows.h>
HANDLE hMapFile;
LPCTSTR pBuf;
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // 使用系统页面文件作为物理文件
NULL, // 默认安全性
PAGE_READWRITE, // 允许读写访问
0, // 高位文件大小
sizeof(std::string), // 内存映射文件大小,这里设置为std::string的大小
"MySharedMemory"); // 共享内存名称
if (hMapFile == NULL)
{
// 错误处理
}
pBuf = (LPTSTR)MapViewOfFile(
hMapFile, // 创建好的文件映射对象的句柄
FILE_MAP_ALL_ACCESS, // 可读写访问
0,
0,
sizeof(std::string)); // 映射的数据大小
if (pBuf == NULL)
{
// 错误处理
}
```
2. 将数据存入共享内存中
```c++
std::string data = "This is a string with size greater than 1000.";
memcpy(pBuf, data.c_str(), data.length());
```
3. 在另一个进程中打开同名的共享内存区域
```c++
HANDLE hMapFile;
LPCTSTR pBuf;
hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS, // 可读写访问
FALSE, // 不继承句柄
"MySharedMemory"); // 共享内存名称
if (hMapFile == NULL)
{
// 错误处理
}
pBuf = (LPTSTR)MapViewOfFile(
hMapFile, // 打开的文件映射对象的句柄
FILE_MAP_ALL_ACCESS, // 可读写访问
0,
0,
sizeof(std::string)); // 映射的数据大小
if (pBuf == NULL)
{
// 错误处理
}
```
4. 从共享内存中读取数据
```c++
std::string data(pBuf);
```
5. 关闭共享内存并解除映射
```c++
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
```
阅读全文