是否有任何支持ATL的宏检查hresults并返回值?

时间:2012-05-30 08:36:39

标签: c++ visual-c++ com error-handling atl

我正在寻找与以下宏相当的东西:

#define FAILED_CHECK(hr) if(FAILED(hr)) return hr;

ATL库中是否有如上所示的实现?

谢谢!

3 个答案:

答案 0 :(得分:3)

无论出于何种原因,ATL都没有提供像请求的非常有用的宏。从几个版本的Visual Studio开始,ATL引入了类似的宏:

/* Naming is slightly off in these macros
ATLENSURE_RETURN(condition) is an HRESULT return of E_FAIL
ATLENSURE_RETURN_VAL(condition, hr) is any return value (function can pick)
ATLENSURE_RETURN_HR(condition, hr) is HRESULT-specific, though currently the same as _VAL
*/

但又一次,没有立即匹配。你必须定义自己的。或者,切换到在错误条件下抛出异常。 ATL为此提供了有用的宏:ATLENSURE_THROWATLENSURE_SUCCEEDED和朋友。

特别是,您可以使用HRESULT在失败ATLENSURE_SUCCEEDED上抛出异常,然后捕获异常,尤其是。在从COM接口调用返回之前,将其转换回HRESULT:

_ATLTRY {
  // ...
  ATLENSURE_SUCCEEDED(pFoo->Bar()); // Bar returns HRESULT 
  // ...
} _ATLCATCH(Exception) { // CAtlException class
  return Exception; // Back to HRESULT through CAtlException's operator
}

答案 1 :(得分:1)

由于大多数ATL功能使用标准 HRESULT ,因此没有特定于ATL的宏 - 请参阅 most common HRESULT values 列表。

macros for error handling,包括FAILEDSUCCEEDED,使用最多:

#define FAILED(hr) (((HRESULT)(hr)) < 0)
#define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0)

所以你经常使用这些,或者在特定的情况下,你可能会期望返回特定的HRESULT,因此你最终会检查它是否明确等于你想要的值。在这种情况下,您最有可能以这样的结尾:

HRESULT hr = ...
if (hr != S_OK)
    ...

答案 2 :(得分:0)

这是list of ATL macros sorted in alphabetical order,而这个列表主要关注debugging and error reporting:似乎没有像您要求的那样。