如果allow origin
的{{1}} IO返回了GetOverlappedResult
(意味着结果永远不会挂起),我可以使用ReadFile
返回读取的字节数吗?
答案 0 :(得分:1)
是的。您可以在这种情况下致电GetOverlappedResult
。
在您的具体情况下,如果ReadFile
返回true
,则表示io操作已完成。 GetOverlappedResult
从IO_STATUS_BLOCK
的开头首先检查自己的OVERLAPPED
。为Internal
检查了更具体的NTSTATUS Status
(STATUS_PENDING
)
I / O请求的状态代码。发出请求后, 系统将此成员设置为
STATUS_PENDING
,以指示 操作尚未开始。请求完成后, 系统将此成员设置为已完成请求的状态代码。
如果此处不 STATUS_PENDING
(Status != STATUS_PENDING
)GetOverlappedResult
了解io已经完成。如果错误状态(Status < 0
)将其转换为win32错误并设置上一个错误,否则读取InternalHigh
(为I / O请求传输的字节数。该请求已完成且没有错误。),并将其复制到*lpNumberOfBytesTransferred
。
因此,在您的情况下-Status != STATUS_PENDING
和Status >= 0
(因为ReadFile
返回true
)和GetOverlappedResult
只是向您返回true
设置*lpNumberOfBytesTransferred = (DWORD)lpOverlapped->InternalHigh
答案 1 :(得分:-2)
如果操作同步完成,则不能使用GetOverlappedResult
查询结果或读取的字节。
另一方面,如果操作立即完成,则传递到
&NumberOfBytesRead
的{{1}}对于读取的字节数有效。在这种情况下,请忽略传递到ReadFile
的{{1}}结构;请勿将其与OVERLAPPED
或ReadFile
一起使用。