IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   C++ Builder: Как при старте проги определить наличие COM портов... (http://www.imho.ws/showthread.php?t=82431)

dennt 24.03.2005 21:50

C++ Builder: Как при старте проги определить наличие COM портов...
 
...в системе, и заполнить существующими ComboBox?

ЕЖ 24.03.2005 23:56

Либо проштудировать раздел реестра
Код:

HKEY_LOCAL_MACHINE\Hardware\DeviceMap\SerialComm
либо
перебором попыток открыть соответствующий порт напямую и анализом результата
Код:

CreateFile(AnsiString("\\\\.\\COM"+IntToStr(i)).c_str(),
  GENERIC_READ|GENERIC_WRITE,
  0,
  NULL,
  OPEN_EXISTING,           
  FILE_ATTRIBUTE_NORMAL,     
  NULL);

Первый вариант быстр, а второй позволяет определить свободени ли в данный момент порт.

dennt 26.03.2005 03:27

Спасибо. Первый вариант вполне устраивает :)

oneatone 30.03.2005 15:51

Посмотри в реестре

spike 31.03.2005 10:26

я делаю таким методом
Код:

#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;
  }
//------------------------------------------------------------------------------


iam_xor 27.04.2005 06:19

registry


Часовой пояс GMT +4, время: 15:08.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.