-1

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

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

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

请检查差异我需要在我的客户端进程中也可见的项目数据..

4

3 回答 3

1

缺少一些细节

你可以再说一遍。的定义是LtEntity什么?

文件映射是否包含任何嵌入式指针?这些都行不通,因为共享内存在每个进程中不一定具有相同的虚拟地址。如果它们指向文件映射之外,它们将无法工作,即使共享内存恰好在每个进程中具有相同的虚拟地址。您应该存储文件映射开头的偏移量,而不是指针。

两个进程是否在同一个登录会话中运行?如果不是,则需要在文件映射的名称中添加Global\前缀。

此外,您应该使用INVALID_HANDLE_VALUE,而不是(HANDLE)0xFFFFFFFFFINVALID_HANDLE_VALUE添加 64 位 Windows 时更改的定义。

您可以使用LtEntity test(pBuf);而不是LtEntity test = LtEntity(pBuf);.

于 2009-04-21T12:48:58.863 回答
1

如果您在 LtEntity 中有指针,它将不起作用,因为每个进程中的映射内存块通常会从不同的地址开始。尝试使用 Boost::interprocess offset pointers,它存储相对地址。

于 2009-04-21T13:35:47.847 回答
0

您可能也LtEntity有未序列化的指针/引用。

也许您可以提供更多关于LtEntity哪些数据丢失的信息。

于 2009-04-21T12:48:05.790 回答