Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.06.24;
Скачать: [xml.tar.bz2];

Вниз

Нахождение имен всех 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.06.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.042 c
6-1164959474
Olban
2006-12-01 10:51
2007.06.24
Indy 10 и TidTCPClient


1-1177337407
IMHO
2007-04-23 18:10
2007.06.24
Быстрое нахождение кол-ва подстрок в строке


11-1162999391
TAHKEP
2006-11-08 18:23
2007.06.24
SelStart всегда равен 0 в KOLListBox


2-1180736356
Ламер 2.ХХ
2007-06-02 02:19
2007.06.24
ПК в сети


2-1180954130
nali
2007-06-04 14:48
2007.06.24
Не рисуется иконка на кнопке в таскбаре





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский