Главная страница
    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.47 MB
Время: 0.047 c
15-1179823371
vitv
2007-05-22 12:42
2007.06.24
Использование пакетов


2-1180793081
Anna_Roza
2007-06-02 18:04
2007.06.24
TTable путешествия по строкам


15-1180423013
ocean
2007-05-29 11:16
2007.06.24
Есть ли гарантии у антивирусов?


2-1180854110
Kley
2007-06-03 11:01
2007.06.24
Exel из Делфи


15-1180348711
s_t_d
2007-05-28 14:38
2007.06.24
Кириллица в TURBO PASCAL 7.1





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский