如何通过COM公开结构化异常处理捕获的异常?

sha*_*oth 5 c++ com winapi structured-exception visual-c++

我在Visual C++中实现的COM服务器使用了大量其他C++代码.其他C++代码有时会包含代码__try- __except并将结构化异常转换为自定义C++异常.这部分我无法改变.

我的COM服务器的任何方法都不应该允许这些异常通过COM边界传播,因此它必须捕获并将它们转换为HRESULTs.这些自定义C++异常包含在翻译期间获得的原始错误代码 - 它就像是EXCEPTION_ACCESS_VIOLATION.问题是我如何设计一个合适的HRESULT值,以便客户端尽可能多地获得有关发生的事情的信息(并且可能在看到访问冲突后决定重新启动服务器(以及在inproc的情况下).

假设它是EXCEPTION_ACCESS_VIOLATION在中定义的WinBase.h

#define EXCEPTION_ACCESS_VIOLATION STATUS_ACCESS_VIOLATION
Run Code Online (Sandbox Code Playgroud)

而后者的定义是 WinNT.h

#define STATUS_ACCESS_VIOLATION ((DWORD)0xC0000005L)
Run Code Online (Sandbox Code Playgroud)

我可以使用它HRESULT_FROM_WIN32()来转换代码,HRESULT假设它首先是一个Win32错误.

HRESULT_FROM_WIN32()在这里使用还是以其他方式进行翻译?

Rom*_* R. 4

您应该返回HRESULT代码,您可以在其中选择适当的代码来指示操作状态。它不一定是失败代码,但您通常希望显示满足FAILED(...)宏的内容,例如E_FAIL、 或DISP_E_EXCEPTIONHRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION)

调用者不太可能与特定的异常相关的进行比较HRESULT,因此特定的故障代码对于诊断来说更有意义。此外,当您在退出 COM 方法之前完成异常处理时,无需返回特定HRESULT代码,因为不需要或不需要其他操作。

要提供额外的信息,可以使用ISupportErrorInfoIErrorInfo和朋友。调用者可以自动检索自由文本描述和许多流行的环境,因此例如.NET 调用者将获得有关异常消息的附加信息,而不是从HRESULT代码生成的标准消息。

ATL 提供了AtlReportError包装SetErrorInfoAPI,这也建议生成HRESULT代码:

...如果hRes为零,则AtlReportError返回前四个版本DISP_E_EXCEPTION。最后两个版本返回宏的结果MAKE_HRESULT( 1, FACILITY_ITF, nID )