ПРоблема такая,
при одном сетевом интерфейсе GetAdaptersInfo работает шикарно.
Но что делать если сетевых интерфейса два, и инфа мне нужна о втором ?
Посмторите пожалуйста код внизу и скажите, что может я не так делаю.
Текст взят из МСДН поэтому кое какие детали опущены.
Итак GetAdaptersInfo требует на вход два параметра
1. Указатель на структуру IP_ADAPTER_INFO куда собственно
пишется вся инфа об интерфейсе и
2. длина участка памяти, причем если вместо структуры дать 0& то она сама даёт нам необходимую длину.
Напомню вид структуры:
Type IP_ADAPTER_INFO
Next As Long - адрес следующего блока
ComboIndex As Long
AdapterName As String * MAX_ADAPTER_NAME_LENGTH - имя
Description As String * MAX_ADAPTER_DESCRIPTION_LENGTH
AddressLength As Long
Address(MAX_ADAPTER_ADDRESS_LENGTH - 1) As Byte
Index As Long
Type As Long
DhcpEnabled As Long
CurrentIpAddress As Long
IpAddressList As IP_ADDR_STRING
GatewayList As IP_ADDR_STRING
DhcpServer As IP_ADDR_STRING
HaveWins As Byte
PrimaryWinsServer As IP_ADDR_STRING
SecondaryWinsServer As IP_ADDR_STRING
LeaseObtained As Long
LeaseExpires As Long
End Type
Пишем свою функцию внутри которой будет работать АПИшка GetAdaptersInfo и определим в нашей функции следующие переменные
Public Function МояФункция() As String
Dim error As Long
Dim FixedInfoSize As Long
Dim AdapterInfoSize As Long - здесь храним размер блока - параметр №2 функции GetAdaptersInfo
Dim i As Integer
Dim PhysicalAddress As String
Dim NewTime As Date
Dim AdapterInfo As IP_ADAPTER_INFO
Это объект типа той структуры что идёт в параметр №1 функции GetAdaptersInfo
Dim AddrStr As IP_ADDR_STRING
Dim FixedInfo As FIXED_INFO
Dim Buffer As IP_ADDR_STRING
Dim pAddrStr As Long
Dim pAdapt As Long
Dim Buffer2 As IP_ADAPTER_INFO
Dim FixedInfoBuffer() As Byte
Dim AdapterInfoBuffer() As Byte
Шаг первый
AdapterInfoSize = 0
error = GetAdaptersInfo(ByVal 0&, AdapterInfoSize)
вынуждаем функцию показать нужный размер.
Для справки скажу при одном интерфейсе размер выдаётся 640 /наверно байт/, а при наличии двух интерфейсов - 1280.
Шаг второй
ReDim AdapterInfoBuffer(AdapterInfoSize - 1)
Задаём произвольному массиву определённый размер,
который нв практике соответственно 639 и 1279 /массив считается с нуля, поэтому на один меньше/
Шаг третий
error = GetAdaptersInfo(AdapterInfoBuffer(0), AdapterInfoSize)
Повтороно вызываем функцию, но теперь у неё во втором параметре
правильный размер, а в первом подсовываем ей вместо её любимой
структуры наш массив, куда она успешно закачает всю инфу,
и массив ей придётся в пору по размеру.
Напомню размер при одном интерфейсе 639 при двух 1279.
/Закачивает она кстати каждый раз в самые разные закутки памяти/
Но при этом AdapterInfoBuffer(0) всегда указывает на начало данных.
(все эти error на практике ещё проверяются, но по ним всё окей,
так что я эти куски кода опустил)
Шаг четвёртый
CopyMemory AdapterInfo, AdapterInfoBuffer(0), AdapterInfoSize
Копируем в объект AdapterInfo который типа структуры с инфой IP_ADAPTER_INFO весь наш буфер AdapterInfoBuffer(0) он указывает
на начало области копирования, а AdapterInfoSize показывает размер.
и теперь мы можем доставать все элементы что были в структуре IP_ADAPTER_INFO например:
AdapterInfo.Next - адрес следующего блока
AdapterInfo.ComboIndex
AdapterInfo.AdapterName
и так далее.
Так вот это всё канает для первого интерфейса.
Но при двух интерфейсах эта гадина резервирует в два раза
больше памяти!! Значит в этом же массиве содержится
также инфа о втором интерфейсе !!!
Вопрос к знатокам : как же мне достать её блин!!!
/инфу о втором интерфейсе/
Пробовал
CopyMemory AdapterInfo, AdapterInfoBuffer(640), AdapterInfoSize=640
Болт. В смысле параметры не изменили своего значения
Напр AdapterInfo.Next показывает то же самое
AdapterInfo.Index то же
Пробовал
CopyMemory AdapterInfo, AdapterInfo.Index, AdapterInfoSize=640
типа всунуть ей адрес на второй блок - тоже не проходит.
Повторю резюме
в результате
Шага третьего
error = GetAdaptersInfo(AdapterInfoBuffer(0), AdapterInfoSize)
По адресу на который указывает первый/нулевой/ элемент массива
AdapterInfoBuffer(0), записаны данные длиной AdapterInfoSize
равной в случае двух адаптеров 1280 которые по своей структуре
соответствуют Type IP_ADAPTER_INFO
Т.е
скопировав
CopyMemory AdapterInfo, AdapterInfoBuffer(0), AdapterInfoSize
где цель - AdapterInfo- объект типа нашей структуры
можно получать доступ к элементам структуры
и извлекать информацию о первом адаптере
AdapterInfo.Next - адрес следующего блока
AdapterInfo.ComboIndex
AdapterInfo.AdapterName
и так далее по всем элементам структуры /см выше/
Вопрос: как добраться до структуированных
данных о втором адаптере ?
/предполагаю они в этом же массиве/
Спасибо всем за потраченное время.
В случае успеха - обязуюсь выложить
работающий код. Будет Незаменимая прибамбаска для перезаписи
Routing table при ВПН и др соединениях.
Всем привет.
Ответить
|