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 у меня есть и достаточно свежий, но не могу найти ни в хелпе этот метод, ни в сети пример применения |
|
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-порт, то инфа о нем в данной ветке реестра появится только после перегрузки системы и юзер будет недоумевать почему прога его не видит...
QUOTE (Daisy @ 19/09/2005, 14:10) | Только что-то GetCOMPortNames найти нигде не могу. На сайте TMS читаю, что должен быть. Async32 у меня есть и достаточно свежий, но не могу найти ни в хелпе этот метод, ни в сети пример применения |
А если просто написать и подождать пока вывалиться список методов и свойств. Там и найдешь. |
|
Guest |
Отправлено: 19.09.2005, 17:03 |
|
Не зарегистрирован
|
QUOTE (Daisy @ 19/09/2005, 14:10) | Async32 у меня есть и достаточно свежий, но не могу найти ни в хелпе этот метод, ни в сети пример применения |
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
|
Здорово! Работает!
Огромное спасибо всем за помощь. |
|