Pergunta

Eu tenho problemas com [DnsQuery] ( http : //msdn.microsoft.com/en-us/library/ms682016 (VS.85) .aspx) API, os parâmetros problemas * ppQueryResultsSet me. Alguém pode me mostrar um exemplo de como fazer chamadas DLL corretos em 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")
Foi útil?

Solução

Não é um ponteiro para ponteiro para DNS_RECORD? Isto significa que você tem que inicializar rr como POINTER(DNS_RECORD)() e passá-lo por referência:. ctypes.byref(rr)

Atualizar : Mas eu acho que o problema que você vê é a partir server_arr passando: você passa uma estrutura com primeiro campo a ser 0x00000001 em vez de referência a esta estrutura, então tentativas de código C para o campo AddrCount dereference e dá -lhe acesso violação. A mesma técnica deve ser usada para server_arr também.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top