在托管代码的 HRESULT 信息

,当 HRESULT 返回值遇到时,托管代码和 COM 之间的交互会导致问题。

COM 接口,返回的 HRESULT 值可模拟这些角色:

  • 提供错误信息 (例如, E_INVALIDARG)。

  • 提供有关常规程序行为的状态信息。

当 COM 调用托管代码时, HRESULT 可能会导致这些问题:

  • 小于零 (失败代码) 返回 HRESULT 值的 COM 函数生成异常。

  • 定期返回两个或多个不同的成功代码,例如, S_OKS_FALSE的 COM 方法,不能是已知的。

由于许多 Visual Studio SDK COM 函数返回 HRESULT 值大于请零或返回不同的成功代码, Visual Studio SDK 互操作程序集编写的,方法签名保留。 所有 Visual Studio SDK 互操作方法是 int 类型。 HRESULT 值通过 interop 层,而无需更改,也不生成异常。

由于 COM 函数返回 HRESULT 到它的调用托管方法,调用方法必须检查 HRESULT 并在必要时引发异常。

处理 HRESULT 返回到 COM 中的托管代码

当您调用从托管代码中的某个 COM 接口,检查 HRESULT 值并且如果必须引发异常。 ErrorHandler 类根据 HRESULT 的值包含 ThrowOnFailure 方法,引发 COM 异常,传递给它。

默认情况下, ThrowOnFailure 引发异常,只要它通过大于零具有值的 HRESULT。 在此 HRESULT 可接受值的情况下,和异常应该不会引发异常,则应通过附加的 HRESULT 的值更改为 ThrowOnFailure ,在值测试之后。 如果为 HRESULT 的所有 HRESULT 值显式传递给 ThrowOnFailure测试的匹配项,则不会引发异常。

备注

VSConstants 类包含通用的 HRESULT 的,例如, S_OKE_NOTIMPL和 Visual Studio HRESULT,例如, VS_E_INCOMPATIBLEDOCDATAVS_E_UNSUPPORTEDFORMAT常数。VSConstants 还提供 SucceededFailed 方法,对应于 Succeeded 方法和 Failed 宏在 COM。

例如,请考虑以下函数调用, E_NOTIMPL 是一个可接受的返回值,但其他 HRESULT 大于零表示错误。

Dim hr As Integer = MyInterface.MyFunction(cmdID)
ErrorHandler.ThrowOnFailure(hr, VSConstants.E_NOTIMPL)
int hr = MyInterface.MyFunction(cmdID);
ErrorHandler.ThrowOnFailure(hr, VSConstants.E_NOTIMPL);

如果比可接受的一个返回值都具有更多功能,附加 HRESULT 值可能会追加到列表中的 ThrowOnFailure的调用。

Dim hr As Integer = MyInterface.MyFunction(cmdID)
ErrorHandler.ThrowOnFailure(hr, VSConstants.E_NOINTERFACE, VSConstants.E_NOTIMPL)
int hr = MyInterface.MyFunction(cmdID);
ErrorHandler.ThrowOnFailure(hr, VSConstants.E_NOINTERFACE, VSConstants.E_NOTIMPL);

返回到 COM 的 HRESULT 从托管代码

如果没有发生异常,托管代码返回 S_OK 到它的调用 COM 函数。 COM 互操作的支持是强类型在托管代码中的常见异常。 例如,采用不接受 null 参数的方法引发 ArgumentNullException

如果异常引发的,但是,您知道 HRESULT 的不确定要返回到 COM,可以使用 ThrowExceptionForHR 方法引发相应的异常。 即使与非标准错误,例如, VS_E_INCOMPATIBLEDOCDATA一起使用。 ThrowExceptionForHR 尝试映射 HRESULT 传递给其设置为强类型的异常。 如果不能,会引发一般 COM 异常。 最终结果是传递给从托管代码中 ThrowExceptionForHR 的 HRESULT 返回到调用它的 COM 函数。

备注

异常会降低性能和用于指示一个异常程序行为。发生应通常处理的情况是内联的,而不是引发的异常。

请参见

任务

如何:映射 HRESULT 和异常

概念

为交互操作生成 COM 组件

其他资源

托管 Vspackage

与非托管代码交互操作

托管 Vspackage