gpt4 book ai didi

winapi - VB6 从 IP 查找主机名,指定 DNS 服务器

转载 作者:行者123 更新时间:2023-12-02 11:44:32 29 4
gpt4 key购买 nike

我知道如何在 VB 中使用 GetHostByAddr Windows API 调用从 IPv4 查找主机名( this 效果很好)。然而,该功能不允许指定要使用的 DNS 服务器。有时默认的公司 DNS 服务器没问题,但有时我需要指定外部 DNS 服务器进行查找,而且我不认为在这里执行 shell nslookup 并解析输出是最好的方法。

注意:这实际上将用作 Excel 工作簿中的 VBA 代码来帮助其他人完成工作,当他只需要一些简单的功能时,不值得编写大型应用程序。

认为我可能在 API 调用 getnameinfo 中找到了答案但仔细阅读似乎表明它不提供服务器名称参数。

经过一番激烈的搜索,我发现了reference to the pExtra parameter to the DNSQuery function 。但我什至不知道如何开始在 VB6 中使用它。

有人可以以任何方式帮助我从 VB6 进行 DNS 查找,指定要使用的服务器名称吗?

一个完整的工作解决方案当然很好,但我愿意工作:只要为我指明正确的方向即可。

更新:由于某些奇怪的原因,它没有表明 DNSQuery 是 Windows API 调用。听起来根本不像。如果我收集了这一微小的细节,我当然能够在这个问题上取得更多进展。

最佳答案

试试这个:

Option Explicit

Private Declare Function DnsQuery Lib "dnsapi" Alias "DnsQuery_A" (ByVal strname As String, ByVal wType As Integer, ByVal fOptions As Long, ByVal pServers As Long, ppQueryResultsSet As Long, ByVal pReserved As Long) As Long
Private Declare Function DnsRecordListFree Lib "dnsapi" (ByVal pDnsRecord As Long, ByVal FreeType As Long) As Long
Private Declare Function lstrlen Lib "kernel32" (ByVal straddress As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, ByVal Source As Long, ByVal Length As Long)
Private Declare Function inet_ntoa Lib "ws2_32.dll" (ByVal pIP As Long) As Long
Private Declare Function inet_addr Lib "ws2_32.dll" (ByVal sAddr As String) As Long

Private Const DnsFreeRecordList As Long = 1
Private Const DNS_TYPE_A As Long = &H1
Private Const DNS_QUERY_BYPASS_CACHE As Long = &H8

Private Type VBDnsRecord
pNext As Long
pName As Long
wType As Integer
wDataLength As Integer
flags As Long
dwTel As Long
dwReserved As Long
prt As Long
others(35) As Byte
End Type

Private Sub Command1_Click()
MsgBox Resolve("google.com", "208.67.222.222")
End Sub

Private Function Resolve(sAddr As String, Optional sDnsServers As String) As String
Dim pRecord As Long
Dim pNext As Long
Dim uRecord As VBDnsRecord
Dim lPtr As Long
Dim vSplit As Variant
Dim laServers() As Long
Dim pServers As Long
Dim sName As String

If LenB(sDnsServers) <> 0 Then
vSplit = Split(sDnsServers)
ReDim laServers(0 To UBound(vSplit) + 1)
laServers(0) = UBound(laServers)
For lPtr = 0 To UBound(vSplit)
laServers(lPtr + 1) = inet_addr(vSplit(lPtr))
Next
pServers = VarPtr(laServers(0))
End If
If DnsQuery(sAddr, DNS_TYPE_A, DNS_QUERY_BYPASS_CACHE, pServers, pRecord, 0) = 0 Then
pNext = pRecord
Do While pNext <> 0
Call CopyMemory(uRecord, pNext, Len(uRecord))
If uRecord.wType = DNS_TYPE_A Then
lPtr = inet_ntoa(uRecord.prt)
sName = String(lstrlen(lPtr), 0)
Call CopyMemory(ByVal sName, lPtr, Len(sName))
If LenB(Resolve) <> 0 Then
Resolve = Resolve & " "
End If
Resolve = Resolve & sName
End If
pNext = uRecord.pNext
Loop
Call DnsRecordListFree(pRecord, DnsFreeRecordList)
End If
End Function

关于winapi - VB6 从 IP 查找主机名,指定 DNS 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2215203/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com