sha*_*oth 5 c++ com winapi structured-exception visual-c++
我在Visual C++中实现的COM服务器使用了大量其他C++代码.其他C++代码有时会包含代码__try
- __except
并将结构化异常转换为自定义C++异常.这部分我无法改变.
我的COM服务器的任何方法都不应该允许这些异常通过COM边界传播,因此它必须捕获并将它们转换为HRESULT
s.这些自定义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()
在这里使用还是以其他方式进行翻译?
您应该返回HRESULT
代码,您可以在其中选择适当的代码来指示操作状态。它不一定是失败代码,但您通常希望显示满足FAILED(...)
宏的内容,例如E_FAIL
、 或DISP_E_EXCEPTION
或HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION)
。
调用者不太可能与特定的异常相关的进行比较HRESULT
,因此特定的故障代码对于诊断来说更有意义。此外,当您在退出 COM 方法之前完成异常处理时,无需返回特定HRESULT
代码,因为不需要或不需要其他操作。
要提供额外的信息,可以使用ISupportErrorInfo
,IErrorInfo
和朋友。调用者可以自动检索自由文本描述和许多流行的环境,因此例如.NET 调用者将获得有关异常消息的附加信息,而不是从HRESULT
代码生成的标准消息。
ATL 提供了AtlReportError
包装SetErrorInfo
API,这也建议生成HRESULT
代码:
...如果
hRes
为零,则AtlReportError
返回前四个版本DISP_E_EXCEPTION
。最后两个版本返回宏的结果MAKE_HRESULT( 1, FACILITY_ITF, nID )
。