Зачем GetOverlappedResult нужен дескриптор файла?

Зачем GetOverlappedResult нужен дескриптор файла?

Кажется, что WaitForSingleObject(overlapped->hEvent) должно быть достаточно, чтобы дождаться события, чтобы завершился перекрывающийся ввод-вывод, так для чего же GetOverlappedResult использует дескриптор файла?


person user541686    schedule 24.05.2013    source источник
comment
Ну, кажется, кто-то в комментариях задавался тем же вопросом: Is the first parameter (hFile) required? If you pass in NULL it seems to work correctly, yet it's annotated as an __in parameter, can someone please clarify whether this should in fact be an __optin parameter? kstarsmeare 5/18/2011   -  person chris    schedule 24.05.2013
comment
@chris: О, да, я этого не видел. Я тоже не могу понять, зачем это нужно...   -  person user541686    schedule 24.05.2013
comment
Этот вопрос совершенно прекрасен, и я верю, что на него можно ответить. На самом деле на него можно ответить из документации. Часть, в которой говорится: Если элемент hEvent структуры OVERLAPPED равен NULL, система использует состояние дескриптора hFile, чтобы сигнализировать о завершении операции. Использование файлов, именованных каналов или дескрипторов коммуникационных устройств для этой цели не рекомендуется. Безопаснее использовать объект события из-за путаницы, которая может возникнуть, когда несколько одновременных перекрывающихся операций выполняются с одним и тем же файлом, именованным каналом или коммуникационным устройством.   -  person David Heffernan    schedule 24.05.2013
comment
@DavidHeffernan: Вау, я полностью пропустил это, большое спасибо, что указали на это. Будем надеяться, что вопрос снова открыт, чтобы вы могли опубликовать его как ответ! :)   -  person user541686    schedule 24.05.2013
comment
Ну, я уже проголосовал за повторное открытие   -  person David Heffernan    schedule 24.05.2013
comment
@DavidHeffernan: Да, здесь то же самое. Не знаю, почему люди так счастливы...   -  person user541686    schedule 24.05.2013
comment
@LazyNinja: Ага, спасибо!!   -  person user541686    schedule 24.05.2013


Ответы (1)


Раздел примечаний документации объясняет, когда hFile необходим:

Если элемент hEvent структуры OVERLAPPED равен NULL, система использует состояние дескриптора hFile, чтобы сигнализировать о завершении операции. Использование файлов, именованных каналов или дескрипторов коммуникационных устройств для этой цели не рекомендуется. Безопаснее использовать объект события из-за путаницы, которая может возникнуть, когда несколько одновременных перекрывающихся операций выполняются с одним и тем же файлом, именованным каналом или коммуникационным устройством. В этой ситуации невозможно узнать, какая операция вызвала сигнал о состоянии объекта.

person David Heffernan    schedule 24.05.2013
comment
Вы по-прежнему должны всегда указывать правильный дескриптор файла в соответствии со спецификацией API, даже если hEvent не равен нулю. - person Harry Johnston; 31.03.2015