2009-04-21 5 views
-1

В моем проекте я реализовал концепцию CreateFileMapping для обмена памятью между двумя процессами. У меня есть серверный процесс, в котором я храню адрес памяти моих данных сеанса, который содержит сведения о конкретном изображении. И у меня есть клиентский процесс, в котором я читал этот адрес из буфера. Теперь проблема заключается в том, что адрес указан в клиентском процессе, но некоторые детали отсутствуют.Ошибка при использовании Windows 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); 

В процессе сервера переменный «тест» содержит все детали, но в клиенте «тест «некоторые данные отсутствуют.

В приведенной ниже тестовой переменной сервера показано прикрепленное изображение, отображающее содержимое переменной.

В тестовой переменной клиента ниже показано прикрепленное изображение, которое показывает содержимое переменной.

Пожалуйста, проверьте разницу мне нужны данные позиции также видны в моем процессе клиента ..

ответ

0

Вы, вероятно, есть указатели/ссылки в LtEntity, которые не сериализации, тоже.

Возможно, вы можете дать более подробную информацию о LtEntity и какие данные отсутствуют.

1

некоторые детали отсутствуют

Вы можете сказать, что снова. Каково определение LtEntity?

Содержит ли отображение файлов какие-либо внедренные указатели? Они не будут работать, потому что общая память не обязательно будет иметь один и тот же виртуальный адрес в каждом процессе. И они не будут работать, если они указывают вне сопоставления файлов, даже если общая память имеет один и тот же виртуальный адрес в каждом процессе. Вместо указателей вы должны хранить смещения с начала сопоставления файлов.

Оба процесса работают в одном сеансе входа в систему? Если нет, вам нужно добавить Global\ prefix в имя сопоставления файлов.

Кроме того, вы должны использовать INVALID_HANDLE_VALUE, а не (HANDLE)0xFFFFFFFFF. Определение INVALID_HANDLE_VALUE изменилось при добавлении 64-битной Windows.

Вы можете использовать LtEntity test(pBuf); вместо LtEntity test = LtEntity(pBuf);.

1

Если у вас есть указатели в LtEntity, это не сработает, поскольку отображаемый блок памяти в каждом процессе обычно начинается с другого адреса. Попробуйте использовать Boost :: interprocess offset pointers, в котором вместо этого хранятся относительные адреса.

+0

+1 для рекомендации Boost :: interprocess. Не играйте с деталями с низким уровнем ошибок, если вы можете использовать красивую (хорошо протестированную) абстракцию. – lothar