2

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

但是,如果在 COM 接口方法的主体内部(或在 COM 方法中直接或间接调用的某个 C++ 对象的方法内部)抛出了 C++ 异常(例如std::runtime_errorstd::bad_allocstd::invalid_argument等),究竟会发生什么?

这只是一个未定义的行为吗?

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

4

1 回答 1

5

允许异常跨越 COM 边界是禁止的,行为是未指定的。会发生什么取决于您使用的 C++ 编译器。如果您使用 MSVC++,那么,是的,C++ 异常搭载在 SEH 之上。MinGW 在 GCC 中很受欢迎,但事实并非如此。

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

于 2013-07-15T15:29:51.180 回答