P
Philip Rittenhouse
I have one last issue with pywin32 to report. The problem occurs with
Python COM servers raising COM exceptions across a custom interface.
Using the dispatch interface works fine, but in the custom interface
the exception's error information is lost. The problem appears to be
in PyGatewayBase::InterfaceSupportsErrorInfo() in PyGatewayBase.cpp. It
is called to determine whether the GetErrorInfo API should be used to
extract an error after an error HRESULT is returned from an interface.
The function is passed an IID of an interface, the code compares this to
the return value of GetIID() which is always IID_IUnknown. The
comparison fails, so the function returns S_FALSE and no error info is
extracted.
The comment above the definition of GetIID() says:
// Currently this is used only for ISupportErrorInfo,
// so hopefully this will never be called in this base class.
// (however, this is not a rule, so we wont assert or anything!)
But it appears that it is called in the base class (or at least
not overloaded by anyone inheriting from it).
Everything seems to work fine if you just change
InterfaceSupportsErrorInfo() to always return S_OK.
Can anyone tell me how this code is meant to work? Why is the check
against GetIID() in there at all?
Thanks!
Phil
Python COM servers raising COM exceptions across a custom interface.
Using the dispatch interface works fine, but in the custom interface
the exception's error information is lost. The problem appears to be
in PyGatewayBase::InterfaceSupportsErrorInfo() in PyGatewayBase.cpp. It
is called to determine whether the GetErrorInfo API should be used to
extract an error after an error HRESULT is returned from an interface.
The function is passed an IID of an interface, the code compares this to
the return value of GetIID() which is always IID_IUnknown. The
comparison fails, so the function returns S_FALSE and no error info is
extracted.
The comment above the definition of GetIID() says:
// Currently this is used only for ISupportErrorInfo,
// so hopefully this will never be called in this base class.
// (however, this is not a rule, so we wont assert or anything!)
But it appears that it is called in the base class (or at least
not overloaded by anyone inheriting from it).
Everything seems to work fine if you just change
InterfaceSupportsErrorInfo() to always return S_OK.
Can anyone tell me how this code is meant to work? Why is the check
against GetIID() in there at all?
Thanks!
Phil