Получение списка COM-портов в системе

Следующий код позволит вам получить список COM-портов в системе (программа консольная):

#include <windows.h>

#include <TCHAR.H >

#include <conio.h>

#include <stdio.h>

//------------------------------------------------------------------------------

void EnumerateSerialPorts()

  {

    // В какой системе работаем?

    OSVERSIONINFO osvi;

    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

    BOOL bGetVer = GetVersionEx(&osvi);

    // В NT используем API QueryDosDevice

    if(bGetVer && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT))

      {

        // Используем QueryDosDevice для просмотра всех устройств похожих на COMx.

       // Это наилучшее решение, так как порты не требуется открывать

        TCHAR szDevices[65535];

        DWORD dwChars = QueryDosDevice(NULL, szDevices, 65535);

        if(dwChars)

          {

            int i=0;

              for (;;)

                {

                  // Получаем текущее имя устройства

                  TCHAR* pszCurrentDevice = &szDevices[i];

                  // Если похоже на "COMX" выводим на экран

                  int nLen = _tcslen(pszCurrentDevice);

                    if(nLen > 3 && _tcsnicmp(pszCurrentDevice, _T("COM"), 3) == 0)

                      {

                        printf(pszCurrentDevice);

                        printf("\n");

                     }

                  // Переходим к следующему символу терминатору

                  while(szDevices[i] != _T('\0'))

                    i++;

                  // Перескакиваем на следующую строку

                    i++;

                  // Список завершается двойным симмволом терминатором, так что если символ

                  // NULL, мы дошли до конца

                  if(szDevices[i] == _T('\0'))

                    break;

                } // for (;;)

            } // if(dwChars)

      } // if(bGetVer && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT))

    else

      {

        // В 95/98 открываем каждый порт для определения его существования

 

        // Поддерживается до 255 COM портов, так что мы проходим пл всему списку

        // Если мы не можем открыть порт, или происходит ошибка при открытии,

        // получаем access denied или общую ошибку все эти случаи указывают на

        // то, что под таким номером есть порт.

        for (UINT i=1; i<256; i++)

          {

            // Формируем сырое имя устройства

            char sPort[10];

            sprintf(sPort,"\\\\.\\COM%d", i);

            // Пытаемся открыть каждый порт

            BOOL bSuccess = FALSE;

            HANDLE hPort = ::CreateFile(sPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

            if(hPort == INVALID_HANDLE_VALUE)

              {

                DWORD dwError = GetLastError();

                // Смотрим что получилось при открытии

                if(dwError == ERROR_ACCESS_DENIED || dwError == ERROR_GEN_FAILURE)

bSuccess = TRUE;

              }

            else

              {

                // Порт открыт успешно

                bSuccess = TRUE;

                // Не забываем закрывать каждый открытый порт,

                // так как мы не собираемся с ним работать...

                CloseHandle(hPort);

              } // if(hPort == INVALID_HANDLE_VALUE)

 

            // Выводим на экран название порта

            if(bSuccess)

              {

                printf(sPort);

                printf("\n");

              }

          } // for (UINT i=1; i<256; i++)

      } // if(bGetVer && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT))

  }

//------------------------------------------------------------------------------

int main()

  {

    EnumerateSerialPorts();

    getch();

    return 0;

  }