首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetOverlappedResult当ReadFile返回true时

GetOverlappedResult当ReadFile返回true时
EN

Stack Overflow用户
提问于 2018-07-04 14:12:51
回答 2查看 1.4K关注 0票数 1

如果带有GetOverlappedResult IO的ReadFile返回了true (意味着结果从未挂起),我可以使用OVERLAPPED返回读取的字节数吗?

EN

回答 2

Stack Overflow用户

发布于 2018-07-04 15:12:17

是。在这种情况下,您可以调用GetOverlappedResult

在具体情况下,如果ReadFile返回true,意味着io操作已经完成。自侧GetOverlappedResult首先检查IO_STATUS_BLOCKOVERLAPPED的开头。更多具体检查的Internal (NTSTATUS Status)用于STATUS_PENDING

I/O请求的状态代码。发出请求时,系统将此成员设置为STATUS_PENDING,以指示操作尚未启动。当请求完成后,系统将此成员设置为已完成请求的状态代码。

如果这里不是 STATUS_PENDING (Status != STATUS_PENDING) GetOverlappedResult,那么GetOverlappedResult理解io已经完成了。如果将其错误状态(Status < 0)转换为win32错误并设置最后一个错误,则读取InternalHigh (为I/O请求传输的字节数)。如果没有错误地完成请求,则系统将设置此成员。)并将其复制到*lpNumberOfBytesTransferred

所以在您的例子中- Status != STATUS_PENDINGStatus >= 0 (因为ReadFile返回true) -而GetOverlappedResult只是将true返回给您并设置*lpNumberOfBytesTransferred = (DWORD)lpOverlapped->InternalHigh

票数 1
EN

Stack Overflow用户

发布于 2018-07-04 19:57:48

如果操作同步完成,则不能使用GetOverlappedResult查询结果或读取的字节。

另一方面,如果操作立即完成,则传递给&NumberOfBytesReadReadFile对于读取的字节数是有效的。在这种情况下,忽略传递给ReadFileReadFile结构;不要将其与GetOverlappedResultWaitForSingleObject一起使用。

详情请参见https://support.microsoft.com/en-gb/help/156932/asynchronous-disk-i-o-appears-as-synchronous-on-windows

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

https://stackoverflow.com/questions/51175732

复制
相关文章

相似问题

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