[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