C++ C++;跨越COM方法边界的异常?

C++ C++;跨越COM方法边界的异常?,c++,winapi,exception,com,windows-shell,C++,Winapi,Exception,Com,Windows Shell,在COM中,基于Windows资源管理器外壳扩展的错误条件使用从COM接口方法返回的HRESULT返回值来表示 但是如果在COM接口方法的主体(或者在COM方法中直接或间接调用的C++对象的内部),C++异常(例如:代码> STD::RunTimeOrthyEng/Outlook >, STD::BADYOLLUC/, STD::ValueIDLIdAs/等),到底发生了什么? 这只是一种未定义的行为吗 或者是C++异常以某种方式转换为 Win32结构异常(SEH)< /强>? 如果是这样,转换

COM中,基于Windows资源管理器外壳扩展的错误条件使用从COM接口方法返回的
HRESULT
返回值来表示

但是如果在COM接口方法的主体(或者在COM方法中直接或间接调用的C++对象的内部),C++异常(例如:代码> STD::RunTimeOrthyEng/Outlook >,<代码> STD::BADYOLLUC/,<代码> STD::ValueIDLIdAs/<代码>等),到底发生了什么?

这只是一种未定义的行为吗

<>或者是C++异常以某种方式转换为<强> Win32结构异常(SEH)< /强>?
如果是这样,转换过程的机制是什么?

允许异常跨越COM边界是不可能的,行为是未指定的。发生的事情取决于你使用的C++编译器。如果使用MSVC++,那么,是的,C++异常会在SEH的顶部返回。MinGW在GCC中很受欢迎,但事实并非如此

这使得客户端程序在技术上能够捕获异常。NET CLR就是这样做的,例如,将非托管异常转换为托管SEHExException。然而,这纯粹是出于诊断原因,允许程序以可控的方式关闭,并带有适当的错误消息和堆栈跟踪。事实上,捕捉异常不太可能有好的结果。根据定义,您无法处理异常,您不可能恢复COM服务器的状态。当然,异常绕过了COM服务器中通常预期执行的代码。内存泄漏是典型的结果。未被释放的锁是不可诊断地挂起程序的好方法。如果您只是继续尝试使用服务器,则可能会重复出现异常。只有程序关闭才是合理的方法