imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 24.03.2005, 21:50     # 1
dennt
Junior Member
 
Регистрация: 11.03.2005
Сообщения: 145

dennt Известность не заставит себя ждатьdennt Известность не заставит себя ждать
Question C++ Builder: Как при старте проги определить наличие COM портов...

...в системе, и заполнить существующими ComboBox?
dennt вне форума  
Старый 24.03.2005, 23:56     # 2
ЕЖ
::VIP::
 
Регистрация: 19.03.2004
Сообщения: 1 329

ЕЖ Бог с наворотамиЕЖ Бог с наворотами
ЕЖ Бог с наворотамиЕЖ Бог с наворотами
Либо проштудировать раздел реестра
Код:
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);
Первый вариант быстр, а второй позволяет определить свободени ли в данный момент порт.

Последний раз редактировалось ЕЖ; 25.03.2005 в 00:15.
ЕЖ вне форума  
Старый 26.03.2005, 03:27     # 3
dennt
Junior Member
 
Регистрация: 11.03.2005
Сообщения: 145

dennt Известность не заставит себя ждатьdennt Известность не заставит себя ждать
Спасибо. Первый вариант вполне устраивает
dennt вне форума  
Старый 30.03.2005, 15:51     # 4
oneatone
Guest
 
Сообщения: n/a

Посмотри в реестре
 
Старый 31.03.2005, 10:26     # 5
spike
Member
 
Аватар для spike
 
Регистрация: 02.09.2003
Сообщения: 215

spike Молодецspike Молодецspike Молодец
я делаю таким методом
Код:
#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;
  }
//------------------------------------------------------------------------------
__________________
не могу просто так сидеть, когда другие работают. пойду полежу.
spike вне форума  
Старый 27.04.2005, 06:19     # 6
iam_xor
Junior Member
 
Аватар для iam_xor
 
Регистрация: 08.09.2004
Сообщения: 50

iam_xor Ушлепокiam_xor Ушлепок
registry
iam_xor вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


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




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