Ошибка при использовании C SDK в Python

Я пытаюсь использовать SDK с Python. У меня в SPK несколько файлов dll. Мой сценарий:

import ctypes    
import os

malib = ctypes.WinDLL(os.path.join('D:\Downloads\Aura API\sdk\AURA_SDK.dll'))    
print(malib.GetClaymoreKeyboardLedCount(1)) #function in the dll

Я получаю сообщение об ошибке:

WindowsError: exception: access violation reading 0x00000005

Я могу использовать некоторые функции нормально, но с другими у меня возникает эта проблема. Также в SDK есть разные библиотеки DLL, и я думаю, что проблема может возникнуть из-за связи между этими dll (я открываю только одну из этих dll в скрипте) также потому, что функция не работает, похоже, использует другую dll или / и связь с компьютер.

Спасибо, если у вас есть советы

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

abarnert 25.03.2018 21:01

При этом есть большая вероятность, что этот является дублирует чей-то вопрос, который я еще не нашел, поэтому он все равно может закрываться - но в этом случае он будет закрыт ссылкой на ответ, который работает. для вас и объясняет проблему, что даже лучше, чем получить ответ.

abarnert 25.03.2018 21:02

Мне очень жаль, что я начал здесь, спасибо (конечно, кто-то дал мне сообщение, которое я не нашел с awnser, это так же помогает)

R.Reus 25.03.2018 21:17
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
61
1

Ответы 1

Вы не установили argtypes и restype для функций, которые вы вызываете.

Это означает, что вместо того, чтобы знать, в какие типы C преобразовывать ваши аргументы, ctypes должен угадывать, основываясь на типах Python, которые вы ему передаете. Если он ошибается, вы либо передадите мусор, либо, что еще хуже, испортите стек, что приведет к нарушению доступа.

Например, представьте себе эту функцию C:

void func(int64_t n, char *s);

Если вы сделаете это:

lib = # however you load the library
lib.func(2, 'abc')

… Затем ctypes, он преобразует этот 2 в 32-битное int, а не в 64-битное. Если вы используете 32-битный Python и DLL, это означает, что n получит 2 и указатель на 'abc', втиснутые в одно бессмысленное число, а s будет неинициализированным указателем на какое-то произвольное место в памяти, которое, если вам повезет, не будет ни на что сопоставляться и вызовет нарушение прав доступа.

Но если вы сначала сделаете это:

lib = # however you load the library
lib.func.argtypes = [ctypes.c_int64, ctypes.c_char_p]
lib.func.restype = None
lib.func(2, 'abc')

… Тогда ctypes преобразует 2 в 64-битное int, поэтому n получит 2, а s получит 'abc', и все будут счастливы.

Вы должны быть правы, спасибо. Я думал, что управлять C через Python будет проще, я просто сдамся, я ничего не знаю о C, и мне кажется, что я не могу использовать функции этого SDK без этих знаний.

R.Reus 26.03.2018 00:08

@ R.Reus Вы можете попробовать использовать cffi вместо ctypes. Кривая обучения для действительно тривиальных вещей немного выше, но для таких вещей средней сложности это часто проще. Или swig может автоматически сгенерировать привязки для вас, но если у него возникнут какие-либо проблемы, для их решения потребуется знание оба C и собственного забавного мини-языка swig, так что ...

abarnert 26.03.2018 00:18

Другие вопросы по теме