سؤال

يا! كما قد لاحظت أن لدي مشكلة مزعجة مع ctypes. أحاول التواصل مع أداة وأن أفعل ذلك، يجب عليك استخدام CTTYPES للتواصل مع برنامج تشغيل DLL.

حتى الآن تمكنت من تصدير DLL عن طريق القيام بذلك:

>>> from ctypes import *
>>>maury = WinDLL( 'MLibTuners')
>>> maury
(WinDLL 'MlibTuners', handle 10000000 at 9ef9d0)
>>> maury.get_tuner_driver_version()
(_FuncPtr object at 0x009F6738)
>>> version_string = create_string_buffer(80)
>>> maury.get_tuner_driver_version(version_string)
2258920
>>> print version_string.value
'Maury Microwave MT993V04 Tuner Driver DLL, Version 1.60.00, 07/25/2007'

ويعمل بشكل جيد، وفقا للوثائق من المفترض أن ينقذ DLL DLL DLL في سلسلة 80 بايت كمعلمة. ومع ذلك، عندما أحاول استخدام الوظيفة التي تسمى add_tuner. فشل. هذا هو ما تقول الوثائق:

short add_tuner(short tuner_number, char model[], short serial_number,
               short ctlr_num, short ctlr_port, short *no_of_motors, long max_range[],
               double *fmin, double *fmax, double *fcrossover, char error_string[])

هذه هي الطريقة التي حاولت استدعاء الوظيفة أعلاه: المعلمات التي تم تغييرها جميع المؤشرات و max_range [] وفقا للدليل أن القيم أدناه صحيحة أيضا، أنا فقط لا أعرف لماذا أظل الحصول على ويندوز وصول انتهاك الكتابة 0x00000000

no_motors = pointer(c_short())
f_min = pointer(c_double())
f_max = pointer(c_double())
f_crossover = pointer(c_double())
maury.add_tuner(c_short(0), c_char_p('MT982EU'), c_short(serial_number), c_short(0),
                                c_short(1),no_motors, c_long(),
f_min,f_max,f_crossover, create_string_buffer(80))

يتعين إعطاء الرقم التسلسلي للرقابة عن طريق الرجوع إلى متغير. شخص يعرف ماذا تفعل؟، هل ترى أي أخطاء مع مدخلاتي؟

شكرا / mazdak.

هل كانت مفيدة؟

المحلول

أنا الرقم انها القيمة التي تمر عندها long max_range[] جدال. الوظيفة تتوقع مؤشر إلى long عدد صحيح هناك (يسأل عن مجموعة من long أعداد صحيحة)، لكنك تمر طويلا القيمة من الصفر (نتيجة c_long() دعوة)، والتي يلقي ضمنا إلى مؤشر فارغة. أظن أن الوظيفة تحاول الكتابة إلى العنوان الذي تم تمريره max_range, ، بمعنى آخر. المؤشر الفارغ، وبالتالي انتهاك الوصول في العنوان 0x00000000.

لإنشاء مجموعة من longS لتمرير max_range, ، يمكنك أولا إنشاء نوع الصفيف بضرب نوع بيانات الصفيف بحجم الصفيف (حرف واحد إلى حد ما عن الوضوح):

array_size = 3
ThreeLongsArrayType = c_long * array_size

يمكنك ذلك إذن إنشاء مجموعة مثلك مع أي فئة Python الأخرى:

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