Интернет-журнал "Домашняя лаборатория", 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: