GetQueuedCompletionStatusEx() не возвращает per-OVERLAPPED код ошибки
Я использую GetQueuedCompletionStatusEx()
API, и я только что понял, что он действительно может читать N пакетов OVERLAPPED всего за 1 системный вызов, а не только 1 OVERLAPPED, как GetQueuedCompletionStatus()
, но я обеспокоен тем, что я не могу ничего знать о per-OVERLAPPED код ошибки.
В то время как GetQueuedCompletionStatus()
возвращает только 1 OVERLAPPED за вызов, это дает мне возможность проверить, вызов GetLastError()
, последняя ошибка для текущего пакета OVERLAPPED.
Как я мог сделать это с GetQueuedCompletionStatusEx()
который фактически возвращает N пакетов OVERLAPPEDs, но не N кодов ошибок?
Я прочитал об этом по телефону GetOverlappedResult()
Вы можете достичь этого, но моя точка зрения такова: если я позвоню GetQueuedCompletionStatusEx()
чтобы получить N OVERLAPPEDs пакетов, а затем мне нужно вызвать еще один системный вызов для КАЖДОГО из них, преимущество вызова 1 syscall для получения N OVERLAPPEDs не имеет смысла, так как вы будете вызывать 1+N системных вызовов. На данный момент я мог бы просто остаться с GetQueuedCompletionStatus()
и вызывать только N системных вызовов (для N OVERLAPPEDs) вместо 1+N.
Кто-нибудь знает больше об этом?
1 ответ
Статус завершения сохраняется в OVERLAPPED.Internal
поле. Но, как вы заметили, это собственный код состояния API, а не код ошибки WinAPI. Простой способ перевести его - вызвать GetOverlappedResult (). Неважно, что вы передадите аргументу bWait, он всегда вернется немедленно. Используйте WSAGetOverlappedResult() для сокетов.