|
|
![]() |
|
||
|
|
|||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Visual Basic Network Services GetNetworkParams: Determine Current and Available DNS Servers |
|
| Posted: | Sunday March 05, 2002 |
| Updated: | Monday December 26, 2011 |
| Applies to: | VB4-32, VB5, VB6 |
| Developed with: | VB6, Windows 2000 |
| OS restrictions: | Windows 98, Windows ME, Windows 2000, Windows XP, Windows 2003 |
| Author: | VBnet - Randy Birch |
|
Related: |
GetAdaptersInfo: Determine if DHCP is Enabled GetAdaptersInfo: Get the DHCP Server IP GetAdaptersInfo: Get the IPs for all DHCP Servers GetAdaptersInfo: Get the Network Adapter IP Address GetAdaptersInfo: Get IP Addresses for All Installed Network Adapters GetNetworkParams: Determine Current and Available DNS Servers |
| Prerequisites |
| One of the operating systems listed under OS Restrictions above. |
|
|
The GetNetworkParams API returns a FIXED_INFO structure containing, among other things, the current DNS server as well as an array of available DNS servers. |
| BAS Module Code |
| None. |
|
|
| Form Code |
|
|
| To a form add a command button (Command1), and two Labels (Label1, Label2). Add the following code to the form: |
|
|
Option Explicit '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Copyright ©1996-2011 VBnet/Randy Birch, All Rights Reserved. ' Some pages may also contain other copyrights by the author. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Distribution: You can freely use this code in your own ' applications, but you may not reproduce ' or publish this code on any web site, ' online service, or distribute as source ' on any media without express permission. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Const MAX_HOSTNAME_LEN = 128
Private Const MAX_DOMAIN_NAME_LEN = 128
Private Const MAX_SCOPE_ID_LEN = 256
Private Const ERROR_SUCCESS As Long = 0
Private Type IP_ADDRESS_STRING
IpAddr(0 To 15) As Byte
End Type
Private Type IP_MASK_STRING
IpMask(0 To 15) As Byte
End Type
Private Type IP_ADDR_STRING
dwNext As Long
IpAddress(0 To 15) As Byte
IpMask(0 To 15) As Byte
dwContext As Long
End Type
Private Type FIXED_INFO
HostName(0 To (MAX_HOSTNAME_LEN + 3)) As Byte
DomainName(0 To (MAX_DOMAIN_NAME_LEN + 3)) As Byte
CurrentDnsServer As Long
DnsServerList As IP_ADDR_STRING
NodeType As Long
ScopeId(0 To (MAX_SCOPE_ID_LEN + 3)) As Byte
EnableRouting As Long
EnableProxy As Long
EnableDns As Long
End Type
Private Declare Function GetNetworkParams Lib "iphlpapi.dll" _
(pFixedInfo As Any, _
pOutBufLen As Long) As Long
Private Declare Function lstrcpyA Lib "kernel32" _
(ByVal RetVal As String, ByVal ptr As Long) As Long
Private Declare Function lstrlenA Lib "kernel32" _
(ByVal ptr As Any) As Long
Private Declare Function inet_ntoa Lib "wsock32.dll" _
(ByVal addr As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" _
(Destination As Any, _
Source As Any, _
ByVal Length As Long)
Private Sub Form_Load()
Command1.Caption = "Get DNS Servers"
End Sub
Private Sub Command1_Click()
Dim cnt As Long
Dim success As Long
Dim currserver As String
Dim dnsservers() As String
'pass an empty string and string array
'to the function. Return value is the
'number of DNS servers found
success = GetDNSServers(currserver, dnsservers())
'show the current DNS server found
Label1.Caption = "Current DNS Server: " & _
vbNewLine & _
currserver
'show all servers found
If success > 0 Then
Label2.Caption = "DNS Server List: " & vbNewLine
For cnt = 0 To success - 1
Label2.Caption = Label2.Caption & _
dnsservers(cnt) & _
vbNewLine
Next
End If
End Sub
Private Function GetDNSServers(sCurrentDNSServer As String, _
dnssvr() As String) As Long
Dim buff() As Byte
Dim cbRequired As Long
Dim nStructSize As Long
Dim ptr As Long
Dim fi As FIXED_INFO
Dim ipas As IP_ADDR_STRING
Dim cnt As Long
ReDim dnssvr(0) As String
nStructSize = LenB(ipas)
'call the api first to determine the
'size required for the values to be returned
Call GetNetworkParams(ByVal 0&, cbRequired)
If cbRequired > 0 Then
ReDim buff(0 To cbRequired - 1) As Byte
If GetNetworkParams(buff(0), cbRequired) = ERROR_SUCCESS Then
ptr = VarPtr(buff(0))
CopyMemory fi, ByVal ptr, Len(fi)
With fi
'identify the current dns server
CopyMemory ipas, _
ByVal VarPtr(.CurrentDnsServer) + 4, _
nStructSize
sCurrentDNSServer = TrimNull(StrConv(ipas.IpAddress, vbUnicode))
'obtain a pointer to the
'DnsServerList array
ptr = VarPtr(.DnsServerList)
'the IP_ADDR_STRING dwNext member indicates
'that more than one DNS server may be listed,
'so a loop is needed
Do While (ptr <> 0)
'copy each into an IP_ADDR_STRING type
CopyMemory ipas, ByVal ptr, nStructSize
With ipas
'extract the server address and
'cast to the array
ReDim Preserve dnssvr(0 To cnt) As String
dnssvr(cnt) = TrimNull(StrConv(ipas.IpAddress, vbUnicode))
ptr = .dwNext
End With
cnt = cnt + 1
Loop
End With
End If 'If GetNetworkParams
End If 'If cbRequired > 0
'return number of servers found
GetDNSServers = cnt
End Function
Private Function TrimNull(item As String)
Dim pos As Integer
pos = InStr(item, Chr$(0))
If pos Then
TrimNull = Left$(item, pos - 1)
Else
TrimNull = item
End If
End Function
Private Function GetInetStrFromPtr(Address As Long) As String
GetInetStrFromPtr = GetStrFromPtrA(inet_ntoa(Address))
End Function
Public Function GetStrFromPtrA(ByVal lpszA As Long) As String
GetStrFromPtrA = String$(lstrlenA(ByVal lpszA), 0)
Call lstrcpyA(ByVal GetStrFromPtrA, ByVal lpszA)
End Function |
| Comments |
|
|
|
|
|
|||||
|
|||||
|
|
|||||
|
Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. |
![]() |