Получение списка COM-портов в системе
Следующий код позволит вам получить список COM-портов в системе (программа консольная):
// В какой системе работаем?
osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
BOOL bGetVer = GetVersionEx(&osvi);
// В NT используем API QueryDosDevice
if (bGetVer && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT))
// Используем QueryDosDevice для просмотра всех устройств похожих на COMx.
// Это наилучшее решение, так как порты не требуется открывать
DWORD dwChars = QueryDosDevice(NULL, szDevices, 65535);
// Получаем текущее имя устройства
// Если похоже на «COMX» выводим на экран
int nLen = _tcslen(pszCurrentDevice);
if (nLen > 3 && _tcsnicmp(pszCurrentDevice, _T(«COM»), 3) == 0)
// Переходим к следующему символу терминатору
while (szDevices[i] != _T(‘\0’))
// Перескакиваем на следующую строку
// Список завершается двойным симмволом терминатором, так что если символ
// NULL, мы дошли до конца
if (szDevices[i] == _T(‘\0’))
> // if(bGetVer && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT))
// В 95/98 открываем каждый порт для определения его существования
// Поддерживается до 255 COM портов, так что мы проходим пл всему списку
// Если мы не можем открыть порт, или происходит ошибка при открытии,
// получаем access denied или общую ошибку все эти случаи указывают на
// то, что под таким номером есть порт.
// Формируем сырое имя устройства
// Пытаемся открыть каждый порт
BOOL bSuccess = FALSE;
HANDLE hPort = ::CreateFile(sPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
if (hPort == INVALID_HANDLE_VALUE)
DWORD dwError = GetLastError();
// Смотрим что получилось при открытии
if (dwError == ERROR_ACCESS_DENIED || dwError == ERROR_GEN_FAILURE)
// Порт открыт успешно
// Не забываем закрывать каждый открытый порт,
// так как мы не собираемся с ним работать.
Получение списка доступных COM портов
04.01.2018
При программировании COM портов полезно иметь возможность получать список доступных портов на компьютере. Эта задача встречается настолько часто, что я решил затронуть ее в своем блоге.
Существует несколько различных способов решения этой задачи. Их все можно условно разделить на «некрасивые» и «красивые».
Первый вариант заключается в том, чтобы зашить в программу самые распространенные номера портов (обычно COM 1, COM 2, COM 3 и некоторые другие). Недостатком этого подхода является то, что вы не всегда можете охватить все доступные порты. Например, я видел системы, на которых встречается порты COM 22, COM 23, COM 24 (порты были виртуальными, но суть вопроса это не меняет). Не будете же вы зашивать столько номеров. А если завтра встретится COM 100?
Второй вариант заключается в проверке большого количества портов на их доступность. Мы просматриваем порты COM 1, COM 2, …. COM 100 и пытаемся открыть каждый из них. Если это удалось, значит, порт есть. У этого подхода несколько недостатков.
Во-первых, такой перебор занимает время, а регулярные вызовы функции CreateFile напрасно расходуют системные ресурсы.
Во-вторых, у данного метода возможны ложные срабатывания. Предположим, пользователь запустил программу, которая заняла порт COM 3. После этого он запустил вашу программу. Разумеется, при попытке открыть порт COM 3 возникнет ошибка, так как он занят другой программой. В результате чего программа решит, что такого порта нет. А он есть.
В-третьих, он не решает проблему охвата всего многообразия возможных портов.
Красивое решение основывается на том факте, что информация о доступных COM портах (в том числе виртуальных) в системах Windows хранится в реестре. Точнее в ветке HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM\. Там COM порты хранятся в виде строк: « COM 1», « COM 2», « COM 3» и т.д. Отсюда сразу возникает решение – нужно перебрать все строковые параметры в данном разделе реестра.
Ниже приводится полный исходный код примера, демонстрирующего данный метод.
В заключение лишь отмечу, что я использую этот подход во многих своих проектах, и он еще ни разу не подводил меня.
Список COM портов
Список COM портов
Доброго времени суток! Делаю программку по считывают COM портов из реестра. Использую такой код: .
Список портов в/в
Здравтсвуйте До перехода в защищенный режим можно юзать bios-прерывания, однако после перехода.
запретить список портов
Всем привет. Такой вопрос: есть сервер win 2003 он раздает интернет, стоит Traffic Inspector, как.
Получить список TCP портов
Здравствуйте. Как мне получить список ВСЕХ незанятых портов машины. Пытаюсь IPGlobalProperties.
С реестриком надо попробовать =)
Добавлено через 44 минуты
Сделал по примеру с интернета. В буфере на выходе одни нули. Чего не так?
- Simple C++ class interface.
- The code provides methods which support both Windows 9x and the Windows NT kernel versions of Windows.
- The code is fully Unicode compliant and include Unicode built options in the workspace file.
- Internally the code provides 9 different ways (yes you read that right: Nine) of enumerating serial ports: Using CreateFile, QueryDosDevice, GetDefaultCommConfig, two ways using the Setup API, EnumPorts, WMI, Com Database & enumerating the values under the registry key HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM.
- Can be compiled with or without MFC and or ATL support. If you do not want MFC support, then the code falls back to using the ATL CSimpleArray collection classes. The code can also be compiled without MFC and ATL support meaning that it should work on Express SKU’s of Visual Studio. In this case the standard STL collection classes are used.
- All of the configuration of the code is controlled by the following preprocessor values: CENUMERATESERIAL_USE_STL, _AFX, NO_ENUMSERIAL_USING_CREATEFILE, NO_ENUMSERIAL_USING_QUERYDOSDEVICE, NO_ENUMSERIAL_USING_GETDEFAULTCOMMCONFIG, NO_ENUMSERIAL_USING_SETUPAPI1, NO_ENUMSERIAL_USING_SETUPAPI2, NO_ENUMSERIAL_USING_ENUMPORTS, NO_ENUMSERIAL_USING_WMI, NO_ENUMSERIAL_USING_COMDB & NO_ENUMSERIAL_USING_REGISTRY.
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.
Список сом-портов, доступных в системе
Кто-нибудь разбирался как получить Список сом-портов, доступных в системе? Пока единственный.
Как узнать список доступных портов в Qt
Здравствуйте, я хочу создать программу для «общения» с ардуино. Мне нужно узнать доступные порты и.
[Qt] Получить список tcp соединений и прослушиваемых портов
Никак не могу найти, как получить список текущих подключений. Нужна такая же информация, как при.
Вывод информации о COM-порте
Надо написать программу, которая будет выводить в ComboBox список подключенных Com портов. При выборе одного из этих портов в элемент управления TexBox выводятся данные об этом порте. С первой задачей я справился, но вот со второй проблема- не могу получить данные о конкретном порте. Как это можно сделать?
Код программы:
UPDATE: выполнение команды wmic path Win32_PnPEntity where «ClassGuid = ‘<4d36e978-e325-11ce-bfc1-08002be10318>‘» get / value
1 ответ 1
Обычно можно просто сделать выборку из Win32_SerialPort по DeviceID (он содержит имя порта, возвращаемое GetPortNames):
Это сработает для всех физических COM-портов (ну, тех которые система считает физическими — т.е. для которых в диспетчере можно настроить скорость и прочие параметры). Для некоторых виртуальных портов это может не сработать. Это относится главным образом к виртуальным порта USB-устройств, работающих с нестандартным драйвером — DeviceID у таких устройств начинается не с «USB\», а с вендорно-специфичной строки. Тогда, если приведенный запрос не вернул ничего, можно попробовать как-то так (вернет меньше свойств):
«SELECT * FROM Win32_PnPEntity where ClassGuid = ‘<4d36e978-e325-11ce-bfc1-08002be10318>‘ and Service <> ‘Parport’ AND Name like ‘%» + name + «%'»
Однако и такой способ — не лучший вариант, так как он основан на фильтрации по имени устройства, которое может и не содержать внутреннего имени порта. Более правильно связывать Win32_PnpEntity с портом через PnpDeviceID, используя параметр PortName в ветке реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\(PnpDeviceID)\DeviceParameters . Это реализовано в следующем примере, более громоздком, но позволяющим корректно обработать большинство ситуаций и вывести максимальное количество доступных сведений.
Получить список ком портов windows
Это бывает нужно, например, если вы хотите посмотреть, нет ли «левой» активности от непонятных приложений.
Сначала запустите командную строку командой cmd . В не-инновационных версиях Windows просто делаем Пуск, Выполнить, cmd (или уродливый аналог в Windows 8; а лучше запустить из нормального файл-менеджера с командной строкой).
Затем выполнить в командной строке вот это:
Команда сбросит список активных подключений в файл с именем 1.txt , который создастся в текущей папке.
Возможно, это выполнится быстро, а возможно, при большой загруженности компьютера и множестве активных подключений, ждать придётся долго, несколько минут, и винчестер будет активно «шуршать».
Увидеть, что получилось, можно, открыв файл в любом текстовом редакторе. Если в первых строках файла вместо символов кириллицы — «кракозябры», не унывайте, просто ваша консоль создала текстовый файл в кодировке DOS. Попробуйте открыть его, например, с помощью Notepad++, предварительно выбрав в его меню Кодировки — Кириллица — OEM 866.
Потом спокойно анализируем файл, все подключения как на ладони. Увидели, скажем, такое:
— насторожитесь. Может, это просто неподписанное расширение браузера, а может, лезет Ванька Полонский, в любом случае, обратитесь за разъяснениями на толковый форум.
Кстати, прилагаю список некоторых полезных консольных команд Windows, которые можно выполнить так же, как мы выполнили эту.
set Показать список системных переменных, в их числе будут и имя пользователя или компьютера
nbtstat -a Отображение всех подключений и ожидающих портов
net localgroup group user /add Добавить в группу group пользователя user
net localgroup group user /delete Удалить пользователя из группы
net send pc «текст» Отправить сообщение пользователю компьютера pc
net sessions Список пользователей
net session /delete Закрыть все сетевые сессии
net use t: \\имя_компютера\папка\ Подключить сетевым диском t: папку на удаленном компьютере
net user имя /active:no Заблокировать пользователя
net user имя /active:yes Разблокировать пользователя
net user имя /domain Информация о пользователе домена
net user Имя /add Добавить пользователя
net user Имя /delete Удалить пользователя
reg add Добавить параметр в реестр (нужны дополнительные параметры, как и командам ниже)
reg compare Сравнивать части реестра
reg copy Копировать из одного раздела в другой
reg delete Удалить указанный параметр или раздел
reg export Экспортировать часть реестра
reg import Импортировать часть реестра
reg load Загрузить выбранную часть реестра
reg query Вывести значения заданной ветки реестра
reg restore Восстановить выбранную часть реестра из файла
reg save Сохранить выбранную часть реестра
reg unload Выгрузить выбранную часть реестра
shutdown -s Выключить компьютер
shutdown -r Перезагрузить компьютер
systeminfo Вывести системную информацию о вашей машине
systeminfo /s machine Вывести системную информацию об удаленной машине
И т.д., не забывайте про «волшебный» параметр /? у команд — это справка о команде. Например, командная строка
покажет все варианты синтаксиса этой команды, а затем
детализирует информацию по команде net send .
Конечно, всё это имеет смысл делать с правами администратора.
Как определить, какое приложение занимает конкретный порт — в этой заметке, а здесь — основные команды Windows, открывающие окна системных приложений настройки.
23.10.2014, 10:31; рейтинг: 10169