Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #100595

Re: Problem on ctypes arguments in a DLL function

Path csiph.com!fu-berlin.de!uni-berlin.de!not-for-mail
From eryk sun <eryksun@gmail.com>
Newsgroups comp.lang.python
Subject Re: Problem on ctypes arguments in a DLL function
Date Fri, 18 Dec 2015 04:24:51 -0600
Lines 43
Message-ID <mailman.52.1450434339.30845.python-list@python.org> (permalink)
References <2331461b-cf4c-479c-8380-ddea3b7e7878@googlegroups.com>
Mime-Version 1.0
Content-Type text/plain; charset=UTF-8
X-Trace news.uni-berlin.de 9KjrNFDrkn3zMMS1lOZN2QD361ExD7ntdoopoZivoAlQ==
Return-Path <eryksun@gmail.com>
X-Original-To python-list@python.org
Delivered-To python-list@mail.python.org
X-Spam-Status OK 0.000
X-Spam-Evidence '*H*': 1.00; '*S*': 0.00; 'python,': 0.02; 'url:sourceforge': 0.03; 'debug': 0.04; 'caller': 0.07; 'constructor': 0.07; 'convention.': 0.07; 'valueerror:': 0.07; 'x86': 0.07; '[1]:': 0.09; 'subject:ctypes': 0.09; 'example:': 0.10; 'stack': 0.13; '.dll': 0.16; '[1].': 0.16; 'callee': 0.16; 'cdecl': 0.16; 'received:io': 0.16; 'received:psf.io': 0.16; 'stdcall': 0.16; 'subject:Problem': 0.16; 'wrote:': 0.16; 'memory': 0.17; 'bytes': 0.18; 'windows': 0.20; '2015': 0.20; 'cc:2**0': 0.20; 'extension': 0.20; '64-bit': 0.22; 'arguments': 0.22; 'ctypes': 0.22; 'struct': 0.22; 'pass': 0.22; 'cc:no real name:2**0': 0.22; 'am,': 0.23; 'dec': 0.23; 'header:In-Reply- To:1': 0.24; 'header': 0.24; 'skip:_ 20': 0.26; 'fri,': 0.27; 'message-id:@mail.gmail.com': 0.27; 'dll': 0.27; '32-bit': 0.29; 'declared': 0.29; 'path,': 0.29; 'convention': 0.30; 'mention': 0.30; 'waste': 0.30; 'probably': 0.31; "can't": 0.32; 'skip:_ 10': 0.32; 'class': 0.33; 'url:code': 0.34; 'file': 0.34; 'add': 0.34; 'received:google.com': 0.35; 'skip:* 20': 0.35; 'but': 0.36; 'too': 0.36; 'should': 0.36; 'received:209.85': 0.36; 'to:addr :python-list': 0.36; 'subject:: ': 0.37; 'there,': 0.37; 'received:209.85.213': 0.37; 'received:209': 0.38; 'wrong': 0.38; 'skip:p 20': 0.38; 'data': 0.39; 'to:addr:python.org': 0.40; 'called': 0.40; "you'll": 0.61; 'skip:u 10': 0.61; 'default': 0.61; 'you.': 0.64; "they're": 0.66; 'attention': 0.76; 'safety.': 0.84; 'stronger': 0.84; 'same,': 0.91
DKIM-Signature v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type; bh=sP4z6xzwPSxmLutY2kURCkGBD/3E4ZLeJ5UoAt5b1rY=; b=JfNDkh/LBQek1wyZTMAn6GXV+GtefjskI/dwD5THyfNBJFMnAYLwXYHAIUN3yGpzSH ARzz7NIAsVW1UZEyX5o13MPmrLAsyKawnf3a+zMGtd5OZsbYz1BoAZmRTqJSE/rxrQqu eisvJV/mk00tF69m7wi0i2XcazjiFnmWBvtJ9D2K5jVcqIEMmDhpRl2ayZGCRpkuyadL masHtTh76WBei+nWH0b5x/jlIaVM0vKVZdGjuJXGcrNWFQvLck4wQBM/iIDY0xFLzlLG rgeoatX4w+pqh6CRqPZ2498UwZ97w4ysUXxxODoNbldQSWAt5hDT1GVS97q+6QLVrCN+ d/6g==
X-Received by 10.50.164.131 with SMTP id yq3mr1994185igb.74.1450434331456; Fri, 18 Dec 2015 02:25:31 -0800 (PST)
In-Reply-To <2331461b-cf4c-479c-8380-ddea3b7e7878@googlegroups.com>
X-BeenThere python-list@python.org
X-Mailman-Version 2.1.20+
Precedence list
List-Id General discussion list for the Python programming language <python-list.python.org>
List-Unsubscribe <https://mail.python.org/mailman/options/python-list>, <mailto:python-list-request@python.org?subject=unsubscribe>
List-Archive <http://mail.python.org/pipermail/python-list/>
List-Post <mailto:python-list@python.org>
List-Help <mailto:python-list-request@python.org?subject=help>
List-Subscribe <https://mail.python.org/mailman/listinfo/python-list>, <mailto:python-list-request@python.org?subject=subscribe>
Xref csiph.com comp.lang.python:100595

Show key headers only | View raw


On Fri, Dec 18, 2015 at 2:41 AM,  <jfong@ms4.hinet.net> wrote:
> ValueError: Procedure probably called with too many arguments (4 bytes in excess

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.

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

Back to comp.lang.python | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

Problem on ctypes arguments in a DLL function jfong@ms4.hinet.net - 2015-12-18 00:41 -0800
  Re: Problem on ctypes arguments in a DLL function eryk sun <eryksun@gmail.com> - 2015-12-18 04:24 -0600
    Re: Problem on ctypes arguments in a DLL function jfong@ms4.hinet.net - 2015-12-18 03:15 -0800

csiph-web