Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Нахождение имен всех com-портов в системе


vertal ©   (2006-12-24 16:58:00) 

Есть ли какой-нибудь красивый способ получить список имен (чтобы их можно было передавать в CreateFile) всех com-портов в системе? Порты могут быть виртуальными и не обязательно их имя начинается с "COM". Текущий вариант у меня такой (работает в 2000 и XP) (извиняюсь за форматирование и язык):

        TCHAR szDevices[65535];
         DWORD dwChars = QueryDosDevice(NULL, szDevices, 65535);
        if(dwChars)
          {
            int i=0;
              for (;;)
                {
                  // Получаем текущее имя устройства
                  TCHAR* pszCurrentDevice = &szDevices[i];
                  // Если похоже на "COMX" выводим на экран
                  int nLen = strlen(pszCurrentDevice);
                  //DWORD Garbage;
                 //HANDLE hPort = CreateFile(pszCurrentDevice, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
                  //DEBUG_WRITE_LOG(pszCurrentDevice, GetFileType(hPort));
                    if((nLen > 3) && (strncmp(pszCurrentDevice, "COM", 3) == 0))
                    //if (hPort != INVALID_HANDLE_VALUE
                    //  && GetFileType(hPort) == FILE_TYPE_CHAR
                    //  && GetCommMask(hPort, &Garbage))
                      {
                        CallbackProc(pszCurrentDevice);
                      }
                 //CloseHandle(hPort);
                  // Переходим к следующему символу терминатору
                  while(szDevices[i] != 0x00)
                    i++;
                  // Перескакиваем на следующую строку
                    i++;
                 // Список завершается двойным симмволом терминатором, так что если символ
                  // NULL, мы дошли до конца
                  if(szDevices[i] == 0x00)
                    break;
               } // for (;;)
            } // if(dwChars)
      } // if(bGetVer && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT))

Проблема в том, что таким образом (при сравнении первых букв с COM) не обнаружить послед. порты с нестандартными именами. Пробовал открывать каждое устройство и затем вызывать функции и проверять их результат(то, что закомментировано):
GetFileType(hPort) == FILE_TYPE_CHAR
&& GetCommMask(hPort, &Garbage)
Это работает, НО при этом нужно открывать все устройства, при открытии например дисковода для дискет его привод дергается, что нежелательно, и плюс таким способом обнаружилось устройство (comm port) "AUX", что это такое- не знаю. Есть какие-нибудь соображения?


tesseract   (2007-01-10 15:17:00) [1]


> Darvin ©   (26.12.06 15:36) [5]
> А как узнать все занятые порты? У меня в системе установлено
> два порта Com1 и Com2, а при выборе порта пишет, что заняты
> еще с Com3 по Com7.


Прочитать из реестра все имеющиеся
CreateFile вернёт INVALID_HANDLE_VALUE а GetLastError   ERROR_ACCESS_DENIED.


DC-AC   (2007-01-10 07:38:00) [2]

Попробовать открыть порт и прочитать Handle ?


Darvin   (2006-12-26 15:36:00) [3]

А как узнать все занятые порты? У меня в системе установлено два порта Com1 и Com2, а при выборе порта пишет, что заняты еще с Com3 по Com7.


wal   (2006-12-25 15:45:00) [4]


> [3] vertal ©   (25.12.06 12:44)
Если COM1..COM9, то '\\.\' тоже мешать не будет.


vertal   (2006-12-25 12:44:00) [5]

Тем, кто сталкивался с похожими проблемами - хочу еще добавить, что имя порта, если это не COM1..COM9, должно передаваться в CreateFile c префиксом '\\.\':
http://forum.adastra.ru/cgi-bin/ultimatebb.cgi?ubb=print_topic;f=14;t=000050


vertal   (2006-12-25 12:40:00) [6]


> MBo ©   (25.12.06 07:07) [1]
> RegOpenKeyEx(HKEY_LOCAL_MACHINE, 'HARDWARE\DEVICEMAP\SERIALCOMM',
> ..

Как все просто оказывается...


MBo   (2006-12-25 07:07:00) [7]

RegOpenKeyEx(HKEY_LOCAL_MACHINE, 'HARDWARE\DEVICEMAP\SERIALCOMM',..


Наверх

Титульная страница Поиск, карта сайта Написать письмо