Sandy Walsh wrote:
Hi,

I have a C++ COM Server with an IDL entry of:

[
   object,
   uuid(D989CB9A-0013-4E1A-BFB6-98A7946BD255),
   dual,
   helpstring("IFoo Interface"),
   pointer_default(unique)
]
interface IFoo : IDispatch
{
   [ id(1), helpstring("method Connect")]
HRESULT Connect([in] BSTR x, [in] short y, [in] BSTR z, [out, retval] long* error);
};

A call from Python to the C++ object works fine unless I return something other than S_OK for "error".

What does the C++ code look like?

self.assertEqual(0, self.control.Connect("10.0.0.0", "9999", ""))

That looks strange - your IDL says y is an integer, but you are passing a string.

The call failed with code 80020009: Exception occurred.
The source of the error is None
The error message is None
More info can be found in None (id=0)
Win32 exception occurred releasing IUnknown at 0x00e84c58

(where HR of 0x80020009 is DISP_E_EXCEPTION)

So something is returning DISP_E_EXCEPTION as the HRESULT for the method (which is quite different than having a dispatch "return value" (which is passed as a param to the C++ implementation) named error.

I've traced the python side of the code and how it appears to me is the "error" out variable is not being created in the argument list.

No - it is a return value: it comes back in the VARIANT holding the result. Note we are going via IDispatch, so something, presumably ATL, is converting the IDispatch::Invoke call into a native vtable based call into your implementation.

I'm not sending extended error messages on the C++ side, just setting this error code out variable.

How are you setting it exactly? And what do you mean by "sending extended error messages" - how would they be sent?

> I can only assume that the exception is
being generated in the MS Com libraries when it tries to marshal the error variable into a non-existent spot?

I don't think the COM libraries would throw that kind of exception.

Is it possible that your C++ implementation is returning the error code instead of setting it? Your C++ method should always return S_OK, but set "error" via a pointer passed to your function.

Cheers,

Mark

_______________________________________________
python-win32 mailing list
python-win32@python.org
http://mail.python.org/mailman/listinfo/python-win32

Reply via email to