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() для сокетов.

Другие вопросы по тегам