Drew Wutka
DWUTKA at Marlow.com
Thu Mar 22 09:59:27 CDT 2007
I posted a solution on the VB list that retrieves all the IP addresses
on a machine. If you just want one, there is a far easier way, use a
Winsock control, and look at it's local IP, a lot less code. But I
needed the ability to get All the local ips (and also all the local
subnets), to see the entire 'network' that a machine is connected too.
Drew
-----Original Message-----
From: accessd-bounces at databaseadvisors.com
[mailto:accessd-bounces at databaseadvisors.com] On Behalf Of JWColby
Sent: Thursday, March 22, 2007 9:37 AM
To: 'Access Developers discussion and problem solving'
Subject: Re: [AccessD] Obtaining IP Address
That worked. The only issue is that there are often more than one IP
addresses and this only returns one. My laptop for example has two, one
for
the wireless connection and one for the cable connection. But this is a
good start.
Thanks,
John W. Colby
Colby Consulting
www.ColbyConsulting.com
-----Original Message-----
From: accessd-bounces at databaseadvisors.com
[mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Gustav Brock
Sent: Thursday, March 22, 2007 10:14 AM
To: accessd at databaseadvisors.com
Subject: Re: [AccessD] Obtaining IP Address
Hi John
This is more convoluted than you might believe.
Here is one method: MachineHostAddress
<module>
Option Compare Database
Option Explicit
Private Const MAX_WSADescription As Long = 256
Private Const MAX_WSASYSStatus As Long = 128
Private Const WS_VERSION_REQD As Long = &H101
Private Const WS_VERSION_MAJOR As Long = WS_VERSION_REQD \ &H100 And
&HFF&
Private Const WS_VERSION_MINOR As Long = WS_VERSION_REQD And &HFF&
Private Const MIN_SOCKETS_REQD As Long = 1
Private Const SOCKET_ERROR As Long = -1
Private Const ERROR_NONE As Long = 0
Private Const IP_SUCCESS As Long = 0
Private Type WSADATA
wVersion As Integer
wHighVersion As Integer
szDescription(0 To MAX_WSADescription) As Byte
szSystemStatus(0 To MAX_WSASYSStatus) As Byte
wMaxSockets As Long
wMaxUDPDG As Long
dwVendorInfo As Long
End Type
Private Declare Function GetHostName Lib "wsock32.dll" Alias
"gethostname" (
_
ByVal szHost As String, _
ByVal dwHostLen As Long) _
As Long
Private Declare Function GetHostByName Lib "wsock32.dll" Alias
"gethostbyname" ( _
ByVal Hostname As String) _
As Long
Private Declare Function WSAStartup Lib "wsock32.dll" ( _
ByVal wVersionRequired As Long, _
ByRef lpWSADATA As WSADATA) _
As Long
Private Declare Function WSACleanup Lib "wsock32.dll" () _
As Long
Private Declare Function inet_ntoa Lib "wsock32.dll" ( _
ByVal addr As Long) _
As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
ByRef xDest As Any, _
ByRef xSource As Any, _
ByVal nbytes As Long)
Private Declare Function lstrcpyA Lib "kernel32" ( _
ByVal RetVal As String, _
ByVal Ptr As Long) _
As Long
Private Declare Function lstrlenA Lib "kernel32" ( _
ByRef lpString As Any) _
As Long
Public Function MachineHostName() _
As String
' Retrieves the host name of this machine.
'
' The host name is preserved in a static variable to ' reduce look up
time
for repeated calls.
Static strHostname As String
If Len(strHostname) = 0 Then
' Host name has not been looked up previously.
If WinSocketsStart() = True Then
' Obtain and store the host name.
strHostname = GetMachineName()
Call WinSocketsClean
End If
End If
MachineHostName = strHostname
End Function
Public Function MachineHostAddress( _
Optional ByVal strHostname As String) _
As String
' Retrieves IP address of the machine with the host name ' strHostname.
' If a zero length host name or no host name is passed, the ' address of
this machine is returned.
' If host name localhost is passed, 127.0.0.1 is returned.
' If the host name cannot be resolved, 0.0.0.0 is returned.
'
' The host addresses are preserved in a static collection to ' reduce
look
up time for repeated calls.
' If strHostname is an empty string, the local host address
' will be looked up.
' However, an empty string cannot be a key in a collection.
' Use this key to store the local host address.
Const cstrKeyThisHost As String = " "
Static colAddress As New Collection
Dim strIpAddress As String
' Ignore error when looking up a key in collection
' colAddress that does not exist.
On Error Resume Next
If Len(strHostname) = 0 Then
strHostname = cstrKeyThisHost
End If
strIpAddress = colAddress.Item(strHostname)
' If strHostname is not found, an error is raised.
If Err.Number <> 0 Then
' This host name has not been looked up previously.
If WinSocketsStart() = True Then
' Obtain the host address.
' Trim strHostname to pass a zero length string when
' looking up the address of the local host.
strIpAddress = GetIPFromHostName(Trim(strHostname))
' Store the host address.
colAddress.Add strIpAddress, strHostname
Call WinSocketsClean
End If
End If
MachineHostAddress = strIpAddress
End Function
Public Sub ShowHostNameAddress()
' Displays host name and IP address of local machine.
Const cstrMsgTitle As String = "Host name and IP address"
Const clngMsgStyle0 As Long = vbExclamation + vbOKOnly
Const clngMsgStyle1 As Long = vbInformation + vbOKOnly
Const cstrMsgPrompt As String = "No access to address information."
Dim strHostname As String
Dim strIpAddress As String
Dim strMsgPrompt As String
If WinSocketsStart() = True Then
' Obtain and pass the host address.
strHostname = GetMachineName()
strIpAddress = GetIPFromHostName(strHostname)
' Display name and address.
strMsgPrompt = _
"Host name: " & strHostname & vbCrLf & _
"IP address: " & strIpAddress
MsgBox strMsgPrompt, clngMsgStyle1, cstrMsgTitle
Call WinSocketsClean
Else
MsgBox cstrMsgPrompt, clngMsgStyle0, cstrMsgTitle
End If
End Sub
Private Function WinSocketsStart() _
As Boolean
' Start up Windows sockets before use.
Const cstrMsgTitle As String = "Windows Sockets"
Const clngMsgStyle As Long = vbCritical + vbOKOnly
Const cstrMsgPrompt As String = "Error at start up of Windows
sockets."
Dim typWSA As WSADATA
Dim booSuccess As Boolean
If WSAStartup(WS_VERSION_REQD, typWSA) = IP_SUCCESS Then
booSuccess = True
End If
If booSuccess = False Then
MsgBox cstrMsgPrompt, clngMsgStyle, cstrMsgTitle
End If
WinSocketsStart = booSuccess
End Function
Private Function WinSocketsClean() _
As Boolean
' Clean up Windows sockets after use.
Const cstrMsgTitle As String = "Windows Sockets"
Const clngMsgStyle As Long = vbExclamation + vbOKOnly
Const cstrMsgPrompt As String = "Error at clean up of Windows
sockets."
Dim booSuccess As Boolean
If WSACleanup() = ERROR_NONE Then
booSuccess = True
End If
If booSuccess = False Then
MsgBox cstrMsgPrompt, clngMsgStyle, cstrMsgTitle
End If
WinSocketsClean = booSuccess
End Function
Private Function GetMachineName() As String
' Retrieves the host name of this machine.
' Assign buffer for maximum length of host name plus
' a terminating null char.
Const clngBufferLen As Long = 255 + 1
Dim stzHostName As String * clngBufferLen
Dim strHostname As String
If GetHostName(stzHostName, clngBufferLen) = ERROR_NONE Then
' Trim host name from buffer string.
strHostname = Left(stzHostName, InStr(1, stzHostName, vbNullChar,
vbBinaryCompare) - 1)
End If
GetMachineName = strHostname
End Function
Private Function GetIPFromHostName( _
ByVal strHostname As String) _
As String
' Converts a host name to its IP address.
'
' If strHostname
' - is zero length, local IP address is returned.
' - is "localhost", IP address 127.0.0.1 is returned.
' - cannot be resolved, unknown IP address 0.0.0.0 is returned.
Const clngAddressNone As Long = 0
' The Address is offset 12 bytes from the
' start of the HOSENT structure.
Const clngAddressOffset As Long = 12
' Size of address part.
Const clngAddressChunk As Long = 4
' Address to return if none found.
Const cstrAddressZero As String = "0.0.0.0"
' Address of HOSENT structure.
Dim ptrHosent As Long
' Address of name pointer.
Dim ptrName As Long
' Address of address pointer.
Dim ptrAddress As Long
Dim ptrIPAddress As Long
Dim ptrIPAddress2 As Long
Dim stzHostName As String
Dim strAddress As String
stzHostName = strHostname & vbNullChar
ptrHosent = GetHostByName(stzHostName)
If ptrHosent = clngAddressNone Then
' Return address zero.
strAddress = cstrAddressZero
Else
' Assign pointer addresses and offset Null-terminated list
' of addresses for the host.
' Note:
' We are retrieving only the first address returned.
' To return more than one, define strAddress as a string array
' and loop through the 4-byte ptrIPAddress members returned.
' The last item is a terminating null.
' All addresses are returned in network byte order.
ptrAddress = ptrHosent + clngAddressOffset
' Get the IP address.
CopyMemory ptrAddress, ByVal ptrAddress, clngAddressChunk
CopyMemory ptrIPAddress, ByVal ptrAddress, clngAddressChunk
CopyMemory ptrIPAddress2, ByVal ptrIPAddress, clngAddressChunk
strAddress = GetInetStrFromPtr(ptrIPAddress2)
End If
GetIPFromHostName = strAddress
End Function
Private Function GetInetStrFromPtr( _
ByVal lngAddress As Long) _
As String
' Converts decimal IP address to IP address string.
GetInetStrFromPtr = GetStrFromPtrA(inet_ntoa(lngAddress))
End Function
Private Function GetStrFromPtrA( _
ByVal lpszA As Long) _
As String
' Copies string from pointer.
' Create buffer string.
GetStrFromPtrA = String(lstrlenA(ByVal lpszA), vbNullChar)
' Copy value from pointer to buffer string.
Call lstrcpyA(ByVal GetStrFromPtrA, ByVal lpszA)
End Function
</module>
/gustav
>>> jwcolby at colbyconsulting.com 22-03-2007 14:59 >>>
Is there VBA code out there to obtain the IP address of the current
workstation? I found code that goes through the registry, and it ALMOST
works, in fact it does work in many instances but...
John W. Colby
Colby Consulting
www.ColbyConsulting.com
--
AccessD mailing list
AccessD at databaseadvisors.com
http://databaseadvisors.com/mailman/listinfo/accessd
Website: http://www.databaseadvisors.com
--
AccessD mailing list
AccessD at databaseadvisors.com
http://databaseadvisors.com/mailman/listinfo/accessd
Website: http://www.databaseadvisors.com