【问题标题】:Handling HRESULTs in a Direct2D application在 Direct2D 应用程序中处理 HRESULT
【发布时间】:2014-11-25 07:56:01
【问题描述】:

在 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

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

我的 Direct2D 程序应该如何处理HRESULTs?怎样才能正确使用HRESULTs,让程序可靠且有弹性?

【问题讨论】:

    标签: c++ directx direct2d hresult


    【解决方案1】:

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

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

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

    如果您打算使用 ATL,那么已经有这种类型的预定义宏:ATLENSURE_SUCCEEDEDATLENSURE_THROW 等。不过,Microsoft 决定不记录它们(我不知道此处提供的 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 HRESULTs,您可能需要使用此 system tray helper app

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-19
        • 2011-10-13
        • 2010-10-31
        • 1970-01-01
        • 1970-01-01
        • 2019-07-26
        • 1970-01-01
        • 2017-08-21
        相关资源
        最近更新 更多