Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.191.189.120] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#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 Кбайт, скачиваний: 438) |
Сообщ.
#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; } Правда мне только надо проверить наличие инсталлированных модемов в системе, а не их имена |