【问题标题】:is the overlapped structure updated when using ReadFile?使用 ReadFile 时是否更新了重叠结构?
【发布时间】:2015-07-28 12:31:00
【问题描述】:

我正在学习有关 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

【问题讨论】:

  • 这是一个错字,只有 Internal 成员被更新。
  • 那你是什么意思?
  • 这是文档中的错误。如果你想安全起见,请将偏移量保存在单独的变量中,自行更新,并在每次操作之前将其复制到 OVERLAPPED 结构中。

标签: c++ winapi readfile overlapped-io


【解决方案1】:

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

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

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

【讨论】:

  • 我在那个 MSDN 文档页面上写了一个反馈,希望微软能够阅读它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 2017-11-14
相关资源
最近更新 更多