题
如何使用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调用只返回<!> quot; <!> lt;输出1 <!> gt; <!> quot;而不是文件的内容。
编辑: 发现了问题。当我调用sprintf时,我正在写入输入文件。但我还是不知道为什么......
解决方案
这是整个代码示例吗?它在我看来就像调用sprintf
在lpMapAddress
处放置一个以空字符结尾的字符串,它有效地覆盖了你从文件中读取的任何内容 - 至少是为了你的printf
语句。
如果您想用字符串"<output 1>"
替换您阅读的内容的第一部分,您可以在阅读文件后执行此操作:
char *tmp = "<output 1>";
strncpy((char*)lpMapAddress, tmp, strlen(tmp));
复制字符串的文本但不复制其空终止符。
其他提示
sprintf
在<output 1>
之后存储NUL,printf
在第一个NUL停止。
(另外,将一些随机文件作为格式传递给%
是个坏主意。如果它包含MapViewOfFile
字符怎么办?但这是另一个问题。)
我正在写输入文件 打电话给sprintf。但我还是不知道 为什么...
因为这就是<=> 所做的。它将文件的内容与一块内存相关联。该文件的当前内容显示在内存块中,您对该内存所做的任何更改都将写入该文件。
我认为你不需要在映射后调用ReadFile。只需访问lpMapAddress中的内容。
但是,使用MapViewOfFile的常量对使用内存文件映射没有任何好处。
我真的不明白你在这里得到了什么。你之前输入的代码无关紧要;最后一行是总是将返回你在前一个<!>“sprintf <!>中放入缓冲区的字符串;线。因为那是<!>“; <output 1>
<!>”;是的,那就是要返回的内容。
不隶属于 StackOverflow