如何检索DirectX 9的错误字符串

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()失败的原因:

"The system cannot find message text for message number 0x%1 in the message file for %2."

_com_error.ErrorMessage()告诉我:"未知错误0x8876086c"。


顺便问一下:是否有一种通用的方法可以获取所有 HRESULT 的错误字符串? - LeOpArD
并非如此,错误代码和消息是分类的。例如,网络子系统有自己的代码和消息,DX也有自己的代码和消息等。因此,您必须知道正在执行的操作类型,以便获取与您收到的错误相对应的消息。 - user405725
查看d3d9.h头文件以获取错误代码。您会发现与D3DERR_INVALIDCALL匹配,但该字符串不会告诉您为什么传递了无效参数。您的片段也没有提供更多信息。 - Hans Passant
1
@LeOpArD:看这里 - http://alax.info/blog/1383 这个工具覆盖了来自不同API的几千个HRESULT代码,并以一种方便的方式解码这些值。 - Roman R.
@RomanR。真是个不错的工具。感谢你的推荐! - LeOpArD
显示剩余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));
}

2
dxerr已经过时。此外,根据以下链接:“VS 2015 C运行时与传统DirectX SDK中提供的DXERR.LIB不兼容” https://blogs.msdn.microsoft.com/chuckw/2012/04/24/wheres-dxerr-lib/ - kreuzerkrieg
上面评论中的页面已经移动到https://walbourn.github.io/wheres-dxerr-lib/。 - Ralph Versteegen

0
根据 https://walbourn.github.io/wheres-dxerr-lib/(也在 kreuzerkrieg 的评论中链接到):
引入 DirectX 图形 API 的 HRESULTS 已经被添加到 FormatMessage 函数中,当使用 FORMAT_MESSAGE_FROM_SYSTEM 在 Windows 8 中,该函数已经支持 DXERR 报告的大多数系统错误代码。
同时,在 Windows SDK 8 中删除了之前包含 DXGetErrorString() 函数的 DXERR.LIB 库(将其合并到 DirectX SDK 中)。
如果您想要在任何 Windows 操作系统上使用的解决方案,可以使用发布在该网站上、遵循 MIT 许可证的 DXERR.LIB 库的“简化版本”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接