首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python windll.SetupDiEnumDeviceInterfaces通过错误代码6

Python windll.SetupDiEnumDeviceInterfaces通过错误代码6
EN

Stack Overflow用户
提问于 2022-07-15 23:50:15
回答 1查看 42关注 0票数 0

我一直在将工作在python中的Tcl代码翻译成python,所以我知道GUID十六进制值是正确的。只是不知道为什么WinError()要抛出代码:6,因为winapi.SetupDiEnumDeviceInterfaces返回0。

代码语言:javascript
复制
from ctypes import *
from ctypes import wintypes
import win32file
 
DIGCF_DEVICEINTERFACE          = 0x00000010
DIGCF_PRESENT                  = 0x00000002
FILE_FLAG_OVERLAPPED           = 0x40000000
FILE_SHARE_READ                = 0x00000001
FILE_SHARE_WRITE               = 0x00000002
FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100
FORMAT_MESSAGE_FROM_SYSTEM     = 0x00001000
GENERIC_READ                   = 0x80000000
GENERIC_WRITE                  = 0x40000000
OPEN_EXISTING                  = 3
WAIT_TIMEOUT                   = 0x00000102
INVALID_HANDLE_VALUE           = -1
 
winapi = windll.setupapi
 
 
class GUID(Structure):
    _fields_ = [
        ('Data1', c_ulong),
        ('Data2', c_ushort),
        ('Data3', c_ushort),
        ('Data4', c_ubyte*8),
    ]
    def __str__(self):
        return "{%08x-%04x-%04x-%s-%s}" % (
            self.Data1,
            self.Data2,
            self.Data3,
            ''.join(["%02x" % d for d in self.Data4[:2]]),
            ''.join(["%02x" % d for d in self.Data4[2:]]),
        )
 
 
class SP_DEVICE_INTERFACE_DATA(Structure):
    _fields_ = [
        ('cbSize', wintypes.DWORD),
        ('InterfaceClassGuid', GUID),
        ('Flags', wintypes.DWORD),
        ('Reserved', POINTER(c_ulong)),
    ]
    def __str__(self):
        self.cbSize = sizeof(self)
        return "InterfaceClassGuid:%s Flags:%s" % (self.InterfaceClassGuid, self.Flags)
 
 
GUID_SPWR_BASE_INTERFACE = GUID(0xa480c318, 0xfd41, 0x4973,
    (c_ubyte*8)(0xa5,0x4a, 0xa8, 0x24, 0x93, 0x11, 0xc7, 0x71))
GUID_SPWR_CHAN_INTERFACE = GUID(0xe1eda58b, 0xf16c, 0x4489, (c_ubyte * 8)(0xa4,0xe9, 0xb4, 0xaa, 0x4f, 0x12, 0xb1, 0x6b))
 
 
hDevInfo = winapi.SetupDiGetClassDevsA(byref(GUID_SPWR_BASE_INTERFACE), None, 0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE)
 
print(hDevInfo)
 
for index in range(256):
    interfaceData = SP_DEVICE_INTERFACE_DATA()
    if not winapi.SetupDiEnumDeviceInterfaces(hDevInfo, None, byref(GUID_SPWR_BASE_INTERFACE), index, byref(interfaceData)):
        if GetLastError() != 0:
            raise WinError()

然后抛出代码:

OSError: WinError 6句柄无效。

EN

回答 1

Stack Overflow用户

发布于 2022-08-23 12:03:40

您的代码应该在32位系统上工作,而不是在x64上工作,因为默认情况下,python库将指针转换为32位整数。因此,您需要重新定义函数原型,以显式要求python将它们转换为64位。

下面是一个有用的示例(在SP_DEVICE_INTERFACE_DATA定义之后添加)

代码语言:javascript
复制
SetupDiGetClassDevs = windll.setupapi.SetupDiGetClassDevsA
SetupDiGetClassDevs.argtypes = [POINTER(GUID), c_char_p, c_void_p, wintypes.DWORD]
SetupDiGetClassDevs.restype = c_void_p

SetupDiEnumDeviceInterfaces = windll.setupapi.SetupDiEnumDeviceInterfaces
SetupDiEnumDeviceInterfaces.argtypes = [c_void_p, c_void_p, POINTER(GUID), wintypes.DWORD, POINTER(SP_DEVICE_INTERFACE_DATA)]
SetupDiEnumDeviceInterfaces.restype = c_int
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73000555

复制
相关文章

相似问题

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