Работа с коммуникационными портами (COM и LPT) в программах для Win32

Функция GetCommConfig


Несмотря на то, что нам нужен только 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);

   . . .



Содержание раздела