写入共享内存

时间:2009-09-14 19:10:59

标签: c++ file winapi shared-memory

如何使用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调用只返回“&lt; output 1&gt;”而不是文件的内容。

编辑: 发现了问题。当我调用sprintf时,我正在写入输入文件。但我还是不知道为什么......

4 个答案:

答案 0 :(得分:2)

这是整个代码示例吗?在我看来,调用sprintf会在lpMapAddress放置一个以空字符结尾的字符串,这有效地覆盖了您从文件中读取的任何内容 - 至少是为了printf语句的目的

如果您想用字符串"<output 1>"替换您阅读的内容的第一部分,可以在阅读文件后执行此操作:

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

复制字符串的文本但不复制其空终止符。

答案 1 :(得分:2)

sprintf<output 1>之后存储NUL,printf在第一个NUL停止。

(另外,将一些随机文件作为格式传递给printf是一个坏主意。如果它包含%个字符怎么办?但这是另一个问题。)

  

我正在写输入文件   打电话给sprintf。但我还是不知道   为什么...

因为那是MapViewOfFile 所做的。它将文件的内容与一块内存相关联。该文件的当前内容显示在内存块中,您对该内存所做的任何更改都将写入该文件。

答案 2 :(得分:1)

我认为你不需要在映射后调用ReadFile。只需访问lpMapAddress中的内容。

但是,使用MapViewOfFile的常量对使用内存文件映射没有任何好处。

答案 3 :(得分:0)

我真的不明白你在这里得到了什么。你之前输入的代码无关紧要;最后一行始终将返回您在前一个“sprintf”行中放入缓冲区的字符串。由于那是“<output 1>”,是的,这将是返回的内容。