3

我正在寻找与以下宏等效的东西:

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

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

谢谢!

4

3 回答 3

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朋友。

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

_ATLTRY {
  // ...
  ATLENSURE_SUCCEEDED(pFoo->Bar()); // Bar returns HRESULT 
  // ...
} _ATLCATCH(Exception) { // CAtlException class
  return Exception; // Back to HRESULT through CAtlException's operator
}
于 2012-05-30T09:16:44.997 回答
1

由于大多数 ATL 函数都使用标准HRESULT,因此没有特定于 ATL 的宏- 请参阅最常见的 HRESULT 值列表。

有一些用于错误处理的宏,包括FAILEDSUCCEEDED,它们使用得最多:

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

因此,您通常使用这些,或者在特定情况下,您可能希望返回特定的 HRESULT,因此您最终将明确检查它是否等于您想要的值。在这种情况下,您很可能会以这样的方式结束:

HRESULT hr = ...
if (hr != S_OK)
    ...
于 2012-05-30T09:02:34.563 回答
0

这是按字母顺序排序的 ATL 宏列表,而此列表侧重于调试和错误报告:似乎没有您要求的内容。

于 2012-05-30T08:57:00.390 回答