Hallo Forum,
ich stehe wieder mal (seit Stunden) auf dem Schlauch und bitte daher um Hilfe!
Ich versuche eine IP-Adresse in den zugehörigen Hotnamen aufzulösen. Habe mir dazu entsprechenden VBA-Code im Inet gesucht. Dieser läuft im Excel auch ohne Probleme. Im LS gehen die Funktionen SocketsInitialize und SocketsCleanUp io.
In der Hauptfunktion GetHostnamefromIP geht mit der CopyMemory-Funktion was schief. ich weiß allerdings nicht was.
Kann jemand mal bitte den Code prüfen ? Vllt. hat ja auch jemand eine Aussage was fehlerhaft ist bzw. einen Korrekturhinweis. Hier mal der Code. Die Änderungen zum VBA sind als Kommentar eingefügt.
Bin im Moment völlig ahnungslos ;-(((
Danke für die Mühe!
Grüße R.Kühle
PS: LoNo läuft unter XP SP3 . Die Nutzer sind Standarduser
---
' Aufruf -> GetHostNameFromIP("111.222.111.222")
// Declare
Option Public
Option Explicit
Private Const WSADescription_Len = 256 ' im VBA as Long
Private Const WSASYS_Status_Len = 128 ' im VBA as Long
Private Const WS_VERSION_REQD = &H101 ' im VBA as Long
Private Const IP_SUCCESS = 0 ' im VBA as Long
Private Const SOCKET_ERROR = -1 ' im VBA as Long
Private Const AF_INET = 2 ' im VBA as Long
Private Type WSADATA
wVersion As Integer
wHighVersion As Integer
szDescription(0 To WSADescription_Len) As Integer ' Im VBA as Integer ' im VBA as Byte. Muß aber auch unterLoNo 5 laufen
szSystemStatus(0 To WSASYS_Status_Len) As Integer ' Im VBA as Integer '' im VBA as Byte. Muß aber auch unterLoNo 5 laufen
imaxsockets As Integer
imaxudp As Integer
lpszvenderinfo As Long
End Type
Declare Function WSAStartup Lib "wsock32" (Byval VersionReq As Long, WSADataReturn As WSADATA) As Long
Declare Function WSACleanup Lib "wsock32" () As Long
Declare Function inet_addr Lib "wsock32" (Byval s As String) As Long
Declare Function gethostbyaddr Lib "wsock32" (haddr As Long, Byval hnlen As Long, Byval addrtype As Long) As Long
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (xDest As Any, xSource As Any, Byval nbytes As Long)
Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (lpString As Any) As Long
// Func & Subs
Private Function SocketsInitialize() As Integer ' im VBA as Boolean
Dim WSAD As WSADATA
SocketsInitialize = WSAStartup(WS_VERSION_REQD, WSAD) = IP_SUCCESS
End Function
Private Sub SocketsCleanup()
If WSACleanup() <> 0 Then
Msgbox "Windows Sockets error occurred in Cleanup."
End If
End Sub
Private Function GetHostNameFromIP(Byval sAddress As String) As String
Dim ptrHosent As Long
Dim hAddress As Long
Dim nbytes As Long
If SocketsInitialize() Then
'convert string address to long
hAddress = inet_addr(sAddress)
If hAddress <> SOCKET_ERROR Then
'obtain a pointer to the HOSTENT structure
'that contains the name and address
'corresponding to the given network address.
ptrHosent = gethostbyaddr(hAddress, 4, AF_INET)
If ptrHosent <> 0 Then
'convert address and
'get resolved hostname
'''''''''''''ab hier geht wohl was schief **********************************
CopyMemory ptrHosent, Byval ptrHosent, 4
nbytes = lstrlen(Byval ptrHosent)
If nbytes > 0 Then
sAddress = Space$(nbytes)
CopyMemory Byval sAddress, Byval ptrHosent, nbytes
GetHostNameFromIP = sAddress
End If
Else
GetHostNameFromIP = "Call to gethostbyaddr failed."
End If 'If ptrHosent
SocketsCleanup
Else
GetHostNameFromIP = "String passed is an invalid IP."
End If 'If hAddress
Else
GetHostNameFromIP = "Sockets failed to initialize."
End If 'If SocketsInitialize
End Function