GetOverlappedResult, когда ReadFile возвращает true - PullRequest
0 голосов
/ 04 июля 2018

Могу ли я использовать GetOverlappedResult для возврата количества прочитанных байтов, если ReadFile с OVERLAPPED IO вернул true (что означает, что результат никогда не ожидался?)

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Если операция завершается синхронно, вы не можете использовать GetOverlappedResult для запроса результата или чтения байтов.

Если, с другой стороны, операция завершается немедленно, то &NumberOfBytesRead, переданное в ReadFile, действительно для количества прочитанных байтов. В этом случае игнорируйте структуру OVERLAPPED, переданную в ReadFile; не используйте его с GetOverlappedResult или WaitForSingleObject.

Подробнее см. https://support.microsoft.com/en-gb/help/156932/asynchronous-disk-i-o-appears-as-synchronous-on-windows.

0 голосов
/ 04 июля 2018

да. в этом случае вы можете позвонить GetOverlappedResult.

в вашем конкретном случае, если ReadFile возвращает true, означает, что операция io уже завершена. GetOverlappedResult со своей стороны прежде всего проверьте IO_STATUS_BLOCK в начале OVERLAPPED. проверено больше бетона Internal (NTSTATUS Status) для STATUS_PENDING

Код состояния для запроса ввода-вывода. Когда запрос выдан, система устанавливает этот элемент на STATUS_PENDING, чтобы указать, что операция еще не началась. Когда запрос завершен, система устанавливает для этого участника код состояния для выполненного запроса.

если здесь не STATUS_PENDING (Status != STATUS_PENDING) GetOverlappedResult понять, что io уже завершено. если это состояние ошибки (Status < 0), преобразуйте его в ошибку win32 и установите последнюю ошибку, в противном случае прочитайте InternalHigh ( Количество байтов, переданных для запроса ввода-вывода. Система устанавливает этот элемент, если запрос завершен без ошибок. ) и скопируйте его в *lpNumberOfBytesTransferred.

так в вашем случае - Status != STATUS_PENDING и Status >= 0 (потому что ReadFile возвращает true) - и GetOverlappedResult просто вернет вам true и установите *lpNumberOfBytesTransferred = (DWORD)lpOverlapped->InternalHigh

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...