1

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

在他的 Windows 映像组件文章中 - http://msdn.microsoft.com/en-gb/magazine/cc500647.aspx

他写 -

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

HR(decoder.CoCreateInstance(CLSID_WICTiffDecoder));

然而,肯尼没有显示他的定义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

谁能告诉我肯尼是如何定义他的HR()宏的?它实际上做了什么?

我的 Direct2D 程序应该如何处理HRESULTs?如何正确使用HRESULTs 以使程序可靠且有弹性?

4

2 回答 2

5

我不确定 Kenny 的宏,但是我想您绝对需要知道以下内容:错误代码设置了最高有效位并将整个值呈现为负数。“标准”宏SUCCEEDEDFAILED测试代码正是为此。

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

然后,为了代码简洁和可读性,您将需要一个同时完成这两项工作的宏:测试成功/失败并在错误时返回或抛出异常。我想HR有问题的宏是两者之一。

如果您要使用 ATL,那么已经有这种类型的预定义宏:等。不过ATLENSURE_SUCCEEDEDATLENSURE_THROWMicrosoft 决定不记录它们(我不知道此处提供的 MSDN 链接)。

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

inline VOID HR(HRESULT nValue) { if(FAILED(nValue)) AtlThrow(nValue); }

或者

#define HR(x) { HRESULT nValue = (x); if(FAILED(nValue)) return nValue; }

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

于 2012-11-20T20:17:51.090 回答
0

这篇来自 Kenny 的 MSDN 文章可以帮助其他人理解错误处理的可能方法,包括抛出异常:MSDN - C++ and the Windows API July 2012

于 2014-11-24T23:56:01.673 回答