我遇到[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")
有帮助吗?

解决方案

它不是指向 DNS_RECORD 的指针吗?这意味着您必须将rr初始化为 POINTER(DNS_RECORD)()并通过引用传递它: ctypes.byref(rr)

更新:但我认为您看到的问题来自传递 server_arr :您传递的结构的第一个字段是 0x00000001 而不是引用对于这种结构,所以C代码尝试取消引用 AddrCount 字段并为您提供访问冲突。同样的技术也应该用于 server_arr

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top