【发布时间】: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