GetAdaptersInfo / CopyMemory Absturz

15/01/2013 - 11:14 von Wolfgang Wolf | Report spam
Hallo,

versuche die Netzwerkadapter-Einstellungen meines Rechners zu lesen.
Habe mich dabei an das Beispiel von MS unter
http://support.microsoft.com/kb/223025 gehalten. Funktioniert bei mir so
weit gut, stürzt aber in der Zeile CopyMemory auf einigen anderen
Rechnern ohne Fehlermeldung ab. Die Arbeitsweise der Prozedur ist mir eh
suspekt, vor allem wie die AdapterInfoSize ermittelt wird.

Hier meine gekürzte Version des Auslesens, ich brauche alle anderen
Informationen aus dem Beispiel nicht. Frage an die API-Experten:
Ich habe Meldungen über die Parameter der CopyMemory Funktion gesammelt
und erhalte folgende Werte:
Auf dem funktionierendem Rechner:
AdapterInfoSize: 640, Buffer2: 1192, AdapterInfo: 1192
Auf dem abstürzenden Rechner:
AdapterInfoSize: 1920, Buffer2: 1192, AdapterInfo: 1192
Wie mache ich das besser?

Sub readData()
Dim error As Long
Dim AdapterInfoSize As Long
Dim j As Integer
Dim AdapterInfo As IP_ADAPTER_INFO
Dim pAddrStr As Long
Dim pAdapt As Long
Dim Buffer2 As IP_ADAPTER_INFO
Dim AdapterInfoBuffer() As Byte

AdapterInfoSize = 0
error = GetAdaptersInfo(ByVal 0&, AdapterInfoSize)
If error <> 0 Then
If error <> ERROR_BUFFER_OVERFLOW Then Exit Sub
End If
ReDim AdapterInfoBuffer(AdapterInfoSize - 1)

' Get actual adapter information
error = GetAdaptersInfo(AdapterInfoBuffer(0), AdapterInfoSize)
If error <> 0 Then Exit Sub

' Allocate memory
CopyMemory AdapterInfo, AdapterInfoBuffer(0), AdapterInfoSize
pAdapt = AdapterInfo.Next
MsgBox "AdapterInfoSize:" & AdapterInfoSize
MsgBox "Buffer2:" & LenB(Buffer2)
MsgBox "AdapterInfo:" & LenB(AdapterInfo)
Do
CopyMemory Buffer2, AdapterInfo, AdapterInfoSize
ReDim Preserve mAdapterInfo(j)
mAdapterInfo(j).AdapterName = ATrim(Buffer2.Description)
mAdapterInfo(j).DhcpEnabled = Buffer2.DhcpEnabled
mAdapterInfo(j).IpAddress = ATrim(Buffer2.IpAddressList.IpAddress)
mAdapterInfo(j).subnetmask = ATrim(Buffer2.IpAddressList.IpMask)
pAddrStr = Buffer2.IpAddressList.Next
pAdapt = Buffer2.Next
If pAdapt <> 0 Then CopyMemory AdapterInfo, ByVal pAdapt,
AdapterInfoSize
j = j + 1
Loop Until pAdapt = 0
mAdapterCount = j
End Sub
 

Lesen sie die antworten

#1 Christian Zimmermann
15/01/2013 - 11:41 | Warnen spam
Hallo Wolfgang,

Am 15.01.2013 11:14, schrieb Wolfgang Wolf:

versuche die Netzwerkadapter-Einstellungen meines Rechners zu lesen.
Habe mich dabei an das Beispiel von MS unter
http://support.microsoft.com/kb/223025 gehalten. Funktioniert bei mir so
weit gut, stürzt aber in der Zeile CopyMemory auf einigen anderen
Rechnern ohne Fehlermeldung ab. Die Arbeitsweise der Prozedur ist mir eh
suspekt, vor allem wie die AdapterInfoSize ermittelt wird.



evt. stimmt etwas mit deiner CopyMemory-Deklaration nicht oder der
Beginn der Speicherbereiche wird nicht richtig berücksichtigt.

Schau dir doch mal folgendes Bsp. an:

http://vbnet.mvps.org/code/network/...resses.htm

Das funktioniert zumindest auch noch unter Vista. Der Microsoft Artikel
bezieht sich auch auf àltere Versionen.

Gruß,
Christian


...

Ähnliche fragen