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