На главную Наши проекты:
Журнал   ·   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
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> список модемов
    нужно получить список модемов (довольно важный момент - необходимо также название модема), и определить к какому порту каждый из них подключен

    пользовался поиском... нашел вещи, относящиеся к сабжу, но они тем или иным образом меня не устроили
    например, в теме поиск 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 Кбайт, скачиваний: 438)
                              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;
                                   
                                  }

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


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0470 ]   [ 15 queries used ]   [ Generated: 17.05.24, 22:36 GMT ]