![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нахождение имен всех 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',..