Текущий архив: 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