【问题标题】:Cryptic HRESULT errors神秘的 HRESULT 错误
【发布时间】:2013-02-11 12:05:57
【问题描述】:

以下 EndDraw() 函数返回 HRESULT 错误代码: http://msdn.microsoft.com/en-us/library/windows/desktop/dd371924%28v=vs.85%29.aspx

文档指定:

如果方法成功,则返回 S_OK。否则,它返回 HRESULT 错误代码并将 tag1 和 tag2 设置为发生错误时处于活动状态的标签。

...然后返回一个表示操作成功的HRESULT...

我得到一个返回值 -2003238911 (0x88990001),它没有出现在 Microsoft 的“通用 HRESULT 值”页面上: http://msdn.microsoft.com/en-us/library/windows/desktop/aa378137%28v=vs.85%29.aspx

我也在WinError.h 中搜索过错误代码,但也找不到。如果它返回这个代码,肯定有办法找出它的含义。

如何解释此错误代码以找出问题所在?

【问题讨论】:

  • alax.info/blog/1383 为您提供0x88990001 D2DERR_WRONG_STATE 以及数千个(不开玩笑)其他HRESULT 代码的信息。

标签: c++ windows directx hresult


【解决方案1】:

您使用的是谷歌,该十六进制代码的顶部结果是这样的:

D2DERR_WRONG_STATE
0x88990001
The object was not in the correct state to process the method.

http://msdn.microsoft.com/en-us/library/windows/desktop/dd370979(v=vs.85).aspx

我不知道关于图形编程或 Windows 编程的第一件事,但我认为这回答了您的问题,并结合文档说明标记值将返回给您,指的是发生错误的点。

【讨论】:

  • 感谢您的链接。我知道哪个函数调用失败,但不确定为什么对象不处于正确状态。错误代码似乎有点模糊!
  • 对于 Direct2D 和 Direct3D 调试,最好的办法是启用“调试设备”,它应该提供额外的上下文和信息。见Direct2D Debug Layer。这里唯一的技巧是调试层是特定于操作系统版本的。您手动下载并安装适用于 Windows 7 RTM 的 Direct2D 调试,或安装 Windows 8.x SDK 以获取适用于 Windows 7 SP1 或 Windows 8.x 的它。见Direct3D SDK Debug Layer Tricks
【解决方案2】:

最后但并非最不重要..

我遇到了同样的错误,直到我意识到我没有首先调用 ID2D1HwndRenderTarget::BeginDraw() 来为绘制调用准备渲染目标。

【讨论】:

    【解决方案3】:

    (我刚刚创建了一个帐户来投票支持 Loul G 的答案。但我还没有投票权限...)

    我也遇到了同样的问题...

    当 BeginDraw() 和 EndDraw() 被乱序调用时,你会得到 HRESULT: 0X88990001

    回溯以查看它们被调用的顺序。

    此外,为了帮助防止这种情况,您可以围绕 BeginDraw()、EndDraw() 调用,例如:

    bool beginCalled;
    int beginCount;//for debugging
    int endCount;//for debugging
    //initialize variables somewhere...
    
    void begin(){
       rendTarget>BeginDraw();
       beginCalled = true;
       beginCount++;
    }
    
    void end(){
       if(beginCalled){
          rendTarget->EndDraw();
          beginCalled = false;
       }
       endCount++;
    
    } 
    
    //print counts as necessary for debugging
    

    【讨论】: