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