0

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

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

4

4 回答 4

2

这是整个代码示例吗?在我看来,调用将sprintf一个以空结尾的字符串放置在 处lpMapAddress,它有效地覆盖了您从文件中读取的任何内容——至少对于您的printf声明而言。

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

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

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

于 2009-09-14T19:17:02.713 回答
2

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

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

当我调用 sprintf 时,我正在写入输入文件。但是我还是不知道为什么...

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

于 2009-09-14T19:17:04.630 回答
1

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

但是,对 MapViewOfFile 使用常量并不能从使用内存文件映射中获益。

于 2009-09-14T19:26:12.133 回答
0

我真的不明白你在这里得到什么。你之前放什么代码都没有关系;最后一行总是会返回您在前一个“sprintf”行中放入缓冲区的字符串。由于那是“ <output 1>”,是的,这就是将返回的内容。

于 2009-09-14T19:20:32.190 回答