سؤال

ولدي مشكلة مع [DnsQuery] ( HTTP : //msdn.microsoft.com/en-us/library/ms682016 (VS.85) .aspx اتصال) API، و* ppQueryResultsSet المعلمة يزعجني. يمكن لأي شخص أن تبين لي مثالا على كيفية إجراء مكالمات 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؟ هذا يعني أن لديك لتهيئة ص ص كما POINTER(DNS_RECORD)() وتمريرها من قبل المرجع. ctypes.byref(rr)

على تحديث : في ولكن أعتقد أن المشكلة تراه هو من المرور server_arr: قمت بتمرير هيكل مع الحقل الأول يجري 0x00000001 بدلا من الإشارة إلى هذا الهيكل، لذلك يحاول C الرمز إلى الحقل AddrCount dereference ويعطي يمكنك الوصول إلى انتهاك. يجب استخدام نفس الأسلوب لserver_arr جدا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top