【问题标题】:How to translate RPC_STATUS into HRESULT?如何将 RPC_STATUS 翻译成 HRESULT?
【发布时间】:2011-03-09 12:43:44
【问题描述】:

在我的 COM 组件中,我需要将所有错误转换为可能的最合适的 HRESULT 值。目前,如果我调用一些 RPC 接口方法(我调用 MIDL 生成的存根,然后调用 NdrClientCall2())并且调用失败,我会返回 E_FAIL,这不是很方便。

有所谓的facility in HRESULT。我可以用这个吗?

我尝试执行以下操作:

HRESULT RpcStatusToHresult( RPC_STATUS status )
{
     if( status <= 0 ) {
         return status;
     }
     return ( status & 0x0000FFFF ) | (FACILITY_RPC << 16) | 0x80000000;
}

这会正确地将RPC_STATUS 转换为有意义的HRESULTs 吗?

【问题讨论】:

    标签: windows visual-c++ com error-handling rpc


    【解决方案1】:

    您的 RpcStatusToHresult(status) 等价于 MAKE_HRESULT(1, FACILITY_RPC, status)。 HRESULT_FROM_WIN32(status) 等价于 MAKE_HRESULT(1, FACILITY_WIN32, status)。

    我和你一样,猜测前者是正确的,但在实践中,至少就从 FormatMessage() 获得正确的错误消息而言,后者才是真正有效的。

    【讨论】:

      【解决方案2】:

      FWIW,看起来和 HRESULT_FROM_WIN32 一样

      【讨论】:

      • 你在什么情况下使用它?对于用户模式,HRESULT_FROM_WIN32 应该没问题,但对于内核模式,两者的布局应该与NTSTATUS 基本相同,而NTSTATUS 的布局又与HRESULT 相同。不过我觉得我们普通人几乎没有办法使用内核模式的版本,所以sam的解决方案就可以了。
      • 哦,还有一些 RPC 异常无法正确映射到该宏仅供参考。这就是我理解 Windows RPC 团队没有 HRESULT_FROM_RPCSTATUS() 的原因,这意味着它不会总是产生正确的结果,所以他们不会在 SDK 的某个地方提供一个。
      猜你喜欢
      • 2011-09-05
      • 2018-06-13
      • 2017-12-26
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 2011-03-20
      • 2021-12-03
      相关资源
      最近更新 更多