COM: Passing arrays, SAFEARRAYs, and BSTRs in connection points

Robert soundhack at
Wed Mar 22 16:14:47 CET 2000

The short form of the question:
pythoncom seems to convert BSTR/unicode strings to normal python strings
automatically. Is there any way of recovering the original raw data?
I am sending raw chars that are converted to BSTRs through COM to
a python program. For example I am sending 'test' (4 bytes) in a
convert it to a bstr using BstrFromVector, then send it off to python, which
somehow converts it to a string '??' (2 bytes). Is there anyway of
retrieving the
original 4 bytes?

Now the long form:

I'm trying different ways of passing signed short (2 byte) data from a ATL
COM automation server to a python program through the connection point
interface (ie. the server
sends events back to python). After fussing (unsuccessfully) with straight
fixed arrays (MIDL statement: [id(1)] HRESULT Event(short array[10]);)
and SAFEARRAYs ( [id(2)] HRESULT Event2(SAFEARRAY(short) array); )
I found the BstrFromVector() function. Unfortunately, the data gets munged
somewhere between the BstrFromVector() function and the pythoncom event
Here are the two parts:
ATL side: (all error checking taken out)
 unsigned char *ptr;
 SafeArrayAccessData(psa,(void **)&ptr);
 ptr[0]='t';ptr[1]='e'; ptr[2]='s';ptr[3]='t';
 pAuto->Fire_Array(bstr); // pAuto is a atlcom object with connection points

python side: (only relevant stuff shown)
class EventHandler (CEHBase):
def OnArray(self,array):
  print "Got Array: ",len(array),array

which produces
Got Array: 2 ??

Any help much appreciated!

btw, using standard bstr functions (eg CComBSTR) to create bstr string works
fine, but
I need to be able to stuff arbitrary 8bit data.

More information about the Python-list mailing list