ERROR_IO_INCOMPLETE
- код ошибки, который означает, что операция перекрытия все еще выполняется;GetOverlappedResult
возвращает значение false, поскольку операция еще не завершилась.
У вас есть две опции - блокирующая и неблокирующая:
Блокировать до завершения операции: изменитьВаш GetOverlappedResult
вызов:
BOOL fSuccess = GetOverlappedResult(data->hPipe, &data->oOverlap, &cbRet, TRUE);
Это гарантирует, что операция перекрытия завершена (то есть успешно или неудачно) до возврата результата.
Опрос для завершения: если операция все еще выполняется, вы можете вернуться из функции и выполнить другую работу, ожидая результата:
BOOL fSuccess = GetOverlappedResult(data->hPipe, &data->oOverlap, &cbRet, FALSE);
if (!fSuccess) {
if (GetLastError() == ERROR_IO_INCOMPLETE) return; // operation still in progress
/* handle error */
} else {
/* handle success */
}
Как правило, второй вариант предпочтительнее первого, поскольку он незаставить ваше приложение остановиться и дождаться результата.(Однако, если код выполняется в отдельном потоке, первый вариант может быть предпочтительнее.)