[python-win32] win32com calling C++ COM interface

Shad Muegge shad.muegge at gmail.com
Mon Oct 24 22:40:05 CEST 2005


With a lot of help from Mark Hammond we discovered the problems

1) the parameter type in the COM definition .py file was incorrect
2) the code shouldn't have been converting the parameter to a buffer object

The type of "indexlist" in the COM definition .py file.

def Read(self, x=defaultNamedNotOptArg, indexlist=defaultNamedNotOptArg,
results=pythoncom.Missing): """method Read"""
return self._ApplyTypes_(2, 1, (24, 0), ((3, 1), (16396, 1), (16396,
2)),'Read', None,x, indexlist, results)

16396 - VT_VARIANT, VT_BYREF

which matches exactly the type in the IDL file

...VARIANT* indexlist,...

so makepy worked as expected. The problem is that the interface expected a
single variant containing a safearray of integers, so a more proper IDL file
might look like this

...SAFEARRAY(int) indexlist,...

I update the .py file with the correct type.

(0x2000 | 19) - VT_ARRAY, VT_IU4

Also, the python code was converting the parameter to a buffer object

addr = buffer(array.array ('L', addr)) // bad

which wasn't correct because this is a special case for the win32com code.
All buffer objects are converted to safe arrays of bytes.

I removed that line and code.

After these two changes the code worked.

On 10/19/05, bob <bgailer at alum.rpi.edu> wrote:
>
> At 01:22 PM 10/19/2005, Shad Muegge wrote:
> >Hi,
> >
> >I've just started looking at Python. I am trying to resolve an issue a
> >user is having trying to access the COM interface in our application from
>
> >Python.
> >
> >C++ code:
> >
> >STDMETHODIMP
> >CMyClass::Read(
> > const int x,
> > VARIANT *indexlist, // IN: "safe" array of 4-byte integers
> > VARIANT *results)
> >
> >
> >Python code:
> >
> > def read(self, x, addr):
> > try:
> > addr = buffer(array.array ('L', addr))
> > data = self.__Api.Read(x, addr)
> >...
> >
> >x.read(0, 0x12345678)
> >
> >The variant that shows up on the C++ code is a safearray of 1-byte
> >integers with 4 elements: 12, 34, 56, 78.
> >
> >The API treats them each as individual "addresses"...
> >
> >Here's the COM definition from the .py file.
> >
> > def Read(self, x=defaultNamedNotOptArg, indexlist=defaultNamedNotOptArg,
>
> > results=pythoncom.Missing):
> > """method Read"""
> > return self._ApplyTypes_(2, 1, (24, 0), ((3, 1), (16396, 1), (16396,
> > 2)), 'Read', None,x
> > , indexlist, results)
> >
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.python.org/pipermail/python-win32/attachments/20051024/e8886533/attachment.htm


More information about the Python-win32 mailing list