4.5 调试Direct3D应用程序

为了简化代码并突出重点,我们在本书的示例中省略了很多错误处理语句。不过,我们实现了一个宏,用它来检查许多Direct3D函数返回的HRESULT值。这个宏定义在d3dUtil.h文件中:

#if defined(DEBUG) | defined(_DEBUG)
	#ifndef HR
	#define HR(x)                                              \
	{                                                          \
		HRESULT hr = (x);                                      \
		if(FAILED(hr))                                         \
		{                                                      \
			DXTrace(__FILE__, (DWORD)__LINE__, hr, L#x, true); \
		}                                                      \
	}
	#endif

#else
	#ifndef HR
	#define HR(x) (x)
	#endif
#endif

当函数的返回值表明调用失败时,我们把返回值传递给DXTrace函数。请注意,当使用该函数时,我们必须在代码中添加包含语句“#include<dxerr.h>”,并链接dxerr.lib库文件,只有这样程序才能通过编译。

HRESULT WINAPI DXTraceW(const char* strFile, DWORD dwLine, 
    HRESULT hr, const WCHAR* strMsg, BOOL bPopMsgBox);

该函数可以弹出一个消息框,显示出现错误的文件、行号、有关错误的描述信息以及导致错误的函数名。图4.11是它的一个例子。注意,当DXTrace函数的最后一个参数设为false时,该函数不会显示消息框,而是把调试信息输出到Visual C++的输出窗口。当我们不使用调试模式时,HR宏不执行任何代码。另外,HR必须是一个宏而不能是一个函数;否则__FILE____LINE__将无法引用调用HR宏的函数所在的文件和行。

图4.11
图4.11:当Direct3D函数返回一个错误时,通过DXTrace函数显示消息框。

现在我们使用HR宏来包围返回HRESULT值的Direct3D函数,下面是一个例子:

HR(D3DX11CreateShaderResourceViewFromFile(md3dDevice,
    L"grass.dds", 0, 0, &mGrassTexRV, 0 ));

当我们调试演示程序时,这个宏可以很好地运作,但是对于一个实际的应用程序来说,我们应该使用更完善的错误处理机制。

注意:L#x将HR宏的参数转换成一个Unicode字符串。通过这一方式,我们可以把导致错误的函数调用语句输出到消息框上面。

文件下载(已下载 773 次)

发布时间:2014/7/27 下午12:42:20  阅读次数:4925

2006 - 2024,推荐分辨率 1024*768 以上,推荐浏览器 Chrome、Edge 等现代浏览器,截止 2021 年 12 月 5 日的访问次数:1872 万 9823 站长邮箱

沪 ICP 备 18037240 号-1

沪公网安备 31011002002865 号