如果带有GetOverlappedResult IO的ReadFile返回了true (意味着结果从未挂起),我可以使用OVERLAPPED返回读取的字节数吗?
发布于 2018-07-04 15:12:17
是。在这种情况下,您可以调用GetOverlappedResult。
在具体情况下,如果ReadFile返回true,意味着io操作已经完成。自侧GetOverlappedResult首先检查IO_STATUS_BLOCK在OVERLAPPED的开头。更多具体检查的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_PENDING和Status >= 0 (因为ReadFile返回true) -而GetOverlappedResult只是将true返回给您并设置*lpNumberOfBytesTransferred = (DWORD)lpOverlapped->InternalHigh
发布于 2018-07-04 19:57:48
如果操作同步完成,则不能使用GetOverlappedResult查询结果或读取的字节。
另一方面,如果操作立即完成,则传递给
&NumberOfBytesRead的ReadFile对于读取的字节数是有效的。在这种情况下,忽略传递给ReadFile的ReadFile结构;不要将其与GetOverlappedResult或WaitForSingleObject一起使用。
https://stackoverflow.com/questions/51175732
复制相似问题