在我的项目中,我实现了CreateFileMapping
概念,以在两个进程之间共享内存。我有一个服务器进程,我在其中存储会话数据的内存地址,其中包含有关特定图像的详细信息。我有一个客户端进程,我从缓冲区中读取该地址。现在的问题是地址显示在客户端进程中,但缺少一些细节。
这是我的服务器进程代码:
HANDLE hMem;
LPCSTR pBuf;
#define BUF_SIZE 1024
static const char MemoryName[]="Share Memory Name";
hMem=CreateFileMapping(INVALID_HANDLE_VALUE,NULL, PAGE_READWRITE,0, BUF_SIZE, MemoryName);
pBuf = (LPCSTR) MapViewOfFile(hMem, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE);
CopyMemory((PVOID)pBuf, session, BUF_SIZE);
LtEntity test = LtEntity(pBuf);
这是我的客户端流程代码:
HANDLE hMem;
LPCSTR pBuf;
#define BUF_SIZE 1024
static const char MemoryName[]="Share Memory Name";
hMem = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, MemoryName);
pBuf = (LPCSTR) MapViewOfFile(hMem, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE);
LtEntity test = LtEntity(pBuf);
在服务器进程中,变量“test”包含所有细节,但在客户端“test”中缺少一些数据。
下面的服务器测试变量显示附加图像,该图像显示变量的内容。
下面的客户端测试变量显示附加图像,该图像显示变量的内容。
请检查区别我需要在客户端流程中看到的项目数据..
答案 0 :(得分:1)
缺少一些细节
你可以再说一遍。 LtEntity
的定义是什么?
文件映射是否包含任何嵌入指针?这些将无法工作,因为共享内存不一定在每个进程中具有相同的虚拟地址。如果它们指向文件映射之外,它们将无法工作,即使共享内存确实碰巧在每个进程中具有相同的虚拟地址。您应该从文件映射的开头存储偏移量而不是指针。
两个进程是否都在同一个登录会话中运行?如果没有,则需要将Global\
prefix添加到文件映射的名称。
此外,您应该使用INVALID_HANDLE_VALUE
,而不是(HANDLE)0xFFFFFFFFF
。添加64位Windows时,INVALID_HANDLE_VALUE
的定义发生了变化。
您可以使用LtEntity test(pBuf);
代替LtEntity test = LtEntity(pBuf);
。
答案 1 :(得分:1)
如果你在LtEntity中有指针它将无法工作,因为每个进程中的映射内存块通常会从不同的地址开始。尝试使用Boost :: interprocess offset pointers,它存储相对地址。
答案 2 :(得分:0)
你可能在LtEntity
中有指针/引用也没有序列化。
也许您可以提供有关LtEntity
的更多信息以及缺少哪些数据。