帮助 ctypes.windll.dnsapi.DnsQuery_A

2 投票
1 回答
671 浏览
提问于 2025-04-15 16:28

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

1 个回答

2

这不是指向指向DNS_RECORD的指针吗?这意味着你需要把rr初始化为POINTER(DNS_RECORD)(),然后通过引用传递它:ctypes.byref(rr)

更新:不过我觉得你遇到的问题是因为传递server_arr时出错了:你传递了一个结构体,它的第一个字段是0x00000001,而不是这个结构体的引用,所以C代码试图解引用AddrCount字段时就出现了访问违规。对server_arr也应该使用同样的技巧。

撰写回答