[python-win32] Why does a python COM server return different data to VBA and Python clients?

Mark Hammond skippy.hammond at gmail.com
Fri Apr 13 04:07:54 CEST 2012

On 10/04/2012 3:40 AM, jeffwelch at earthlink.net wrote:
> My apologies to the list about my earlier question that was in html. My webmail is supposed to default to plain text but clearly did not.
> I am trying to write a Python server that will be used by a C++ client. It has taken me quite a while longer than I expected. I have been through the archives and that helped me get to where I am. Many thanks to all those who support these packages.
> I am using Python 2.5.1 as it is required by some vendor equipment that I must use.
> One of the reasons it took me a while to get this going was that I was trying to test it in Python. Once I switched to testing it in VBA then I made much faster progress.
> For demonstration purposes I used the Pippo test in the 'win32com\test' directory. I modified the testpippo.py by adding some code at the start of the testLeaks method. I added the 4 lines:
>          in1 = 15
>          inout1 = 99
>          hr= self.object.Method3( in1, inout1)
>          print hr, "retval = %d inout1 = %d"%(hr[0], hr[1])
 > The printed line was "(0, -31) retval = 0 inout1 = -31".

what is Method3 here?  The pippo tests don't have such a method.

But note that in Python, you generally don't see the "hresult" - so it 
would be more accurate to have it read something like:

          results = self.object.Method3( in1, inout1)

as Python doesn't have a concept of "byref" args, the "results" object 
is a tuple with the return value of the function, if any, plus any 
"byref" args created.  In the example above, I'm guessing the function 
has returned 0 and one byref arg was presented, with the new value being 

In the VB example below, VB does have byrefs, so the out args end up in 
the same argument they were passed in.

I can't explain why VB for -41 for the result when Python got zero 
though, but I also can't find the "method3" to help explain it.


> I get "retval = -41 inout1= -31"  if I execute the VBA code:
> Sub TestPippo()
>      Dim obj As Pippo
>      Dim in1 As Long
>      Dim inout1 As Long
>      Set obj = CreateObject("Python.Test.Pippo")
>      in1 = 1
>      inout1 = 2
>      retval = obj.Method3(in1, inout1)
>      MsgBox ("retval = " & retval & " inout1 = " & inout1)
> End Sub
> Is there a way to call the same Python Server Method, Method3, so that both Python and VBA receive the same return data?
> Regards,
> j
> _______________________________________________
> python-win32 mailing list
> python-win32 at python.org
> http://mail.python.org/mailman/listinfo/python-win32

More information about the python-win32 mailing list