Как говорит Мартин, сначала исправьте свою обработку ошибок
const BOOL result = ReadFileEx(...);
const DWORD lastError = GetLastError();
if (lastError != ERROR_SUCCESS)
{
fprintf(stderr, "err %d\n", lastError);
}
Обратите внимание, что Мартин ошибочно полагает, что вы не должны вызывать GetLastError()
для успешного возврата из ReadFileEx()
, хотя этонемного особого случая ... Из документов MSDN :
При использовании ReadFileEx вы должны проверять GetLastError, даже когда функция возвращает "success", чтобы проверить наличие условий, которые "успехи ", но есть какой-то результат, о котором вы могли бы знать.Например, переполнение буфера при вызове ReadFileEx вернет TRUE, но GetLastError сообщит о переполнении с помощью ERROR_MORE_DATA.Если вызов функции успешен и нет условий предупреждения, GetLastError вернет ERROR_SUCCESS.
Но это не решает вашу проблему, это только делает ваш пример кода более корректным ...
Проблема заключается в том, что ReadFileEx()
выполняет асинхронное чтение файлов с использованием процедуры завершения, а вы пытаетесь выполнить асинхронное чтение файлов с помощью порта завершения ввода / вывода.Для этого вы должны использовать ReadFile()
.См. этот ответ , почему я чувствую, что IOCP - лучший путь, и почему процедуры завершения немного неприятны ...
Итак, просто измените свой ReadFileEx()
вызов на ReadFile()
позвоните, и ваша проблема исчезнет, и код опубликует завершение в IOCP, когда чтение завершится ...
ReadFile(file_handle,(LPVOID)read_data,1024,&overlapped);
, и вы закончите.