Question

J'ai des problèmes avec [DnsQuery] ( http : //msdn.microsoft.com/en-us/library/ms682016 (VS.85) .aspx) , le paramètre * ppQueryResultsSet me perturbe. Quelqu'un peut-il me montrer un exemple de la procédure à suivre pour effectuer des appels DLL corrects en 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")
Était-ce utile?

La solution

N’est-ce pas un pointeur sur DNS_RECORD ? Cela signifie que vous devez initialiser rr avec le code POINTER (DNS_RECORD) () et le transmettre par référence: ctypes.byref (rr) .

Mise à jour : Mais je pense que le problème que vous voyez est lié au fait de transmettre server_arr : vous transmettez une structure dont le premier champ est 0x00000001 au lieu de référence. code C tente de déréférencer le champ AddrCount et vous donne une violation d'accès. La même technique doit également être utilisée pour server_arr .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top