首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >写入共享内存

写入共享内存
EN

Stack Overflow用户
提问于 2009-09-14 19:10:59
回答 4查看 1.1K关注 0票数 0

如何使用Win32应用编程接口将文件写入共享内存?

我有这样的代码:

代码语言:javascript
运行
复制
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时,我正在写入输入文件。但我还是不知道为什么..。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-09-14 19:17:03

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

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

代码语言:javascript
运行
复制
char *tmp = "<output 1>";
strncpy((char*)lpMapAddress, tmp, strlen(tmp));

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

票数 2
EN

Stack Overflow用户

发布于 2009-09-14 19:17:05

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

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

当我调用

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

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

票数 2
EN

Stack Overflow用户

发布于 2009-09-14 19:26:12

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1423357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档