Ошибка при использовании Windows CreateFilemapping - PullRequest
0 голосов
/ 21 апреля 2009

В моем проекте я реализовал концепцию 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 ]

1 голос
/ 21 апреля 2009

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

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

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

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

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

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

1 голос
/ 21 апреля 2009

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

0 голосов
/ 21 апреля 2009

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

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

...