【问题标题】:Python windll.SetupDiEnumDeviceInterfaces throughs error code 6Python windll.SetupDiEnumDeviceInterfaces throughs 错误代码6
【发布时间】:2022-08-23 20:03:40
【问题描述】:

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

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] 句柄无效。

    标签: python


    【解决方案1】:

    您的代码应该可以在 32 位系统上运行,但不能在 x64 上运行, 因为默认情况下,python 库将指针转换为 32 位整数。 因此,您需要重新定义函数原型,以明确要求 python 将它们转换为 64 位。

    这是一个工作示例(在 SP_DEVICE_INTERFACE_DATA 定义之后添加)

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多