ctypes в python, проблема с вызовом функции в DLL - PullRequest
0 голосов
/ 15 июня 2009

Эй! как вы могли заметить, у меня раздражающая проблема с ctypes. Я пытаюсь связаться с инструментом и для этого мне нужно использовать ctypes для связи с драйвером 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-библиотека тюнера должна быть сохранена в 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 [], согласно руководству приведенные ниже значения также верны, я просто не знаю, почему я получаю нарушение доступа к Windows, записывающее 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))

Серийный номер дается, однако, подвергается цензуре путем ссылки на переменную. Кто-то знает, что делать? Видите ли вы какие-либо ошибки с моим вводом?

Спасибо / Маздак

1 Ответ

3 голосов
/ 15 июня 2009

Я полагаю, что это значение, которое вы передаете в аргументе long max_range[]. Функция ожидает указатель на целое число long (она запрашивает массив long целых чисел), но вы передаете длинное значение с нулем (результат вызова c_long()) , который неявно приведен к нулевому указателю. Я подозреваю, что функция затем пытается написать по адресу, переданному в max_range, т.е. нулевой указатель, следовательно, нарушение прав доступа по адресу 0x00000000.

Чтобы создать массив из long s для передачи max_range, вы сначала создаете тип массива, умножая тип данных массива на размер массива (несколько более подробно для ясности):

array_size = 3
ThreeLongsArrayType = c_long * array_size

Затем вы можете создать экземпляр массива, как и в любом другом классе Python:

array = ThreeLongsArrayType()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...