如何将RPC_STATUS转换为HRESULT?

时间:2010-06-29 09:06:40

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

在我的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正确翻译为有意义的HRESULT吗?

2 个答案:

答案 0 :(得分:3)

您的RpcStatusToHresult(状态)等同于MAKE_HRESULT(1,FACILITY_RPC,status)。 HRESULT_FROM_WIN32(status)相当于MAKE_HRESULT(1,FACILITY_WIN32,status)。

我和你一样,已经猜到了前者是正确的,但在实践中,至少就从FormatMessage()获取正确的错误信息而言,后者实际上是有效的。

答案 1 :(得分:2)

FWIW,看起来与HRESULT_FROM_WIN32

相同