在Direct2D应用程序中处理HRESULT



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的宏,但我想你绝对需要知道以下几点:错误代码设置了最高有效位,并使整个值为负数。"标准"宏SUCCEEDEDFAILED正是为此测试代码。

HRESULT nValue = ...
if(SUCCEEDED(nValue)) {
// Not Error
} 

然后,为了代码的简洁性和可读性,您将需要一个同时做这两件事的宏:测试成功/失败,要么在错误时返回,要么抛出异常。我想有问题的HR宏会执行这两个操作之一。

如果你要使用ATL,已经有了预定义的此类宏:ATLENSURE_SUCCEEDEDATLENSURE_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月

相关内容

  • 没有找到相关文章

最新更新