ЖАНРЫ

Интернет-журнал "Домашняя лаборатория", 2007 №8
Шрифт:

• dwSize

Задает размер структуры COMMCONFIG в байтах

• wVersion

Задает номер версии структуры COMMCONFIG. Должен быть равным 1.

• wReserved

Зарезервировано и не используется

• dcb

Блок управления устройством (DCB) для порта RS-232.

• dwProviderSubType

Задает тип устройства и формат устройство-зависимого блока информации. Фактически это тип порта. Конкретные значения данного поля приведены в описании структуры COMMPROP выше.

• dwProviderOffset

Смещение, в байтах, до устройство-зависимого блока информации от начала структуры.

• dwProviderSize

Размер, в байтах, устройство-зависимого блока информации.

• wcProviderData

Устройство-зависимый блок информации. Это поле может быть любого размера или вообще отсутствовать. Поскольку структура COMMCONFIG может быть в дальнейшем расширена, для определения положения данного поля следует использовать dwProviderOffset. Если dwProviderSubType PST_RS232 или PST_PARALLELPORT, то данное поле отсутствует. Если dwProviderSubType PST_MODEM, то данное поле содержит структуру MODEMSETTINGS.

Функция GetCommConfig

Несмотря на то, что нам нужен только DCB, приходится иметь дело со всеми полями. Заполнение данной структуры противоречивыми данными может привести к неправильной настройке порта, поэтому следует пользоваться функцией GetCommConfig:

BOOL GetCommConfig(

HANDLE hCommDev,

LPCOMMCONFIG lpCC,

LPDWORD lpdwSize

);

Параметры функции следующие:

• hCommDev

Описатель открытого коммуникационного порта.

• IpCC

Адрес выделенного и заполненного нулями, кроме поля dwSize, блока памяти под структуру COMMCONFIG. В поле dwSize нужно занести размер структуры COMMCONFIG. После вызова функции все поля структуры будут содержать информацию о текущих параметрах порта.

• IpdwSize

Адрес двойного слова, которое после возврата из функции будет содержать число фактически переданных в структуру байт.

В случае успешного завершения функция возвращает ненулевое значение.

Как всегда не обошлось без тонкостей. Структура COMMPROP имеет переменную длину, поэтому затруднительно сразу выделить требуемый блок памяти. Как и в случае с функцией GetCommProperties, функцию GetCommConfig придется вызывать дважды:

COMMCONFIG *cf;

DWORD sz;

HANDLE port;

сf=(COMMCONFIG*)HeapAlloc(GetProcessHeap,HEAP_ZERO_MEMORY,sizeof(COMMCONFIG));

cf->dwSize=sizeof(COMMCONFIG);

GetCommConfig(port,cf,&sz);

if(sz > sizeof(COMMCONFIG)) {{

сf=(COMMCONFIG*)HeapRealloc(GetProcessHeap,HEAP_ZERO_MEMORY,cf,sz);

cf->dwSize=sz;

GetCommConfig(port,cf,&sz);

};

...

HeapFree(GetProcessHeap,0,cf);

CloseHandle(port);

Функция CommConfiaDialoa

Теперь, имея заполненую корректной информацией структуру COMMCONFIG, можно позволить пользователю выполнить настройку параметров с помощью функции CommConfigDialog:

BOOL CommConfigDialog(

LPTSTR IpszName,

HWND hWnd,

LPCOMMCONFIG IpCC

);

Вызов этой функции приводит к отображению примерно такого диалогового окна:

Вид окна может отличаться от приведенного. Это зависит от операционной системы и динамической библиотеки, предоставленной производителем порта.

Познакомимся с параметрами функции CommConflgDialng:

• IpszName

Указатель на строку с именем порта, для которого отображается диалоговое окно. К реальному имени порта эта строка не имеет никакого отношения, она просто выводится в заголовке окна.

• hWnd

Описатель окна, которое владеет данным диалоговым окном. Должен быть передан корректный описатель окна-владельца или NULL, если у диалогового окна нет владельца.

• IpCC

Указатель на структуру COMMCONFIG. Эта структура содержит начальные установки, используемые для отображения в диалоговом окне, и установленные пользователем изменения, при завершении диалога.

Как и большинство других функций Win32 API, функция CommConfigDialog возвращает отличное от нуля значение, в случае успешного завершения, и нуль, если возникла ошибочная ситуация.

Функция CommConfigDialog не выполняет настройки порта. Она все лишь позволяет пользователю изменить некоторые поля в блоке DCB, содержащемся в структуре COMMCONFIG. Разумеется, Вы можете изменить установленные пользователем некорректные значения или выполнить дополнительные настройки после вызова функции GetCommConfig.

Функция SetCommConfig

Фактическая настройка порта выполняется функцией SetCommConfig:

Поделиться с друзьями: