4

我正在学习有关 win32 编程的知识。我阅读了参考手册(此处:https ://msdn.microsoft.com/en-us/library/windows/desktop/aa365467%28v=vs.85%29.aspx )

如果 lpOverlapped 不为 NULL,则读取操作从 OVERLAPPED 结构中指定的偏移量开始,并且 ReadFile 在读取操作完成之前不会返回。系统会在 ReadFile 返回之前更新 OVERLAPPED 偏移量。

但是,如果我打电话ReadFile(hmyFile, &myrecord, sizeof(record_t), &n, &ov);,我会看到该值ov.offset保持不变。怎么会这样?我在哪里误解了参考手册中的内容?

更多详细信息:
文件处理程序在hmyFile = CreateFile(argv[1], GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
我不使用时打开FILE_FLAG_OVERLAPPED

4

1 回答 1

2

正如评论所示,这是文档中的错误。实际行为是文件指针被更新,就像 lpOverlapped 为 NULL 并且句柄是同步的一样。旧版本的文档可以做到这一点。以下内容摘自 2000 年 7 月版的 Platform SDK 文档:

ReadFile函数从文件中读取数据,从文件指针指示的位置开始。读取操作完成后,文件指针会根据实际读取的字节数进行调整,除非文件句柄是使用重叠属性创建的。[...]

如果hFile未使用 FILE_FLAG_OVERLAPPED 打开且lpOverlapped不为 NULL,则读取操作从OVERLAPPED结构中指定的偏移量开始。 在读取操作完成之前, ReadFile不会返回。

于 2015-05-17T17:39:17.243 回答