2

我在使用 [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")
4

1 回答 1

2

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

更新:但我认为您看到的问题来自于传递server_arr:您传递了一个结构,其中第一个字段0x00000001不是对该结构的引用,因此 C 代码尝试取消引用AddrCount字段并给您访问冲突。也应该使用相同的技术server_arr

于 2009-11-28T18:18:59.723 回答