Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.06.24;
Скачать: CL | DM;

Вниз

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

 
vertal ©   (2006-12-24 16:58) [0]

Есть ли какой-нибудь красивый способ получить список имен (чтобы их можно было передавать в 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", что это такое- не знаю. Есть какие-нибудь соображения?


 
MBo ©   (2006-12-25 07:07) [1]

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


 
vertal ©   (2006-12-25 12:40) [2]


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

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


 
vertal ©   (2006-12-25 12:44) [3]

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


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


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


 
Darvin ©   (2006-12-26 15:36) [5]

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


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

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


 
tesseract ©   (2007-01-10 15:17) [7]


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


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



Страницы: 1 вся ветка

Текущий архив: 2007.06.24;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.02 c
15-1179892927
Pazitron_Brain
2007-05-23 08:02
2007.06.24
Про ЖК


1-1176996410
sia
2007-04-19 19:26
2007.06.24
как встроить word в свою программу?


3-1175089999
Oleg_teacher
2007-03-28 17:53
2007.06.24
Копирование базы на парадоксе


3-1174905776
OldProger
2007-03-26 14:42
2007.06.24
Таблицы Paradox в сети


10-1134298458
GanibalLector
2005-12-11 13:54
2007.06.24
COM-сервер