Доброго времени суток, Уважаемые. Заранее прошу прощения за многабукаф, решил в одном посте три вопроса соединить.
Очень простая задача - перечислить все активные сетевые соединения и определить через какие из них есть выход в интернет. Казалось бы все просто, но: нужно чтобы работало начиная с XP до Win10. Разбираюсь уже недели две. Собственно проблемы три.
1. В XP SP3 что через выходные структуры GetAdaptersInfo(), что через структуры GetAdaptersAddresses() получаю тип интерфейса №6 (IF_TYPE_ETHERNET_CSMACD), хоть об стенку убейся. XP лицензионная, версия iphlpapi.dll - 5.1.2600.5512.
"КОД ПОКАЖИ !" - да хотя бы пример Rouse_ netifenum отсюда
http://rouse.drkb.ru/network.php. Только в нем все-таки нужно добавить
MIB_IF_TYPE_IEEE80211 = 71;
MIB_IF_TYPE_WWANPP = 243;
MIB_IF_TYPE_WWANPP2 = 244;
MIB_IF_TYPE_IEEE80211 : AdapterType := 'MIB_IF_TYPE_IEEE80211';
MIB_IF_TYPE_WWANPP : AdapterType := 'MIB_IF_TYPE_WWANPP';
MIB_IF_TYPE_WWANPP2 : AdapterType := 'MIB_IF_TYPE_WWANPP2';
Данный пример на XP SP3 кроме того что все интерфейсы показывает как MIB_IF_TYPE_ETHERNET так еще после каждого имени сетевой карты добавляет фразу "Минипорт планировщика пакетов" (например, D-Link AirPlus Xtreme G DWL-G132 Wireless USB Adapter(rev.A) - Минипорт планировщика пакетов). Хотя, если перейти в реестр по GUID (AdapterName), то никакого добавления к имени адаптера не видим. Как с этим бороться ? Может сам Александр aka Rouse_ что-нибудь дельное подскажет ?
2. Сделал выключение/включение адаптеров (это если два и более) для XP при помощи SetIfEntry() и MIB_IF_ADMIN_STATUS_UP/DOWN, поскольку для Win7 и выше это не работает, реализовал при помощи WMI. Помучался с 64-бит правда, но вроде бы все работает, но есть одно НО: Ethernet соединение после включения восстанавливается нормально, а Wi-Fi может отвалиться от роутера, если не установлена галочка "Подключаться автоматически". Ну и с 3G модемами могут быть проблемы.
После недели экспериментов и поисков в интернете нашел способ сделать при помощи SetupAPI (нашел пример на Си, перевести не проблема, тем более что с SetupAPI знаком), нашел упоминание что можно сделать при помощи Net Shell. Собственно вопрос: коммутируемые соединения в этих случаях так же разрываются (это если кто пробовал) ? Ведь нормально же XP "переносит" SetIfEntry() и MIB_IF_ADMIN_STATUS_UP/DOWN, ничего не "отваливается"....
3. В структуре IP_ADAPTER_ADDRESSES
IP_ADAPTER_ADDRESSES = record
union: record
case Integer of
0: (Alignment: LongInt);
1: (Length: LongInt; IfIndex: DWORD);
end;
Next : PIP_ADAPTER_ADDRESSES;
AdapterName : PCHAR;
FirstUnicastAddress : PIP_ADAPTER_UNICAST_ADDRESS;
FirstAnycastAddress : PIP_ADAPTER_ANYCAST_ADDRESS;
FirstMulticastAddress : PIP_ADAPTER_MULTICAST_ADDRESS;
FirstDnsServerAddress : PIP_ADAPTER_DNS_SERVER_ADDRESS;
DnsSuffix : PWCHAR;
Description : PWCHAR;
FriendlyName : PWCHAR;
PhysicalAdress : PhysAddrArray;
PhysicalAdressLength : DWORD;
Flags : DWORD;
Mtu : DWORD;
IfType : DWORD;
OperStatus : IF_OPER_STATUS;
Ipv6IfIndex : DWORD;
ZoneIndices : array[0..15] of DWORD;
FirstPrefix : PIP_ADAPTER_PREFIX;
TransmitLinkSpeed : Int64;
ReceiveLinkSpeed : Int64;
FirstGatewayAddress : PIP_ADAPTER_GATEWAY_ADDRESS_LH;
Ipv4Metric : LongInt;
Ipv6Metric : LongInt;
Dhcpv4Server : SOCKET_ADDRESS;
ConnectionType : NET_IF_CONNECTION_TYPE;
Dhcpv6Server : SOCKET_ADDRESS;
Dhcpv6ClientDuid : array[0..MAX_DHCPV6_DUID_LENGTH - 1] of BYTE;
Dhcpv6ClientDuidLength: LongInt;
Dhcpv6Iaid : LongInt;
end;
есть FriendlyName - это название сетевого подключения. Но в системе (Win7 и выше - Центр управления сетями и общим доступом) есть еще и сетевое имя подключения, как правило это SSID Wi-Fi сети и название оператора 3G-сети, хотя его пользователь может и изменить. А это "Имя сети" откуда можно достать, не используя реестр ? Хотя я уже все равно манифест в ресурсы прописал (WMI требуют права админа), но все же, не люблю я копаться реестре почему-то...