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 syscalls. На данный момент я мог бы просто остаться с GetQueuedCompletionStatus() и вызывать только N системных вызовов (для N ПЕРЕКРЫТЫХ) вместо 1 + N.

Кто-нибудь знает больше об этом?

3

Решение

Статус завершения сохраняется в OVERLAPPED.Internal поле. Но, как вы заметили, это собственный код состояния API, а не код ошибки WinAPI. Простой способ перевести это позвонить GetOverlappedResult (). Неважно, что вы принимаете за bWait аргумент, он всегда вернется немедленно. Используйте WSAGetOverlappedResult () для сокетов.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]