eryk sun at 2015/12/18 UTC+8 6:26:02PM wrote:
> The function's calling convention is x86 cdecl (CDLL, caller stack
> cleanup), but you're using the x86 stdcall convention (WinDLL, callee
> stack cleanup). For a 64-bit process they're actually the same, but
> you're using 32-bit Python, so you have to pay attention to the
> convention.
>
> > _lib = windll.LoadLibrary("C:\\Windows\\System32\\libusb0.dll")
>
> It should simply be
>
> _lib = CDLL('libusb0')
>
> windll/WinDLL is the wrong calling convention. Everything else is just
> a waste of keystrokes. windll.LoadLibrary is an inferior way to call
> WinDLL, since it can't pass constructor arguments such as use_errno or
> use_last_error. The System32 directory is on the DLL search path, and
> Windows will add the .dll extension for you.
>
> The calling convention is declared in the header file lusb0_usb.h [1].
> For example:
>
> struct usb_bus *usb_get_busses(void);
>
> Notice there's no mention of __stdcall there, so it's using the
> default cdecl convention.
Hi! eryk, thank you very much. No idea how long I will take to get out of this
gutter if not have your hint. I should pay more attention on keyword __stdcall
in the header file.
> > _usb_dev_handle = c_void_p
>
> You'll be better off using
>
> class _usb_dev_handle(Structure):
> pass
>
> _usb_dev_handle_p = POINTER(_usb_dev_handle)
>
> This provides stronger type safety. c_void_p is too permissive. It's
> easier to debug a ctypes ArgumentError than a memory access violation
> or data corruption.
>
> [1]:
> http://sourceforge.net/p/libusb-win32/code/413/tree/trunk/libusb/src/lusb0_usb.h
I think I am still in the kindergarten, not enter the gate of python school
yet:-( much things to learn.
--
https://mail.python.org/mailman/listinfo/python-list