我正在为usb隐藏设备编写一个包装器,并希望使用hidapi。在写/学习的过程中得到了递归结构的指针。我如何从中获取数据?
我试图从contents
获取数据,但里面只有_field_
。
来自hidapi的C结构和C函数:
struct hid_device_info {
/** Platform-specific device path */
char *path;
/** Device Vendor ID */
unsigned short vendor_id;
/** Device Product ID */
unsigned short product_id;
/** Serial Number */
wchar_t *serial_number;
/** Device Release Number in binary-coded decimal,
also known as Device Version Number */
unsigned short release_number;
/** Manufacturer String */
wchar_t *manufacturer_string;
/** Product string */
wchar_t *product_string;
/** Usage Page for this Device/Interface
(Windows/Mac only). */
unsigned short usage_page;
/** Usage for this Device/Interface
(Windows/Mac only).*/
unsigned short usage;
/** The USB interface which this logical device
represents. Valid on both Linux implementations
in all cases, and valid on the Windows implementation
only if the device contains more than one interface. */
int interface_number;
/** Pointer to the next device */
struct hid_device_info *next;
};
struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id);
Python代码:
import ctypes
class HidDeviceInfo(ctypes.Structure):
pass
HidDeviceInfo._field_ = [
('path', ctypes.c_char_p),
('vendor_id', ctypes.c_ushort),
('product_id', ctypes.c_ushort),
('serial_number', ctypes.c_wchar_p),
('release_number', ctypes.c_ushort),
('manufacturer_string', ctypes.c_wchar_p),
('product_string', ctypes.c_wchar_p),
('usage_page', ctypes.c_ushort),
('usage', ctypes.c_ushort),
('interface_number', ctypes.c_int),
('next', ctypes.POINTER(HidDeviceInfo))
]
hid_api_dll = ctypes.CDLL("hidapi.dll")
def get_devs(vid, pid):
hid_enumerate = hid_api_dll.hid_enumerate
hid_api_dll.hid_enumerate.argtypes = [
ctypes.c_ushort,
ctypes.c_ushort
]
hid_api_dll.hid_enumerate.restype = ctypes.POINTER(HidDeviceInfo)
vid_t = ctypes.c_ushort(vid)
pid_t = ctypes.c_ushort(pid)
res = ctypes.POINTER(HidDeviceInfo)()
res = hid_enumerate(vid_t, pid_t)
return res
devs = get_devs(0x0, 0x0)
print(devs.contents)
frameInfo = devs.contents
print(frameInfo.path)
我试着从中得到path
属性并获得AttributeError: 'HidDeviceInfo' object has no attribute 'path'
。
必须有所有隐藏设备的递归列表。我如何检索数据?或者也许我做错了什么?
根据[Python 3]: Structures and unions(重点是我的):
结构和联合必须来源于Structure模块中定义的Union和ctypes基类。每个子类必须定义_fields_属性。 _fields_必须是2元组的列表,包含字段名称和字段类型。
将HidDeviceInfo._field_
替换为HidDeviceInfo._fields_
(复数),事情应该没问题。