GetOverlappedResult返回true,但没有数据写入

时间:2017-11-03 11:45:59

标签: api winapi

我用以下代码检查异步写入。

BOOL bOk = ::GetOverlappedResult(hFile, pOverlapped, dwBytesTransferred, TRUE);
if ( FALSE == bOk )
{
     TRACE_ERROR_NO_ASSERT(GetOverlappedResult);
}

bOk为TRUE,但dwBytesTransferred为0,pOverlapped-> Internal为258(超时)。

我的问题是:我的异步操作是否超时并将在稍后完成?或者只是失败了?我应该调用CancelIo来取消这样的超时操作吗?

BOOL bOk = ::GetOverlappedResult(hFile, pOverlapped, dwBytesTransferred, TRUE);
if ( FALSE == bOk )
{
     TRACE_ERROR_NO_ASSERT(GetOverlappedResult);
     return FALSE;
}

if ( 0 == dwBytesTransferred )
{
   CancelIoEx(hFile, pOverlapped); //  is this neccessary?
}

我参考MSDN文档,但没有描述这种情况。

提前感谢。

1 个答案:

答案 0 :(得分:1)

您的操作已完成(失败)STATUS_TIMEOUT - 这是最终状态并且操作已完成。你不需要也不能取消它 - 完成GetOverlappedResult返回TRUE并且没有设置错误代码 - 这只是这个win32 api的设计(我说是错误)。它无条件地返回TRUE并且如果(0 <= status)则不设置上一个错误。结果是错误的进程STATUS_TIMEOUT(我认为您使用了串行(com)端口)。

如此正式的答案:

  1. 你的手术完了。
  2. 你不应该叫CancelIo
  3. 但是我认为使用GetOverlappedResult对于异步i / o完全没有意义。需要使用apc或iocp完成。