10

我想检索 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”

4

2 回答 2

19

要获取 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));
}
于 2012-11-24T16:59:07.780 回答
0

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

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

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

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

于 2019-08-18T00:51:30.203 回答