C++ C++;跨越COM方法边界的异常?
在COM中,基于Windows资源管理器外壳扩展的错误条件使用从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)< /强>? 如果是这样,转换
HRESULT
返回值来表示
但是如果在COM接口方法的主体(或者在COM方法中直接或间接调用的C++对象的内部),C++异常(例如:代码> STD::RunTimeOrthyEng/Outlook >,<代码> STD::BADYOLLUC/
如果是这样,转换过程的机制是什么?允许异常跨越COM边界是不可能的,行为是未指定的。发生的事情取决于你使用的C++编译器。如果使用MSVC++,那么,是的,C++异常会在SEH的顶部返回。MinGW在GCC中很受欢迎,但事实并非如此 这使得客户端程序在技术上能够捕获异常。NET CLR就是这样做的,例如,将非托管异常转换为托管SEHExException。然而,这纯粹是出于诊断原因,允许程序以可控的方式关闭,并带有适当的错误消息和堆栈跟踪。事实上,捕捉异常不太可能有好的结果。根据定义,您无法处理异常,您不可能恢复COM服务器的状态。当然,异常绕过了COM服务器中通常预期执行的代码。内存泄漏是典型的结果。未被释放的锁是不可诊断地挂起程序的好方法。如果您只是继续尝试使用服务器,则可能会重复出现异常。只有程序关闭才是合理的方法