ReadFile返回true时的GetOverlappedResult

时间:2018-07-04 14:12:52

标签: winapi

如果allow origin的{​​{1}} IO返回了GetOverlappedResult(意味着结果永远不会挂起),我可以使用ReadFile返回读取的字节数吗?

2 个答案:

答案 0 :(得分:1)

是的。您可以在这种情况下致电GetOverlappedResult

在您的具体情况下,如果ReadFile返回true,则表示io操作已完成。 GetOverlappedResultIO_STATUS_BLOCK的开头首先检查自己的OVERLAPPED。为Internal检查了更具体的NTSTATUS StatusSTATUS_PENDING

  

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

如果此处 STATUS_PENDINGStatus != STATUS_PENDINGGetOverlappedResult了解io已经完成。如果错误状态(Status < 0)将其转换为win32错误并设置上一个错误,否则读取InternalHigh为I / O请求传输的字节数。该请求已完成且没有错误。),并将其复制到*lpNumberOfBytesTransferred

因此,在您的情况下-Status != STATUS_PENDINGStatus >= 0(因为ReadFile返回true)和GetOverlappedResult只是向您返回true设置*lpNumberOfBytesTransferred = (DWORD)lpOverlapped->InternalHigh

答案 1 :(得分:-2)

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

  

另一方面,如果操作立即完成,则传递到&NumberOfBytesRead的{​​{1}}对于读取的字节数有效。在这种情况下,请忽略传递到ReadFile的{​​{1}}结构;请勿将其与OVERLAPPEDReadFile一起使用。

有关详细信息,请参见https://support.microsoft.com/en-gb/help/156932/asynchronous-disk-i-o-appears-as-synchronous-on-windows