在Direct2D应用程序中处理HRESULT

Dun*_*ill 1 c++ directx hresult direct2d

在Kenny Kerr的msdn杂志关于成像和Direct2D的文章中,他经常使用HR()宏.

在他的Windows Imaging Component文章中 - http://msdn.microsoft.com/en-gb/magazine/cc500647.aspx

他写 -

最后,WIC API使用HRESULT来描述错误.本文中的示例使用HR宏来清楚地标识方法返回需要检查的HRESULT的位置.您可以使用自己的错误处理策略替换它 - 无论是抛出异常还是自己返回HRESULT.

HR(decoder.CoCreateInstance(CLSID_WICTiffDecoder));
Run Code Online (Sandbox Code Playgroud)

然而肯尼没有表现出他的定义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?正确使用HRESULTs以使程序可靠且有弹性的方法是什么?

Rom*_* R. 5

我不确定Kenny的宏,但是我想你绝对需要知道以下内容:错误代码设置最重要的位并将整个值设置为负值.完全符合"标准"宏SUCCEEDEDFAILED测试代码.

HRESULT nValue = ...
if(SUCCEEDED(nValue)) {
  // Not Error
} 
Run Code Online (Sandbox Code Playgroud)

然后,为了代码简洁和可读性,您将需要一个可以同时执行这两项操作的宏:成功/失败测试以及错误返回或抛出异常.我认为HR有问题的宏会做两个中的一个.

如果你要使用ATL,也有这种已经预定义宏:ATLENSURE_SUCCEEDED,ATLENSURE_THROW等微软决定虽然不记录他们(我不知道一个MSDN链接在这里提供).

HR可能是这样的(取决于所需的动作 - 抛出或退出时出错):

inline VOID HR(HRESULT nValue) { if(FAILED(nValue)) AtlThrow(nValue); }
Run Code Online (Sandbox Code Playgroud)

要么

#define HR(x) { HRESULT nValue = (x); if(FAILED(nValue)) return nValue; }
Run Code Online (Sandbox Code Playgroud)

此外,为方便解码WIC和D2D,HRESULT您可能需要使用此系统托盘帮助应用程序.