Запись в общую память - PullRequest
       9

Запись в общую память

0 голосов
/ 14 сентября 2009

Как я могу записать из файла в общую память, используя Win32 API?

У меня есть этот код:

hFile = CreateFile("input.map",
  GENERIC_READ | GENERIC_WRITE,
  FILE_SHARE_READ,
  NULL,
  OPEN_ALWAYS,
  FILE_ATTRIBUTE_NORMAL,
  NULL);

  hMapFile = CreateFileMapping(hFile,
  NULL,
  PAGE_READWRITE,
  0,
  0,
  TEXT("SharedObject"));

  lpMapAddress = (LPTSTR) MapViewOfFile(hMapFile,
  FILE_MAP_ALL_ACCESS,
  0,
  0,
  0);

  ReadFile(
  hFile,
  lpMapAddress,
  75,
  &bytesRead,
  NULL);

  sprintf((char*)lpMapAddress, "<output 1>");

  printf((char*) lpMapAddress);

Однако вызов printf возвращает только «», а не содержимое файла.

EDIT: Нашел проблему. Я пишу во входной файл, когда я вызываю sprintf. Но я до сих пор не знаю, почему ...

Ответы [ 4 ]

2 голосов
/ 14 сентября 2009

sprintf сохраняет NUL после <output 1>, а printf останавливается на первом NUL.

(Кроме того, плохая идея передавать какой-либо случайный файл в формате printf. Что если он содержит % символов? Но это другая проблема.)

Я пишу во входной файл, когда позвоните спринтф. Но я все еще не знаю почему ...

Потому что это то, что MapViewOfFile делает . Он связывает содержимое файла с блоком памяти. Текущее содержимое файла отображается в блоке памяти, и любые изменения, внесенные в эту память, записываются в файл.

2 голосов
/ 14 сентября 2009

Это весь пример кода? Мне кажется, что вызов sprintf помещает строку с нулем в конце в lpMapAddress, которая эффективно перезаписывает все, что вы читаете из файла - по крайней мере, для целей вашего printf оператора.

Если вы хотите заменить первую часть прочитанного на строку "<output 1>", вы можете сделать это после прочтения файла:

char *tmp = "<output 1>";
strncpy((char*)lpMapAddress, tmp, strlen(tmp));

Копирует текст строки, но не ее нулевой терминатор.

1 голос
/ 14 сентября 2009

Я не думаю, что вам нужно вызывать ReadFile после сопоставления. Просто получите доступ к содержимому из lpMapAddress.

Однако использование констант для MapViewOfFile не дает преимуществ от использования отображения файлов памяти.

0 голосов
/ 14 сентября 2009

Я не очень понимаю, что вы получаете здесь. Неважно, какой код вы положили раньше; Последняя строка всегда будет возвращать строку, которую вы поместили в буфер в предыдущей строке "sprintf". Так как это "<output 1>", да, это то, что будет возвращено.

...