首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该将什么作为最后一个值传递给函数SetupAPI.DLL.SetupDiEnumDeviceInterfaces()?

我应该将什么作为最后一个值传递给函数SetupAPI.DLL.SetupDiEnumDeviceInterfaces()?
EN

Stack Overflow用户
提问于 2012-10-12 22:49:09
回答 1查看 566关注 0票数 0

我在Python中工作,试图创建一个简单的程序,对一个相当简单的USB设备进行读写。我遇到的问题是,由于PyWinUSB和PyUSB似乎没有我需要的东西(尝试写入设备会导致东西爆炸),我必须从头开始使用WinUSB和SetupAPI中的ctypes python模块和原始dll函数。

我已经能够得到关于如何定义传递给函数的结构的问题的答案,但我现在遇到的问题是,根据函数的规范...好吧,我就引用它吧。

代码语言:javascript
复制
"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类看起来像这样:

代码语言:javascript
复制
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))

根据之前一个问题的答案,我被告知。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2012-10-13 00:00:26

SetupDiEnumDeviceInfo返回SP_DEVINFO_DATA结构。SetupDiEnumDeviceInterfaces有一个不同的结构。在这两种情况下,您都要设计结构,仅初始化cbSize参数,并通过引用将其传递给函数:

示例(未经测试,仅从内存中输入):

代码语言:javascript
复制
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 += 1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12861619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档