【问题标题】:How can I retrieve error strings for DirectX 9如何检索 DirectX 9 的错误字符串
【发布时间】:2012-11-24 16:41:20
【问题描述】:

我想检索 DirectX 9 的错误字符串,但我可以在网上找到正在使用 FormatMessage() 和 _com_error.ErrorMessage(),这两个都失败了。

hr = g_pd3dDevice->GetRenderTargetData(...
... // the debugger tells me hr = 0x8876086c
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
    FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL, hr, 0, (LPTSTR)&lpBuf, 0, NULL))
// it returns 0 with lpBuf unallocated

FormatMessage() 失败,我再次使用 GetLastError() 来查看 FormatMessage() 失败的原因: "系统在 %2 的消息文件中找不到消息号 0x%1 的消息文本。"

_com_error.ErrorMessage() 告诉我“未知错误 0x8876086c”

【问题讨论】:

  • 顺便说一句:有没有一种通用的方法来获取所有 HRESULT 的错误字符串?
  • 并非如此,错误代码和消息是分类的。例如,网络子系统有自己的代码和消息,DX 有自己的等等。因此,您必须知道您正在执行的操作类型,才能获得与您遇到的错误相对应的消息。
  • 查看 d3d9.h 头文件中的错误代码。您会发现与 D3DERR_INVALIDCALL 匹配,该字符串不会告诉您为什么您传递了无效参数。你的 sn-p 也没有。
  • 正如您提到的网络 API,我将 GetLastError() 与 FormatMessage 一起用于 winsock API,尽管 MSDN 说要改用 WSAGetLastError(),但它仍然有效。不知道是不是靠谱的方法。
  • @LeOpArD:看看这里 - alax.info/blog/1383 该工具涵盖了来自不同 API 的数千个 HRESULT 代码,并以方便的方式解码这些值。

标签: c++ winapi com error-handling directx


【解决方案1】:

要获取 DirectX 错误消息,有两个函数 — DXGetErrorString()DXGetErrorDescription()。话虽如此,FormatMessage() 不会得到你想要的。这是一个小例子:

// You'll need this include file and library linked.
#include <DxErr.h>
#pragma comment(lib, "dxerr.lib")

...

if (FAILED(hr)) {
    fprintf(stderr, "Error: %s error description: %s\n",
        DXGetErrorString(hr), DXGetErrorDescription(hr));
}

【讨论】:

【解决方案2】:

根据https://walbourn.github.io/wheres-dxerr-lib/(也链接到 kreuzerkrieg 的评论):

DirectX 图形 API 的 HRESULTS 已添加到 FormatMessage 在 Windows 8 中使用 FORMAT_MESSAGE_FROM_SYSTEM 时的函数 已经支持大部分DXERR上报的系统错误码

同时,包含 DXGetErrorString() 函数的先前 DXERR.LIB 库已在 Windows SDK 8 中删除(DirectX SDK 已合并到其中)。

如果您想要一个适用于任何 Windows 操作系统的解决方案,您可以使用 DXERR.LIB 库的“精简版”,获得 MIT 许可,发布在该网站上。

【讨论】:

    猜你喜欢
    • 2020-12-26
    • 1970-01-01
    • 2013-09-03
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多