Я пытаюсь использовать 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 или / и связь с компьютер.
Спасибо, если у вас есть советы
При этом есть большая вероятность, что этот является дублирует чей-то вопрос, который я еще не нашел, поэтому он все равно может закрываться - но в этом случае он будет закрыт ссылкой на ответ, который работает. для вас и объясняет проблему, что даже лучше, чем получить ответ.
Мне очень жаль, что я начал здесь, спасибо (конечно, кто-то дал мне сообщение, которое я не нашел с awnser, это так же помогает)






Вы не установили 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 Вы можете попробовать использовать cffi вместо ctypes. Кривая обучения для действительно тривиальных вещей немного выше, но для таких вещей средней сложности это часто проще. Или swig может автоматически сгенерировать привязки для вас, но если у него возникнут какие-либо проблемы, для их решения потребуется знание оба C и собственного забавного мини-языка swig, так что ...
Кстати, это совершенно хороший вопрос в качестве отдельного продолжения вашего предыдущего вопроса, но вы должны где-нибудь упомянуть, что это продолжение со ссылкой. В противном случае люди могут смутно вспомнить, что видели ваш предыдущий вопрос вчера, и предположить, что это дубликат, а не новый вопрос, и вы можете получить отрицательные или закрытые голоса, которых вы не заслуживаете.