是在使用ReadFile时更新的重叠结构

is the overlapped structure updated when using ReadFile?

本文关键字:更新 重叠 结构 ReadFile      更新时间:2023-10-16

我正在学习win32编程。我在参考手册(这里:https://msdn.microsoft.com/en-us/library/windows/desktop/aa365467%28v=vs.85%29.aspx)上读到

如果lpoverlap不为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

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

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

如果hFile没有以FILE_FLAG_OVERLAPPED打开,且 lpoverlap 不是NULL,读取操作从OVERLAPPED结构中指定的偏移量开始。ReadFile直到读操作完成才返回。