gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:34:15 26 4
gpt4 key购买 nike

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

我的 COM 服务器的任何方法都不应该让这些异常通过 COM 边界传播,因此它必须捕获它们并将它们转换为 HRESULT。这些自定义 C++ 异常包含在翻译过程中获得的原始错误代码 - 它类似于 EXCEPTION_ACCESS_VIOLATION。问题是我如何设计一个合适的 HRESULT 值,以便客户端在看到一个访问冲突)。

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

#define EXCEPTION_ACCESS_VIOLATION STATUS_ACCESS_VIOLATION

而后者在 WinNT.h

中定义
#define STATUS_ACCESS_VIOLATION ((DWORD)0xC0000005L)

我可以使用 HRESULT_FROM_WIN32() 将该代码转换为 HRESULT,假设它首先是 Win32 错误。 p>

我是在这里使用 HRESULT_FROM_WIN32() 还是使用任何其他方式进行转换?

最佳答案

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

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

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

ATL 报价 AtlReportError包装 SetErrorInfo API,这也建议生成 HRESULT 代码:

... If hRes is zero, then the first four versions of AtlReportError return DISP_E_EXCEPTION. The last two versions return the result of the macro MAKE_HRESULT( 1, FACILITY_ITF, nID ).

关于c++ - 如何通过 COM 公开通过结构化异常处理捕获的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29821757/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com