내 기본 문제는 FQDN이 유효한 DNS 항목인지 확인해야하는 수십 개의 FQDN (정규화 된 도메인 이름) 항목이있는 스프레드 시트가 있다는 것입니다. 공공 인터넷. 각 FQDN에 대한 DNS 조회를 수행 중이며 공용 DNS 서버를 지정하려고합니다. DNS 호출이 IP 주소를 반환하면 FQDN이 유효하다고 가정합니다. 필자는 64 비트를 Excel에서 작업하고 있지만 32 비트로 컴파일하고 작업 할 솔루션이 필요하므로 동일한 소스 코드를 컴파일 할 수 있어야합니다. 스프레드 시트에는 많은 행이 있으므로 각 조회마다 임시 파일을 만드는 함수를 사용하고 싶지 않습니다. (나는 시스템 호출이 가능할 때 불필요한 임시 파일에 대해 강박 관이다.)64 비트 VBA에서 IP 주소를 찾을 수 없습니다.
"getaddrinfoex"함수는 쿼리되는 이름 서버를 지정할 수있는 기능을 제공하지만 getaddrinfoex 또는 getaddrinfo의 하위 버전을 사용하는 VBA 코드 단편을 찾을 수 없었습니다. DNS 서버). gethostbyname 호출에 대한 몇 가지 예제를 발견했지만 모두 32 비트 Excel 용입니다. 또한, 마이크로 소프트는 gethostbyname까지도이 (https://msdn.microsoft.com/en-us/library/windows/desktop/ms738524(v=vs.85).aspx)는 지원되지되었다고 발표했습니다, 그래서 내가 위에 링크에 보이는 질문 @ 데이비드에 의해 대답에 게시
How can I make a network connection with Visual Basic from Microsoft Access?
코드 조각 getaddrinfo를 교체 권장을 사용하려고했다 32 비트와 64 비트가 모두 호환되는 적절한 구문을 사용해야합니다. 그러나이 예제는 gethostbyname에 대한 호출을 포함하지 않았으며 함수 선언 만 제공했습니다.
VBA에서 getaddrinfoex를 사용할 수 있습니까? 32 비트와 64 비트 모두에서 작동하는 getaddrinfoex를 사용하는 예가 있습니까?
어떤 도움을 주셔서 감사합니다. 몇 년 동안 코드를 작성하지 않아서 기술이 매우 오래되었습니다. 따라서 나는 내가 필요한 것을 찾기 위해 많은 수색을하고있다.
다음은 다양한 검색을 온라인으로 결합하여 만든 코드입니다.
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으로 채우고 몇 주 동안 그렇게 할 것이기 때문에 많은 임시 파일을 삭제하거나 삭제하고 싶지는 않습니다. 그것은 또한 실행 문제의 속도입니다. VBA는 파일을 작성/삭제하는 오버 헤드를 추가하는 기능을 여러 번 실행하면 스프레드 시트를 너무 느리게 업데이트 할 수있는 기능을 실행할 때 전 세계에서 가장 빠르지 않습니다. – SkiBum