Я учусь кое-чему на программировании win32.
Я прочитал в справочном руководстве (здесь: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365467%28v=vs.85%29.aspx ) тот
Если lpOverlapped не равно NULL, операция чтения начинается со смещения, указанного в структуре OVERLAPPED, и ReadFile не возвращается, пока операция чтения не будет завершена. Система обновляет смещение OVERLAPPED перед возвратом ReadFile.
Однако если я позвоню ReadFile(hmyFile, &myrecord, sizeof(record_t), &n, &ov);
Я вижу что значение ov.offset
остаться без изменений. Как так? Где я неправильно понимаю, что указано в справочном руководстве?
Больше деталей:
Обработчик файла открывается как hmyFile = CreateFile(argv[1], GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
Я не пользуюсь FILE_FLAG_OVERLAPPED
Как показывают комментарии, это ошибка в документации. Фактическое поведение заключается в том, что указатель файла обновляется, так же как когда lpOverlapped имеет значение NULL, а дескриптор является синхронным. Старые версии документации понимают это правильно. Следующая информация взята из июльской версии документации Platform SDK:
ReadFile функция читает данные из файла, начиная с позиции
указывается указателем файла. После того, как операция чтения была завершена,
указатель файла корректируется на количество фактически прочитанных байтов, если только
дескриптор файла создается с перекрывающимся атрибутом. […]Если hFile не открывается с помощью FILE_FLAG_OVERLAPPED и lpOverlapped не NULL,
операция чтения начинается со смещения, указанного в ПЕРЕКРЫВАЕТСЯ состав.
ReadFile не возвращается, пока операция чтения не будет завершена.