Работа с COM и LPT в Win32. | страница 17
Смещение, в байтах, до устройство-зависимого блока информации от начала структуры.
dwProviderSize
Размер, в байтах, устройство-зависимого блока информации.
wcProviderData
Устройство-зависимый блок информации. Это поле может быть любого размера или вообще отсутствовать. Поскольку структура COMMCONFIG может быть в дальшейшем расширена, для определения положения данного поля следует использовать dwProviderOffset. Если dwProviderSubType PST_RS232 или PST_PARALLELPORT, то данное поле отсутствует. Если dwProviderSubType PST_MODEM, то данное поле содержит структуру MODEMSETTINGS.
Несмотря на то, что нам нужен только DCB, приходится иметь дело со всеми полями. Заполнение данной структуры противоречивыми данными может привести к неправильной настройке порта, поэтому следует пользоваться функцией GetCommConfig:
>BOOL GetCommConfig(HANDLE hCommDev, LPCOMMCONFIG lpCC, LPDWORD lpdwSize);
Параметры функции следующие:
hCommDev
Описатель открытого коммуникационного порта.
lpCC
Адрес выделеного и заполненого нулями, кроме поля dwSize, блока памяти под структуру COMMCONFIG. В поле dwSize нужно занести размер структуры COMMCONFIG. После вызова функции все поля структуры будут содержать информацию о текущих параметрах порта.
lpdwSize
Адрес двойного слова, которое после воврата из функции будет содержать число фактически переданных в структуру байт.
В случае успешного завершения функция возвращает ненулевое значение.
Как всегда не обошлось без тонкостей. Структура COMMPROP имеет перемнную длину, поэтому затруднительно сразу выделить требуемый блок памяти. Как и в случае с функцией GetCommProperties, функцию GetCommConfig придется вызывать дважды:
>. . .
>COMMCONFIG *cf;
>DWORD sz;
>HANDLE port;
>. . .
>cf = (COMMCONFIG*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(COMMCONFIG));
>cf->dwSize = sizeof(COMMCONFIG);
>GetCommConfig(port,cf,&sz);
>if (sz > sizeof(COMMCONFIG)) {
> cf = (COMMCONFIG*)HeapRealloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cf, sz);
> cf->dwSize=sz;
> GetCommConfig(port, cf, &sz);
>}
>. . .
>HeapFree(GetProcessHeap(),0,cf);
>CloseHandle(port);
>. . .
Теперь, имея заполненую корректной информацией структуру COMMCONFIG, можно позволить пользователю выполнить настройку параметров с помощью функции CommConfigDialog:
>BOOL CommConfigDialog(LPTSTR lpszName, HWND hWnd, LPCOMMCONFIG lpCC);
Вызов этой функции приводит к отображению примерно такого диалогового окна:
Вид окна может отличаться от приведенного. Это зависит от операционной системы и динамической библиотеки, предоставленной производителем порта.