Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.218.127.141] |
|
Сообщ.
#1
,
|
|
|
нужно получить список модемов (довольно важный момент - необходимо также название модема), и определить к какому порту каждый из них подключен
пользовался поиском... нашел вещи, относящиеся к сабжу, но они тем или иным образом меня не устроили например, в теме поиск COM портов: - SetupDiGetDeviceRegistryProperty() не дает информации о том, какой порт использует устройство - при перечислении в ветке реестра HKLM\HARDWARE\DEVICEMAP\SERIALCOMM нельзя получить название модема |
Сообщ.
#2
,
|
|
|
Воспользуйся RasEnumDevices
|
Сообщ.
#3
,
|
|
|
1) Получаешь список компортов
2) В цикле по всем компортам делаешь так: - посылаешь в порт команду AT - если ответ OK, значит подсоеденен модем - посылаешь команду ATI7 - получаешь информацию о модеме. Подробнее о AT командах читай >> тут <<. |
Сообщ.
#4
,
|
|
|
Цитата artiom_kh @ Воспользуйся RasEnumDevices через нее нельзя получить название модема -Added Цитата Fester @ 1) Получаешь список компортов 2) В цикле по всем компортам делаешь так: - посылаешь в порт команду AT - если ответ OK, значит подсоеденен модем - посылаешь команду ATI7 - получаешь информацию о модеме. Подробнее о AT командах читай >> тут <<. про последний пункт поподробнее пожалуйста по поводу команд ATI[0-7] - работают они на большинстве модемов, но не на всех с помощью этих команд можно получить нужную информацию... банальный пример сабжа - HyperTerminal: при создании подключения он выводит имена модемов, а при открытии какого-либо из них ведь узнает как-то к какому порту тот подключен? |
Сообщ.
#5
,
|
|
|
Что именно подробнее?
Послал модему команду и слушай что тебе отвечают... Ну так наверное через ATI[0-7] и узнает Хотя хз... |
Сообщ.
#6
,
|
|
|
проверяю я на своем мобильнике, модем которого установлен в системе, и для которого при подключении создается виртуальный com-порт
когда телефон подключен, в диспетчере устройств отображается название его модема в таком виде: Siemens Mobile Phone USB Modem... это же название можно получить при помощи SetupDiGetDeviceRegistryProperty() с флагом SPDRP_DEVICEDESC или SPDRP_FRIENDLYNAME... это же название показывает у себя в списке HyperTerminal но даже приблизительно похожей строки мне не дали AT[0-9], поэтому этот вариант имхо не подходит |
Сообщ.
#7
,
|
|
|
Цитата tark @ И не даст.но даже приблизительно похожей строки мне не дали AT[0-9] Telephony API(TAPI) в руки и вперед - перечислять модемы. |
Сообщ.
#8
,
|
|
|
Есть еще и усб модемы.
|
Сообщ.
#9
,
|
|
|
Цитата tark @ через нее нельзя получить название модема почему нельзя? typedef struct tagRASDEVINFO { DWORD dwSize; TCHAR szDeviceType[RAS_MaxDeviceType + 1]; TCHAR szDeviceName[RAS_MaxDeviceName + 1];//вот тебе название } RASDEVINFO; Цитата Alexandoros @ Есть еще и усб модемы. есть, но в итоге система видит их как-бы прицеплеными к одному из "виртуальных" com-портов (обычно начиная с COM3) |
Сообщ.
#10
,
|
|
|
Цитата artiom_kh @ Цитата tark @ через нее нельзя получить название модема почему нельзя? typedef struct tagRASDEVINFO { DWORD dwSize; TCHAR szDeviceType[RAS_MaxDeviceType + 1]; TCHAR szDeviceName[RAS_MaxDeviceName + 1];//вот тебе название } RASDEVINFO; потому нельзя, что уже пробовал RASDEVINFO::szDeviceName для модемов содержит строку "modem" Добавлено прошу прощения, у меня в коде была ошибка - поэтому выводилось не так |
Сообщ.
#12
,
|
|
|
Скажите, а как именно помог-то? Какая функция? Там уже страниц 6 набежало. А вот какая функция выводит модем и соответствующий dwDeviceID для него?
Там тем более на дельфях всё, не силён, блин ..... какюсь ... Может кто может, окинет трезым взглядом? |
Сообщ.
#13
,
|
|
|
см. проект в аттаче
Прикреплённый файлenum_modems.zip (10.75 Кбайт, скачиваний: 434) |
Сообщ.
#14
,
|
|
|
tark спасибо! А то я стал делать через RasEnumDevices и получил что-то непонятное.
Я пользую модем с жестко вбитым ID сейчас, равным 0. Вызываю RasEnumDevices и получаю туфту типа: devices=6 0) wan miniport 1) wan miniport 2) wan miniport 3) wan miniport 4) ppoe miniport 5) IC Voice Genius modem То есть типа, как будто в оратном порядке. Заклыдываться на обратный порядок - это бред! Не надёжно. А в приведенном выше примере ENUM_MODEMS.ZIP порядок вызово TAPI функций такой: lineInitialize - получаем хендл приложения, и количество TAPI-совместимых устройств lineNegotiateAPIVersion - проверяем поддержку версии Тапи lineGetDevCaps - получение DeviceCaps, названия, и филтрование его типа (LINEMEDIAMODE_INTERACTIVEVOICE, LINEMEDIAMODE_DATAMODEM) итд. |
Сообщ.
#15
,
|
|
|
Цитата tark @ RASDEVINFO::szDeviceName для модемов содержит строку "modem" Ничего подобного, строку "modem" содержит RASDEVINFO::szDeviceType, а RASDEVINFO::szDeviceName содержит как раз таки human-readable name модема. Вот кстати как у меня реализовано перечисление списка модемов: bool CSysRegDialCB::HasInstalledModems() { static DWORD dwCb = sizeof(RASDEVINFO); DWORD dwErr = ERROR_SUCCESS; DWORD dwRetries = 5; DWORD dwDevices = 0; RASDEVINFO* lpRasDevInfo = NULL; bool bResult=false; while (dwRetries--) { if (NULL != lpRasDevInfo) { HeapFree(GetProcessHeap(), 0, lpRasDevInfo); lpRasDevInfo = NULL; } lpRasDevInfo = (RASDEVINFO*) HeapAlloc(GetProcessHeap(), 0, dwCb); if (NULL == lpRasDevInfo) { dwErr = ERROR_NOT_ENOUGH_MEMORY; break; } lpRasDevInfo->dwSize = sizeof(RASDEVINFO); // dwErr = RasEnumDevices( lpRasDevInfo, &dwCb, &dwDevices); if (ERROR_BUFFER_TOO_SMALL != dwErr) { break; } } if (ERROR_SUCCESS == dwErr) { for (DWORD i = 0; i < dwDevices; i++) { if(strcmp(RASDT_Modem,lpRasDevInfo[i].szDeviceType)==0) { bResult=true; break; } } } if (NULL != lpRasDevInfo) { HeapFree(GetProcessHeap(), 0, lpRasDevInfo); lpRasDevInfo = NULL; } return bResult; } Правда мне только надо проверить наличие инсталлированных модемов в системе, а не их имена |
Сообщ.
#16
,
|
|
|
artiom_kh
ну.... понимаете тут в чем дело! RasEnumDevices - писал на C# , если кому надо - обращайтесь! там со стрктурками есть тонкость! вот ... я чего говорю, когда с ТАПИ работаю, я использую dwDeviceID = 0. Он отображается на модем IC VoiceModem Genius 56K. Вызываю RasEnumDevices 0) L2TP Miniport 1) L2TP Miniport 2) L2TP Miniport 3) L2TP Miniport 4) PPPOE Miniport 5) IC VoiceModem Genius 56K Тут ведь вся тонкость работы с ТАПИ в том, чтобы получить не сам список как таковой, а именно соответствие dwDeviceID с именем модема. А можно это сделать сейчас (еслим не ошибаюсь) только через последовательность: lineInitialize lineNegotiateAPIVersion lineGetDevCaps lineOpen lineGetID lineClose |
Сообщ.
#17
,
|
|
|
Цитата алексир @ Вызываю RasEnumDevices 0) L2TP Miniport 1) L2TP Miniport 2) L2TP Miniport 3) L2TP Miniport 4) PPPOE Miniport 5) IC VoiceModem Genius 56K Всё правильно, RasEnumDevices даёт полный список устройств пригодных для RAS-соединения. Однако физический модем из них один - 5, и вычислить его труда не составит - просто проверь RASDEVINFO::szDeviceType на наличие строки RASDT_Modem ("modem") Цитата алексир @ Тут ведь вся тонкость работы с ТАПИ в том, чтобы получить не сам список как таковой, а именно соответствие dwDeviceID с именем модема. ну тогда как знаешь, каждый способ хорош по своему |
Сообщ.
#18
,
|
|
|
Цитата ну тогда как знаешь, каждый способ хорош по своему Э! Вы что! Спасибо! Ваш код и юзаю. RAS***** не дают связи Имя_Модема <--> DeviceID ! |
Сообщ.
#19
,
|
|
|
Пардон. код TARK-а!
|
Сообщ.
#20
,
|
|
|
tarkim +1.
спасибо за аттач enum_modems.zip. нужно было имя модема и порт на котором от висит. исходник работает. прост для понимания. |