Помогите ctypes.windll.dnsapi.DnsQuery_A - PullRequest
2 голосов
/ 28 ноября 2009

У меня проблемы с [DnsQuery] (http://msdn.microsoft.com/en-us/library/ms682016(VS.85).aspx) API, параметр * ppQueryResultsSet беспокоит меня. Может кто-нибудь показать мне пример того, как делать правильные вызовы DLL в 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")

1 Ответ

2 голосов
/ 28 ноября 2009

Разве это не указатель на указатель на DNS_RECORD? Это означает, что вы должны инициализировать rr как POINTER(DNS_RECORD)() и передать его по ссылке: ctypes.byref(rr).

Обновление : Но я думаю, что проблема, которую вы видите, заключается в передаче server_arr: вы передаете структуру с первым полем, равным 0x00000001 вместо ссылки на эту структуру, поэтому код C пытается разыменоваться 1010 * поле и дает вам нарушение прав доступа. Эту же технику следует использовать и для server_arr.

...