ReadFile() - функция Win 32 API
Все примеры приведены для среды разработки Embarcadero RAD Studio 11 (C++ Builder)
В ОС Windows работа с последовательными и параллельными портами ввода-вывода производится как с объектами файловой системы. Для этого используются стандартные функции Win32 API:
- CreateFile() - открывает порт и получает его дескриптор (HANDLE).
- CloseHandle() - закрывает ранее открытый порт по его дескриптору.
- ReadFile() - читает данные из порта.
- WriteFile() - отправляет данные в порт.
Описание функции ReadFile()
Считывает данные из указанного файла или устройства ввода-вывода в синхронном или асинхронном режиме. Прототип функции находится в файле fileapi.h.
WINBASEAPI _Must_inspect_result_ BOOL WINAPI ReadFile(
_In_ HANDLE hFile,
_Out_writes_bytes_to_opt_(nNumberOfBytesToRead, *lpNumberOfBytesRead) __out_data_source(FILE) LPVOID lpBuffer,
_In_ DWORD nNumberOfBytesToRead,
_Out_opt_ LPDWORD lpNumberOfBytesRead,
_Inout_opt_ LPOVERLAPPED lpOverlapped
);
Параметры
typedef void *HANDLE;
Этот буфер должен быть доcтупным в течение всей операции чтения. Вызывающий объект не должен использовать этот буфер до завершения операции чтения.
typedef void far *LPVOID;
Функция ReadFile() обнуляет количество принятых байтов перед началом работы и в случае обработки ошибок.
Для асинхронной передачи это значение должно быть NULL и должна использоваться структура OVERLAPPED.
В Windows 7 этот параметр всегда не NULL.
Структура OVERLAPPED содержит сведения для асинхронной передачи. Должна быть уникальна для каждого hFile - дескриптора открытого порта. При этом порт должен быть открыт с параметром FILE_FLAG_OVERLAPPED.
Возвращаемое значение
При работе в асинхронном режиме функция возвращает 0 (false) с кодом GetLastError() равным ERROR_IO_PENDING. Это не является ошибкой а сигнализирует, что операция чтения работает асинхронно и ожидает завершения приёма данных.
Примечание
Доступ к входной буферу во время операции чтения может привести к повреждению данных, считываемых в этот буфер. Приложения не должны считывать, записывать, освобождать входной буфер, который используется операцией чтения, до завершения операции.