Моя основная проблема заключается в том, что у меня есть таблица с тысячами полных доменных имен FQDN (полное доменное имя), которые мне нужно проверить, является ли полное доменное имя действительной DNS-записью на общественный интернет. Я выполняю поиск DNS каждого FQDN и хотел бы указать общий DNS-сервер. Если вызов DNS возвращает IP-адрес, я предполагаю, что полное доменное имя будет действительным. Я работаю в 64-разрядном формате excel, но мне нужно решение, которое также будет компилироваться и работать в 32-разрядном режиме, поэтому я хочу, чтобы один и тот же исходный код мог быть скомпилирован в обоих. Поскольку в электронной таблице так много строк, я не хочу использовать функцию, которая создает временный файл для каждого поиска. (Я использую OCD о ненужных временных файлах при наличии системного вызова).Невозможно найти IP-адрес в 64-разрядной версии VBA
Я считаю, что функция «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
How can I make a network connection with Visual Basic from 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
Если бы я тебя, я бы проверить это сообщение: http://jayteknews.blogspot.no/2011/08/excel-user-defined-function-nslookup.html – tlemaster
Спасибо за предложение , Я уже смотрел этот пост. Он использует временный файл для каждого поиска DNS. Поскольку я буду заполнять эту таблицу ежедневно с 10 000 + FQDN и будет делать это в течение нескольких недель, я действительно не хочу, чтобы creaete/delete, что многие временные файлы. Это также скорость исполнения. VBA - это не самая быстрая вещь в мире, когда вы выполняете многократно выполняемую функцию, добавляя накладные расходы на создание/удаление файла, сделало бы обновление таблицы слишком медленным. – SkiBum