CreateFile - функция Win 32 API


Все примеры приведены для среды разработки Embarcadero RAD Studio 11 (C++ Builder)

В ОС Windows работа с последовательными и параллельными портами ввода-вывода производится как с объектами файловой системы. Для этого используются стандартные функции Win32 API:

 -  CreateFile - открывает порт и получает его дескриптор (HANDLE).

 -  CloseHandle - закрывает ранее открытый порт по его дескриптору.

 -  ReadFile - читает данные из порта.

 -  WriteFile - отправляет данные в порт.


Описание функции CreateFile


Открыть порт и получить его дескриптор для дальнейшей работы позволяет функция CreateFile. Прототип функции находится в файле fileapi.h.

WINBASEAPI  HANDLE  WINAPI  CreateFileW(
    _In_     LPCWSTR lpFileName,
    _In_     DWORD dwDesiredAccess,
    _In_     DWORD dwShareMode,
    _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    _In_     DWORD dwCreationDisposition,
    _In_     DWORD dwFlagsAndAttributes,
    _In_opt_ HANDLE hTemplateFile
);

#ifdef UNICODE
#define CreateFile  CreateFileW
#else
#define CreateFile  CreateFileA
#endif // !UNICODE

Если строки кодируются юникодом, вызывается функция CreateFileW, использующая "широкий" тип сторки: wstr - wide string, использующая не менее двух байт на символ. Иначе вызывается функция CreateFileA, использующая обычную однобайтную кодировку ASCII с типом строки; cstr - c string. Для примера используем функцию с "широкой строкой".

Возвращаемое значение:

 -  HANDLE hFile - указатель типа void на дескриптор открываемого порта. При ошибке функция возвращает нулевой указатель (NULL или nullptr).

Параметры функции:

 -  LPCWSTR lpFileName - указатель на "широкую" строку: имя коммуникационного порта. Последовательные порты имеют простые имена "COM1", "COM2", "COM3"...

 -  DWORD dwDesiredAccess - тип доступа к файлу или порту. Для портов с обменом в обе стороны: GENERIC_READ | GENERIC_WRITE

//  These are the generic rights.
                          //- winnt.h
#define GENERIC_READ      (0x80000000L)  //- операции чтения
#define GENERIC_WRITE     (0x40000000L)  //- операции записи
#define GENERIC_EXECUTE   (0x20000000L)  //- операции выполнения (не работает с портами)
#define GENERIC_ALL       (0x10000000L)  //- все операции  (не работает с портами)

 -  DWORD dwShareMode - параметры совместного доступа к файлу. Неприменимо для коммуникационных портов и устанавливается в 0.

 -  LPSECURITY_ATTRIBUTES lpSecurityAttributes - атрибуты защиты файла. Неприменимо для коммуникационных портов и устанавливается в NULL.

 -  DWORD dwCreationDisposition - файловые авторежимы. Для коммуникационных портов всегда OPEN_EXISTING.

//- fileapi.h
#define CREATE_NEW          1
#define CREATE_ALWAYS       2
#define OPEN_EXISTING       3
#define OPEN_ALWAYS         4
#define TRUNCATE_EXISTING   5

 -  DWORD dwFlagsAndAttributes - флаги и атрибуты создаваемого файла. Для коммуникационных портов используются только: 0 - для синхронного режима обмена, FILE_FLAG_OVERLAPPED - для асинхронного режима обмена.

//  These are flags supported through CreateFile (W7) and CreateFile2 (W8 and beyond)
                               //- winbase.h
#define FILE_FLAG_WRITE_THROUGH         0x80000000
#define FILE_FLAG_OVERLAPPED            0x40000000
#define FILE_FLAG_NO_BUFFERING          0x20000000
#define FILE_FLAG_RANDOM_ACCESS         0x10000000
#define FILE_FLAG_SEQUENTIAL_SCAN       0x08000000
#define FILE_FLAG_DELETE_ON_CLOSE       0x04000000
#define FILE_FLAG_BACKUP_SEMANTICS      0x02000000
#define FILE_FLAG_POSIX_SEMANTICS       0x01000000
#define FILE_FLAG_SESSION_AWARE         0x00800000
#define FILE_FLAG_OPEN_REPARSE_POINT    0x00200000
#define FILE_FLAG_OPEN_NO_RECALL        0x00100000
#define FILE_FLAG_FIRST_PIPE_INSTANCE   0x00080000

 -  HANDLE hTemplateFile - дескриптор файла-шаблона. При работе с коммуникационными портами всегда NULL.

Модификаторы вызова функции и аргументов:

-  WINBASEAPI (он же DECLSPEC_IMPORT, или __declspec(dllimport)) - указывает на класс хранилища функции. Позволяет получить доступ к объектам библиотеки DLL.

-  WINAPI (он же __stdcall) - соглашение о вызове функций Win32 API: аргументы передаются справа налево через стек; очистка стека ложится на вызываемую функцию; возвращаемое значение в регистре eax.

-  _In_ и _In_opt_ - макросы, которые вызываются только при использовании SAL2.0 — языка заметок для драйверов Windows (способ описания свойств функций, параметров, возвращаемых значений, структур и полей структуры). В данном случае не используются.


Описание функции CloseHandle

Функция CloseHandle закрывает ранее открытый порт. Прототип функции находится в файле handleapi.h.

WINBASEAPI  BOOL  WINAPI  CloseHandle(
    _In_ _Post_ptr_invalid_ HANDLE hObject
);

При успешном вызове функции возвращаемое значение будет ненулевым (true), при ошибке функция возвращает 0 (false). Информацию о ошибке можно получить, вызвав функцию GetLastError.

Параметр функции:

-  HANDLE hObject - дескриптор закрываемого объекта. В нашем случае дескриптор порта, открытый функцией CreateFile