Взаимодействие с AURA_SDK.dll через python с использованием ctypes

Я пытаюсь управлять цветами светодиодов клавиатуры ASUS ROG Flare с помощью python. Я скачал комплект разработчика программного обеспечения Aura с веб-сайта ASUS. ссылка здесь: https://www.asus.com/campaign/aura/us/SDK.php внутри комплекта есть руководство по меню и файл dll с именем AURA_SDK.dll. В руководстве сказано, что с помощью упомянутой dll клавиатурой можно управлять.

Я использую пакет ctypes python и мне удалось загрузить пакет, но когда я вызываю первую функцию для получения управления на клавиатуре, программа дает сбой, потому что я не полностью понимаю аргумент, который функция должна запустить.

Документация из руководства: введите здесь описание изображения

Код, который я пытаюсь:

import ctypes
path_dll = 'AURA_SDK.dll'
dll = ctypes.cdll.LoadLibrary(path_dll)
res = dll.CreateClaymoreKeyboard() # fails here

Любые идеи о том, как создать этот аргумент?

Заранее спасибо.


person Aviv Amsellem    schedule 22.12.2020    source источник


Ответы (1)


Это должно сделать это. У вас есть хорошая привычка всегда определять .argtypes и .restype для вызываемых вами функций. Это обеспечит правильное преобразование параметров между типами Python и C, а также улучшит проверку ошибок, чтобы помочь поймать что-то неправильное.

В wintypes также есть много предопределенных типов Windows, поэтому вам не нужно гадать, какой ctype-type использовать для параметра.

Также обратите внимание, что WINAPI определяется как соглашение о вызовах __stdcall и для загрузки DLL следует использовать WinDLL вместо CDLL. В 64-битных системах нет разницы между стандартным соглашением о вызовах C (__cdecl) и __stdcall, но это имеет значение, если вы используете 32-битный Python или хотите переносимости на 32-битный Python.

import ctypes as ct
from ctypes import wintypes as w

dll = ct.WinDLL('./AURA_SDK')  # Use WinDLL for WINAPI calls.
dll.CreateClaymoreKeyboard.argtypes = ct.POINTER(ct.c_void_p), # tuple of arguments
dll.CreateClaymoreKeyboard.restype = w.DWORD

handle = ct.c_void_p()  # Make an instance to pass by reference and receive the handle.
res = dll.CreateClaymoreKeyboard(ct.byref(handle))
# res is non-zero on success
person Mark Tolonen    schedule 22.12.2020