0

我正在尝试使用 python 控制我的 ASUS ROG Flare 键盘 LED 颜色。我从华硕网站下载了 Aura Software Developer Kit。链接在这里:https : //www.asus.com/campaign/aura/us/SDK.php 套件内有一个菜单指南和一个名为 AURA_SDK.dll 的 dll 文件。该指南说,使用提到的 dll 可以控制键盘。

我正在使用 ctypes python 包并成功加载包,但是当我调用第一个函数以获取键盘控制时,程序失败,因为我不完全理解函数需要运行的参数。

指南中的文档: 在此处输入图像描述

我正在尝试的代码:

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

关于如何创建这个论点的任何想法?

提前致谢。

4

1 回答 1

0

这应该这样做。养成的一个好习惯总是为你调用的函数定义.argtypes和定义.restype。这将确保参数在 Python 和 C 类型之间正确转换,并提供更好的错误检查以帮助发现不正确的操作。

还有许多预定义的 Windows 类型,wintypes因此您不必猜测参数使用什么 ctype-type。

另请注意,它WINAPI被定义为__stdcall调用约定,应使用WinDLL而不是CDLL用于加载 DLL。在 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
于 2020-12-22T21:58:31.583 回答