使用Windows CreateFilemapping时出错

时间:2009-04-21 12:18:46

标签: c++ winapi memory-mapped-files

在我的项目中,我实现了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”中缺少一些数据。

下面的服务器测试变量显示附加图像,该图像显示变量的内容。

下面的客户端测试变量显示附加图像,该图像显示变量的内容。

请检查区别我需要在客户端流程中看到的项目数据..

3 个答案:

答案 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的更多信息以及缺少哪些数据。