我在使用[DnsQuery](http://msdn.microsoft.com/en-us/library/ms682016(VS.85).aspx) API时遇到问题,* ppQueryResultsSet参数让我很烦恼。有人能给我看一个如何在python中进行正确的DLL调用的例子吗?
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")
答案 0 :(得分:2)
它不是指向DNS_RECORD
指针的指针吗?这意味着您必须将rr初始化为POINTER(DNS_RECORD)()
并通过引用传递它:ctypes.byref(rr)
。
更新:但我认为您看到的问题来自于传递server_arr
:您传递的结构中第一个字段为0x00000001
,而不是引用此结构,因此C代码尝试取消引用AddrCount
字段并为您提供访问冲突。同样的技术也应该用于server_arr
。