На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> список модемов
    нужно получить список модемов (довольно важный момент - необходимо также название модема), и определить к какому порту каждый из них подключен

    пользовался поиском... нашел вещи, относящиеся к сабжу, но они тем или иным образом меня не устроили
    например, в теме поиск COM портов:
    - SetupDiGetDeviceRegistryProperty() не дает информации о том, какой порт использует устройство
    - при перечислении в ветке реестра HKLM\HARDWARE\DEVICEMAP\SERIALCOMM нельзя получить название модема
      Воспользуйся RasEnumDevices
        1) Получаешь список компортов
        2) В цикле по всем компортам делаешь так:
        - посылаешь в порт команду AT
        - если ответ OK, значит подсоеденен модем
        - посылаешь команду ATI7
        - получаешь информацию о модеме.

        Подробнее о AT командах читай >> тут <<.
          Цитата artiom_kh @
          Воспользуйся RasEnumDevices

          через нее нельзя получить название модема

          -Added
          Цитата Fester @
          1) Получаешь список компортов
          2) В цикле по всем компортам делаешь так:
          - посылаешь в порт команду AT
          - если ответ OK, значит подсоеденен модем
          - посылаешь команду ATI7
          - получаешь информацию о модеме.

          Подробнее о AT командах читай >> тут <<.

          про последний пункт поподробнее пожалуйста :)
          по поводу команд ATI[0-7] - работают они на большинстве модемов, но не на всех с помощью этих команд можно получить нужную информацию...

          банальный пример сабжа - HyperTerminal: при создании подключения он выводит имена модемов, а при открытии какого-либо из них ведь узнает как-то к какому порту тот подключен? :unsure:
            Что именно подробнее?
            Послал модему команду и слушай что тебе отвечают...


            Ну так наверное через ATI[0-7] и узнает :)

            Хотя хз...
              проверяю я на своем мобильнике, модем которого установлен в системе, и для которого при подключении создается виртуальный com-порт
              когда телефон подключен, в диспетчере устройств отображается название его модема в таком виде: Siemens Mobile Phone USB Modem... это же название можно получить при помощи SetupDiGetDeviceRegistryProperty() с флагом SPDRP_DEVICEDESC или SPDRP_FRIENDLYNAME... это же название показывает у себя в списке HyperTerminal
              но даже приблизительно похожей строки мне не дали AT[0-9], поэтому этот вариант имхо не подходит
                Цитата tark @
                но даже приблизительно похожей строки мне не дали AT[0-9]
                И не даст.
                Telephony API(TAPI) в руки и вперед - перечислять модемы.
                  Есть еще и усб модемы.
                    Цитата tark @
                    через нее нельзя получить название модема

                    почему нельзя?

                    ExpandedWrap disabled
                      typedef struct tagRASDEVINFO
                      {  
                      DWORD dwSize;  
                      TCHAR szDeviceType[RAS_MaxDeviceType + 1];  
                      TCHAR szDeviceName[RAS_MaxDeviceName + 1];//вот тебе название
                      } RASDEVINFO;


                    Цитата Alexandoros @
                    Есть еще и усб модемы.

                    есть, но в итоге система видит их как-бы прицеплеными к одному из "виртуальных" com-портов (обычно начиная с COM3)
                      Цитата artiom_kh @
                      Цитата tark @
                      через нее нельзя получить название модема

                      почему нельзя?

                      ExpandedWrap disabled
                        typedef struct tagRASDEVINFO
                        {  
                        DWORD dwSize;  
                        TCHAR szDeviceType[RAS_MaxDeviceType + 1];  
                        TCHAR szDeviceName[RAS_MaxDeviceName + 1];//вот тебе название
                        } RASDEVINFO;

                      потому нельзя, что уже пробовал :)
                      RASDEVINFO::szDeviceName для модемов содержит строку "modem" :whistle:

                      Добавлено
                      прошу прощения, у меня в коде была ошибка - поэтому выводилось не так :)
                        TAPI оказался не так страшен, как я думал :)
                        помог этот код
                          Скажите, а как именно помог-то? :o Какая функция? Там уже страниц 6 набежало. :( А вот какая функция выводит модем и соответствующий dwDeviceID для него?
                          Там тем более на дельфях всё, не силён, блин ..... :( какюсь ... :( Может кто может, окинет трезым взглядом? :yes:
                          Сообщение отредактировано: алексир -
                            см. проект в аттаче
                            Прикреплённый файлПрикреплённый файлenum_modems.zip (10.75 Кбайт, скачиваний: 434)
                              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) итд.
                                Цитата tark @
                                RASDEVINFO::szDeviceName для модемов содержит строку "modem"

                                Ничего подобного, строку "modem" содержит RASDEVINFO::szDeviceType, а RASDEVINFO::szDeviceName содержит как раз таки human-readable name модема.
                                Вот кстати как у меня реализовано перечисление списка модемов:
                                ExpandedWrap disabled
                                  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;
                                   
                                  }

                                Правда мне только надо проверить наличие инсталлированных модемов в системе, а не их имена
                                  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
                                    Цитата алексир @
                                    Вызываю 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 с именем модема.

                                    ну тогда как знаешь, каждый способ хорош по своему
                                      Цитата
                                      ну тогда как знаешь, каждый способ хорош по своему


                                      :o Э! Вы что! Спасибо! Ваш код и юзаю. :D RAS***** не дают связи Имя_Модема <--> DeviceID ! ;)
                                        Пардон. код TARK-а! ;)
                                          tarkim +1.

                                          спасибо за аттач enum_modems.zip.

                                          нужно было имя модема и порт на котором от висит. исходник работает. прост для понимания.
                                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                          0 пользователей:


                                          Рейтинг@Mail.ru
                                          [ Script execution time: 0,0452 ]   [ 16 queries used ]   [ Generated: 19.04.24, 11:38 GMT ]