By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
449,370 Members | 1,552 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 449,370 IT Pros & Developers. It's quick & easy.

Retrieving BSTR * from a DLL

P: n/a
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

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'

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)

Any feedback would be appreciated.
Jul 9 '08 #1
Share this Question
Share on Google+
2 Replies


P: n/a
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: an*****@bullseye.apana.org.au (pref) | Snail: PO Box 370
an*****@pcug.org.au (alt) | Belconnen ACT 2616
Web: http://www.andymac.org/ | Australia
Jul 10 '08 #2

P: n/a
On Jul 10, 6:15*am, Andrew MacIntyre <andy...@bullseye.apana.org.au>
wrote:
<snip>
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.
using cdll got me over the calling hurdle. However, I'm not seeing the
returned BSTR.
You might like to join the ctypes-users mailing list at sourceforge.
I did, thanks.
Jul 10 '08 #3

This discussion thread is closed

Replies have been disabled for this discussion.