Domanda

Ho dei problemi con [DnsQuery] ( http : //msdn.microsoft.com/en-us/library/ms682016 (VS.85) .aspx) API, il parametro * ppQueryResultsSet mi dà fastidio. Qualcuno può mostrarmi un esempio di come effettuare chiamate DLL corrette in Python?

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")
È stato utile?

Soluzione

Non è un puntatore al puntatore a DNS_RECORD ? Ciò significa che devi inizializzare rr come POINTER (DNS_RECORD) () e passarlo per riferimento: ctypes.byref (rr) .

Aggiorna : ma penso che il problema che vedi provenga dal passaggio di server_arr : passi una struttura con il primo campo 0x00000001 anziché riferimento a questa struttura, quindi il codice C tenta di dereferenziare il campo AddrCount e ti dà la violazione di accesso. La stessa tecnica dovrebbe essere usata anche per server_arr .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top