Retrieving BSTR * from a DLL

Andrew MacIntyre andymac at bullseye.apana.org.au
Thu Jul 10 06:15:11 EDT 2008


mzdude wrote:
> I need to interface with a windows DLL that has the following
> signature
> 
> extern "C" void Foo( BSTR in, BSTR *out )
> 
> Code so far
> 
>>>> from ctypes import *
>>>> import comtypes
>>>> LPBSTR = POINTER(comtypes.BSTR)
>>>>
>>>> hdl = windll.MyDll.Foo
>>>> hdl.rettype = None
>>>> hdl.argtypes = [comtypes.BSTR, LPBSTR]
>>>>
>>>> inStr = comtypes.BSTR(u'Some Silly String')
>>>> out = comtypes.BSTR

      out = comtypes.BSTR()

>>>> hdl(inStr,byref(out))
> 
> Traceback (most recent call last):
>   File "<pyshell#14>", line 1, in <module>
>     hdl(inStr,byref(out))
> TypeError: byref() argument must be a ctypes instance, not
> '_ctypes.SimpleType'

comtypes.BSTR is a type; the type error makes clear you need
an instance, as above.

> Also tried the following
> 
>>>> out = comtypes.BSTR(u'')
>>>> p = pointer(out)
>>>> hdl(inStr,p)
> 
> Traceback (most recent call last):
>   File "<pyshell#19>", line 1, in <module>
>     hdl(inStr,p)
> ValueError: Procedure probably called with too many arguments (8 bytes
> in excess)

This likely indicates that the DLL is using the C calling convention
and not the stdcall calling convention.  Use CDLL rather than WinDLL
to load the DLL.

You might like to join the ctypes-users mailing list at sourceforge.

-- 
-------------------------------------------------------------------------
Andrew I MacIntyre                     "These thoughts are mine alone..."
E-mail: andymac at bullseye.apana.org.au  (pref) | Snail: PO Box 370
        andymac at pcug.org.au             (alt) |        Belconnen ACT 2616
Web:    http://www.andymac.org/               |        Australia



More information about the Python-list mailing list