MSDN в своем описании функции ReadFile()
указывает:
Если hFile открывается с помощью FILE_FLAG_OVERLAPPED
, параметр lpOverlapped должен указывать на действительную и уникальную структуру OVERLAPPED
, в противном случае функция может неверно сообщить о завершении операции чтения.
У меня есть несколько приложений, которые нарушают приведенную выше рекомендацию, и я хотел бы знать, насколько серьезна проблема. Я имею в виду, что программа использует именованный канал, созданный с помощью FILE_FLAG_OVERLAPPED
, но читает из него с помощью следующего вызова:
ReadFile(handle, &buf, n, &n_read, NULL);
Это означает, что он передает NULL
в качестве параметра lpOverlapped
. Этот вызов не должен работать правильно в некоторых случаях в соответствии с документацией. Я потратил много времени, пытаясь воспроизвести проблему, но я не смог! Я всегда получал все данные в нужном месте в нужное время. Хотя я тестировал только именованные каналы.
Кто-нибудь знает, когда можно ожидать, что ReadFile () будет некорректно возвращать и сообщать об успешном завершении, даже если данные еще не находятся в буфере? Что должно произойти, чтобы воспроизвести проблему? Это случается с файлами, каналами, сокетами, консолями или другими устройствами? Нужно ли использовать конкретную версию ОС? Или конкретная версия чтения (например, зарегистрировать дескриптор порта завершения ввода / вывода)? Или конкретная синхронизация процессов чтения / записи / потоков?
Или когда это не получится? У меня это работает: /
Пожалуйста, помогите!
С уважением, Мартин