Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница:

 

  Вопрос: GetAdaptersInfo о второй сетевухе не могу получить Добавлено: 04.09.05 11:59  

Автор вопроса:  student-uni
ПРоблема такая,
при одном сетевом интерфейсе 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 при ВПН и др соединениях.

Всем привет.

Ответить

  Ответы Всего ответов: 0  

Нет ответов

Страница:

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам