Моя основная проблема заключается в том, что у меня есть электронная таблица с десятками тысяч записей FQDN (полное доменное имя), которые мне нужно проверить, является ли FQDN допустимой записью DNS в общедоступном Интернете. Я выполняю поиск DNS для каждого полного доменного имени и хотел бы указать общедоступный DNS-сервер. Если вызов DNS возвращает IP-адрес, я предполагаю, что полное доменное имя действительно. Я работаю в 64-разрядной версии Excel, но мне нужно решение, которое также будет компилироваться и работать в 32-разрядной версии, поэтому я хочу, чтобы один и тот же исходный код мог быть скомпилирован в обоих случаях. Поскольку в электронной таблице так много строк, я не хочу использовать функцию, которая создает временный файл для каждого поиска. (Я OCD о ненужных временных файлах, когда доступен системный вызов).
Я считаю, что функция «getaddrinfoex» предоставляет возможность указать, какой сервер имен запрашивается, но мне не удалось найти фрагменты VBA, которые используют getaddrinfoex или меньшую версию getaddrinfo (которая не позволяет указать DNS-сервер). Я нашел несколько примеров вызовов gethostbyname, но все они для 32-разрядной версии Excel. Кроме того, Microsoft опубликовала, что gethostbyname устарела (https://msdn.microsoft.com/en-us/library/windows/desktop/ms738524(v=vs.85).aspx), поэтому я пытался использовать рекомендуемую замену getaddrinfo
Как установить сетевое соединение с Visual Basic из Microsoft Access?
Фрагмент, опубликованный в ответе @david на вопрос, который я связал выше, имеет правильный синтаксис, совместимый как с 32-разрядной, так и с 64-разрядной версиями. Но в примере не было вызова gethostbyname, а только объявление функции.
Доступен ли getaddrinfoex в VBA? Есть ли у кого-нибудь пример использования getaddrinfoex, который будет работать как в 32-битной, так и в 64-битной версии?
Буду признателен за любую помощь. Я не программировал МНОГИЕ годы, поэтому мои навыки очень устарели. Таким образом, я делаю много поисков, чтобы найти то, что мне нужно.
Вот код, который я создал, объединив различные поисковые запросы в Интернете.
Private Type HOSTENT
hName As LongPtr
hAliases As LongPtr
hAddrType As Integer
hLen As Integer
hAddrList As LongPtr
End Type
#if Not VBA7 then
' used by 32-bit compiler
Private Declare Function gethostbyname Lib "wsock32.dll" _
(ByVal HostName As String) As LongPtr
Private Declare Function getaddrinfo Lib "wsock32.dll" _
(ByVal HostName As String) As LongPtr
Public Declare Function WSAStartup Lib "wsock32.dll" _
(ByVal wVersionRequired As Long, lpWSADATA As WSADATA) As LongPtr
#else
' used by 64-bit compiler
Private Declare PtrSafe Function gethostbyname Lib "wsock32.dll" _
(ByVal HostName As String) As LongPtr
Private Declare PtrSafe Function getaddrinfo Lib "wsock32.dll" _
(ByVal HostName As String) As LongPtr
Public Declare PtrSafe Function WSAStartup Lib "wsock32.dll" _
(ByVal wVersionRequired As Long, lpWSADATA As WSADATA) As LongPtr
#endif
Public Function GetIPAddressFromHostName(ByVal HostName As String) _
As LongPtr
Dim HostEntry As HOSTENT
Dim HostEntry2 as HOSTENT
Dim HostEntryPtr As LongPtr
Dim HostEntryPtr2 As LongPtr
Dim IPAddressesPtr As LongPtr
Dim Result As Long
If InitializeSockets Then
' I added the call do getaddrinfo as an example
' I have been able to get it to work at all
HostEntryPtr2 = getaddrinfo(HostName & vbNullChar)
HostEntryPtr = gethostbyname(HostName & vbNullChar)
If HostEntryPtr > 0 Then
CopyMemory HostEntry, ByVal HostEntryPtr, Len(HostEntryPtr)
CopyMemory IPAddressesPtr, ByVal HostEntry.hAddrList, _
Len(IPAddressesPtr)
CopyMemory Result, ByVal IPAddressesPtr, Len(Result)
GetIPAddressFromHostName = Result
End If
End If
End Function
Public Function InitializeSockets() As Boolean
' Initialize Windows sockets.
Dim WinSockData As WSADATA
InitializeSockets = WSAStartup(WS_VERSION_REQD, WinSockData) = 0
End Function