Структура OVERLAPPED
октября 12 2009 by admin in Обязательный материалПри выполнении асинхронного ввода-вывода параметр pOverlapped должен содержать адрес проинициализированной структуры OVERLAPPED. Такое на звание («overlapped» — перекрывающийся, накладывающийся) она получила поскольку выполнение запроса ввода-вывода совпадает по времени с выпол нением других задач потоком вашего приложения. Эта структура выглядит так
typedef struct .OVERLAPPED <
DWORD Internal; // [выходной] Код ошибки
DWORD InternalHigh; // [выходной] Число переданных байт
DWORD Offset; // [входной] Младшие 32 разряда начальной позиции файла
DWORD OffsetHigh; // [входной] Старшие 32 разряда начальной позиции файла
HANDLE hEvent; // [входной] Описатель события или данные
} OVERLAPPED, *LPOVERLAPPED;
Эта структура содержит пять элементов. Три из них (Offset, OffsetHigh и hEvent, должны быть проинициализированы до вызова ReadFile или WriteFile. Два ос тавшихся (Internal и InternalHigh) устанавливаются драйвером устройства ъ могут быть проанализированы по завершении ввода-вывода. Рассмотрим эт» элементы подробнее.
И Offset и OffsetHigh Формируют 64-разрядное значение начальной пози ции, с которой вы хотите начать выполнение ввода-вывода. Напомню: каж дый объект управления файлом имеет связанный с ним указатель файла При обработке запросов синхронного ввода-вывода система знает, чтс начинать доступ к файлу надо с позиции, определяемой указателем файла По завершении такой операции система автоматически обновляет указатель файла, и следующая операция может отследить, где завершилась предыдущая.
При асинхронном вводе-выводе система не использует указатель файла. Представьте, что произойдет, если дважды обратиться к ReadFile для одного и того же объекта управления файлом: система не будет знать, откуда начинать чтение при втором обращении к ReadFile. Вероятно, вам не нужно начинать чтение с той же позиции, что и при первом обращении к ReadFile, а требуется начинать чтение с байта, идущего за последним прочитанным при первом обращении. Чтобы избежать путаницы в случае нескольких обращений к одному объекту, все запросы асинхронного ввода-вывода должны указывать в структуре OVERLAPPED начальную позицию для доступа к файлу.
Элементы Offset и OffsetHigh не игнорируются нефайловыми устройствами — установите их равными 0, иначе запрос ввода-вывода не выполнится, и при обращении к функции GetLastError вы получите ERROR_INVALID_ PARAMETER.