Kenny Kerr在msdn杂志上关于成像和Direct2D的文章中经常使用HR()
宏。
在他的Windows映像组件文章中-http://msdn.microsoft.com/en-gb/magazine/cc500647.aspx
他写-
最后,WIC API使用HRESULT来描述错误。本文中的示例使用HR宏来清楚地确定方法返回需要检查的HRESULT的位置。您可以用自己的错误处理策略来代替它——无论是抛出异常还是自己返回HRESULT。
HR(decoder.CoCreateInstance(CLSID_WICTiffDecoder));
但是Kenny并没有给出他对HR()
的定义。我是一个C++初学者,正在努力发现和理解代码的细节。我想知道他对HR()
的实现是什么,这样我就可以考虑如何在我的程序中最好地处理HRESULT
。我已经搜索了一个定义,但似乎没有这些特定文章的源代码。
在学习macros
的同时,我遇到了这些最近的文档,这些文档建议使用inline
函数而不是宏-
http://msdn.microsoft.com/en-us/library/vstudio/ttsbh614.aspx
http://msdn.microsoft.com/en-us/library/vstudio/z8y1yy88.aspx
有人能告诉我Kenny是如何定义他的HR()
宏的吗?它到底做了什么?
我的Direct2D程序应该如何处理HRESULT
?如何正确使用HRESULT
,使程序具有可靠性和弹性?
我不确定Kenny的宏,但我想你绝对需要知道以下几点:错误代码设置了最高有效位,并使整个值为负数。"标准"宏SUCCEEDED
和FAILED
正是为此测试代码。
HRESULT nValue = ...
if(SUCCEEDED(nValue)) {
// Not Error
}
然后,为了代码的简洁性和可读性,您将需要一个同时做这两件事的宏:测试成功/失败,要么在错误时返回,要么抛出异常。我想有问题的HR
宏会执行这两个操作之一。
如果你要使用ATL,已经有了预定义的此类宏:ATLENSURE_SUCCEEDED
、ATLENSURE_THROW
等。不过,微软决定不记录它们(我不知道这里有MSDN链接)。
您的HR
可能类似(取决于所需的操作-抛出或错误退出):
inline VOID HR(HRESULT nValue) { if(FAILED(nValue)) AtlThrow(nValue); }
或
#define HR(x) { HRESULT nValue = (x); if(FAILED(nValue)) return nValue; }
此外,为了方便地解码WIC和D2DHRESULT
,您可能需要使用此系统托盘助手应用程序。
Kenny的这篇MSDN文章可以帮助其他人理解错误处理的可能方法,包括抛出异常:MSDN-C++和Windows API 2012年7月