C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
COM-порты. Найти всех., Выявление имеющихся в системе портов
Daisy
Отправлено: 19.09.2005, 10:13


Дежурный стрелочник

Группа: Участник
Сообщений: 36



Как можно до открытия порта методом Open определить, имеется ли порт с таким номером в системе или нет?
Можно конечно проверять результат открытия, но при открытии порта появляется сообщение, что порт с таки именем не существует. Хотелось бы все по тихому приверить, без ругательных сообщений. Может есть какие-то варианты, как это можно сделать?
Спасибо.
Vlad
Отправлено: 19.09.2005, 10:30


Машинист паровоза

Группа: Участник
Сообщений: 231



Ну во первых в поиск!! Во вторых, кучи портов у тебя нет, стандартно 2, соответственно стандартная обработка CreateFile который возращает HANDLE, пробуй -try. Сообщение будет вываливаться только когда запускаешь из среды в борланде, если запускаешь ехе просто, то нет.
В третих, что бы не юзать, а знать сразу — через bios, там номер порта и его адрес. Но это не есть хороший вариант.
В четвертых, через WMI.
** Stan
Отправлено: 19.09.2005, 11:32


Не зарегистрирован







QUOTE (Daisy @ 19/09/2005, 10:13)
Как можно до открытия порта методом Open определить, имеется ли порт с таким номером в системе или нет?

Для этого есть только один универсальный способ — тупо в цикле переоткрывать порты по названию функцией CreateFile.
в try нет необходимости, так как в случае неуспеха CreateFile просто возвращает INVALID_HANDLE_VALUE БЕЗ окошек с ошибками.
Причину неуспеха можно узнать функцией GetLastError()
Если возращает 2 — порта нет в природе, 5 — занят другим приложением.
В библиотеке Async32 от TMS Software есть функция GetComPortNames(TStringList* value), выдающая имена всех COM-портов на компе. Она работает описанным выше способом, где то исходники попадались.
Daisy
Отправлено: 19.09.2005, 14:10


Дежурный стрелочник

Группа: Участник
Сообщений: 36



Спасибо. С CreateFile все получилось!
Только что-то GetCOMPortNames найти нигде не могу. На сайте TMS читаю, что должен быть. Async32 у меня есть и достаточно свежий, но не могу найти ни в хелпе этот метод, ни в сети пример применения sad.gif
Asher
Отправлено: 19.09.2005, 16:07


Мастер участка

Группа: Модератор
Сообщений: 550



Можешь в реестре посмотреть наличие портов.
Ветка HKEY_LOCAL_MACHINE\Hardware\DeviceMap\SerialComm
** Stan
Отправлено: 19.09.2005, 16:58


Не зарегистрирован







QUOTE (Asher @ 19/09/2005, 16:07)
Можешь в реестре посмотреть наличие портов.
Ветка HKEY_LOCAL_MACHINE\Hardware\DeviceMap\SerialComm

Если подключить к компу дополнительный "USB-шный" COM-порт, то инфа о нем в данной ветке реестра появится только после перегрузки системы и юзер будет недоумевать почему прога его не видит... smile.gif

QUOTE (Daisy @ 19/09/2005, 14:10)
Только что-то GetCOMPortNames найти нигде не могу. На сайте TMS читаю, что должен быть. Async32 у меня есть и достаточно свежий, но не могу найти ни в хелпе этот метод, ни в сети пример применения

А если просто написать
CODE
VaComm1->
и подождать пока вывалиться список методов и свойств. Там и найдешь.
Guest
Отправлено: 19.09.2005, 17:03


Не зарегистрирован







QUOTE (Daisy @ 19/09/2005, 14:10)
Async32 у меня есть и достаточно свежий, но не могу найти ни в хелпе этот метод, ни в сети пример применения sad.gif

CODE

void __fastcall TForm1::FormCreate(TObject *Sender) {
TStringList *s= new TStringList();
VaComm1->GetComPortNames(s);
for(int i=0; i<s->Count; i++)
  Memo1->Lines->Add(s->Strings[i]);
}
//---------------------------------------------------------------------------
Daisy
Отправлено: 19.09.2005, 21:26


Дежурный стрелочник

Группа: Участник
Сообщений: 36



Здорово! Работает!
Огромное спасибо всем за помощь.

Вернуться в Компьютерное железо и системное администрирование.