【问题标题】:Writing to shared memory写入共享内存
【发布时间】:2010-11-28 05:52:09
【问题描述】:

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

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

【问题讨论】:

    标签: c++ file winapi shared-memory


    【解决方案1】:

    这是整个代码示例吗?在我看来,对 sprintf 的调用会在 lpMapAddress 处放置一个以 null 结尾的字符串,这实际上会覆盖您从文件中读取的任何内容——至少对于您的 printf 语句而言是这样。

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

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

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

    【讨论】:

    • 这有帮助!最后使用了strcat()。
    【解决方案2】:

    sprintf&lt;output 1&gt; 之后存储一个 NUL,printf 在第一个 NUL 处停止。

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-06-22
          • 2015-01-19
          • 2018-08-04
          • 1970-01-01
          • 1970-01-01
          • 2012-09-10
          • 2021-10-03
          相关资源
          最近更新 更多