在基于 COM 的Windows资源管理器外壳扩展程序中,使用COM接口方法返回的 HRESULT
返回值表示错误情况。
但是如果在COM接口方法的主体内部(或者在COM方法中直接或间接调用的某个C ++对象的方法内部)C ++异常(例如std::runtime_error
,std::bad_alloc
,{{抛出1}}等等,究竟发生了什么?
这只是未定义的行为吗??
或 C ++异常以某种方式转换到 Win32结构化异常(SEH)?
如果是这样,转换过程的机制是什么?
答案 0 :(得分:5)
允许异常跨越COM边界是 verboten 并且未指定行为。会发生什么取决于您使用的C ++编译器。如果您使用MSVC ++,那么,是的,C ++异常会在SEH之上捎带。 MinGW很受GCC欢迎,但它没有。
这使得技术上可以使客户端程序捕获异常。例如,.NET CLR就是这样做的,将非托管异常转换为托管SEHException。然而,这纯粹是出于诊断原因,允许程序以受控方式关闭,并具有良好的错误消息和堆栈跟踪。实际上捕获异常很可能没有达到目的。根据定义,您无法处理异常,您无法恢复COM服务器的状态。当然,通常需要执行的COM服务器中的代码被绕过。内存泄漏将是典型的结果。没有被释放的锁是一种以不可识别的方式挂起程序的好方法。如果您只是继续尝试使用服务器,则可能会出现重复的异常。只有程序关闭才是合理的方法。