Помогите ctypes.windll.dnsapi.DnsQuery_A
Вопрос
У меня проблемы с [DnsQuery] ( http API: //msdn.microsoft.com/en-us/library/ms682016 (VS.85) .aspx) , меня беспокоит параметр * ppQueryResultsSet. Может кто-нибудь показать мне пример того, как сделать правильные вызовы DLL в Python?
import ctypes
from ctypes import wintypes
from windns_types import DNS_RECORD, IP4_ARRAY #declared here http://pastebin.com/f39d8b997
def DnsQuery(host, type, server, opt=0):
server_arr = IP4_ARRAY()
rr = DNS_RECORD()
server_arr.AddrCount=1
server_arr.AddrArray[0] = ctypes.windll.Ws2_32.inet_addr(server)
ctypes.windll.dnsapi.DnsQuery_A(host, type, opt, server_arr, rr, 0)
# WindowsError: exception: access violation reading 0x00000001
return rr
print DnsQuery("www.google.com", 1, "208.67.222.222")
Решение
Разве это не указатель на указатель на DNS_RECORD
? Это означает, что вы должны инициализировать rr как POINTER (DNS_RECORD) ()
и передать его по ссылке: ctypes.byref (rr)
.
Обновление : но я думаю, что проблема, которую вы видите, заключается в передаче server_arr
: вы передаете структуру с первым полем 0x00000001
вместо ссылки к этой структуре, поэтому код C пытается разыменовать поле AddrCount
и дает вам нарушение прав доступа. Эту же технику следует использовать и для server_arr
.