我在Python中工作,试图创建一个简单的程序,对一个相当简单的USB设备进行读写。我遇到的问题是,由于PyWinUSB和PyUSB似乎没有我需要的东西(尝试写入设备会导致东西爆炸),我必须从头开始使用WinUSB和SetupAPI中的ctypes python模块和原始dll函数。
我已经能够得到关于如何定义传递给函数的结构的问题的答案,但我现在遇到的问题是,根据函数的规范...好吧,我就引用它吧。
"DeviceInterfaceData [out]
A pointer to a caller-allocated buffer that contains, on successful return, a
completed SP_DEVICE_INTERFACE_DATA structure that identifies an interface that meets
the search parameters. The caller must set DeviceInterfaceData.cbSize to
sizeof(SP_DEVICE_INTERFACE_DATA) before calling this function."如何将这些需求转换为Python?
我现在使用的structure类看起来像这样:
class _SP_DEVINFO_DATA(ctypes.Structure):
_fields_ = [("cbSize", wintypes.DWORD),
("ClassGuid", (ctypes.c_char * 16)),
("DevInst", wintypes.DWORD),
("Reserved", wintypes.LPVOID)]
def __init__(self, guid, inst):
self.cbSize = ctypes.sizeof(self)
self.ClassGuid = uuid.UUID(guid).get_bytes()
self.DevInst = (wintypes.DWORD)(inst)
self.Reserved = None
def __repr__(self):
return "_SP_DEV_INFO_DATA(cbsize={}, ClassGuid={}, DevInst={})".format(
self.cbSize, uuid.UUID(bytes=self.ClassGuid), hex(self.DevInst))根据之前一个问题的答案,我被告知。
谢谢。
发布于 2012-10-13 00:00:26
SetupDiEnumDeviceInfo返回SP_DEVINFO_DATA结构。SetupDiEnumDeviceInterfaces有一个不同的结构。在这两种情况下,您都要设计结构,仅初始化cbSize参数,并通过引用将其传递给函数:
示例(未经测试,仅从内存中输入):
class SP_DEVICE_INTERFACE_DATA(ctypes.Structure):
_fields_ = [('cbSize',wintypes.DWORD),
('InterfaceClassGuid',ctypes.c_char*16),
('Flags',wintypes.DWORD),
('Reserved',wintypes.LPVOID)]
def __init__(self):
self.cbSize = ctypes.sizeof(self)
PSP_DEVICE_INTERFACE_DATA = ctypes.POINTER(SP_DEVICE_INTERFACE_DATA)
i = 0
idata = SP_DEVICE_INTERFACE_DATA()
while True:
if not SetupDiEnumDeviceInterfaces(handle,None,guid,i,ctypes.byref(idata)):
break
<do something with idata>
i += 1https://stackoverflow.com/questions/12861619
复制相似问题