When writing a COM object using C++, care should be taken to ensure that all C++ exceptions generated by the code are handled within the call itself. If any C++ exception is not handled, the call will fail.
For example:
CMyComObject::foo(){ HRESULT hr;... throw hr;}