2012-10-12 2 views
0

필자는 Python을 사용하여 상당히 간단한 USB 장치에서 읽고 쓰는 간단한 프로그램을 만들려고 노력하고 있습니다. 내가 가지고있는 문제는 PyWinUSB와 PyUSB가 필요로하는 것 (장치에 쓰기를 시도하는 것)이 없어 보이기 때문에, 나는 ctypes 파이썬 모듈과 원시 dll 함수를 사용하여 처음부터 작업해야한다. WinUSB 및 SetupAPI.SetupAPI.DLL.SetupDiEnumDeviceInterfaces() 함수에 마지막 값으로 전달할 대상은 무엇입니까?

저는 함수에 전달하는 구조체를 정의하는 방법에 대한 제 질문에 대한 답변을 얻을 수 있었지만 지금 가지고있는 문제는 함수의 사양에 따라 ... 글쎄, 나는 단지 그것을 인용 할 것이다.

"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." 

어떻게 이러한 요구 사항을 파이썬으로 변환합니까? 내가 이전 질문에 대한 답변으로 통보 있었는지에 따르면

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)) 

:

내가 지금 함께 일하고 있어요 구조 클래스는 다음과 같습니다.

감사합니다.

답변

0

구조는 이고,SetupDiEnumDeviceInfo이다. 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 += 1 
+0

않을까요 아니라면 SetupDIEnumDeviceInterfaces을() 함수가 실패했을 때 0을 반환하면 True가됩니까? 내가 [이] (http://pastebin.com/ygcUWWPM)을 실행 해 보았는데, 내가 정의한 객체에 아무 것도 나타나지 않아 키보드가 중단되기 전에 1000 번 이상 반복되었다. 다시 한 번 감사드립니다. – Will

+0

코드를 볼 수 없습니다. 그것은 그것이 개인적인 풀이었다고 말했다. 예, 함수가 실패하면 if가 true이고 루프에서 벗어납니다. 색인을 증가시키는 것을 잊었습니까? –

+0

죄송합니다. 다시 한번 살펴보십시오. 색인을 증가시키는 것을 기억했지만 문제는 매번 함수가 실패한다는 것입니다. – Will

관련 문제