我正在寻找与以下宏等效的东西:
#define FAILED_CHECK(hr) if(FAILED(hr)) return hr;
ATL 库中是否有如上所示的任何实现?
谢谢!
我正在寻找与以下宏等效的东西:
#define FAILED_CHECK(hr) if(FAILED(hr)) return hr;
ATL 库中是否有如上所示的任何实现?
谢谢!
无论出于何种原因,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_THROW
和ATLENSURE_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
}
由于大多数 ATL 函数都使用标准HRESULT,因此没有特定于 ATL 的宏- 请参阅最常见的 HRESULT 值列表。
有一些用于错误处理的宏,包括FAILED和SUCCEEDED,它们使用得最多:
#define FAILED(hr) (((HRESULT)(hr)) < 0)
#define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0)
因此,您通常使用这些,或者在特定情况下,您可能希望返回特定的 HRESULT,因此您最终将明确检查它是否等于您想要的值。在这种情况下,您很可能会以这样的方式结束:
HRESULT hr = ...
if (hr != S_OK)
...
这是按字母顺序排序的 ATL 宏列表,而此列表侧重于调试和错误报告:似乎没有您要求的内容。