Re: Retrieving BSTR * from a DLL

2008-07-10 Thread Andrew MacIntyre

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: [EMAIL PROTECTED]  (pref) | Snail: PO Box 370
   [EMAIL PROTECTED] (alt) |Belconnen ACT 2616
Web:http://www.andymac.org/   |Australia
--
http://mail.python.org/mailman/listinfo/python-list


Re: Retrieving BSTR * from a DLL

2008-07-10 Thread mzdude
On Jul 10, 6:15 am, Andrew MacIntyre [EMAIL PROTECTED]
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.
--
http://mail.python.org/mailman/listinfo/python-list