質問

[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