DXUT11框架浅析(1)--错误处理
DXUT11定义了一系列错误代码(error codes),定义了各种出错的返回标识。此外对dxerr.h中的DXTrace函数进行了封装。
1. 错误代码
错误代码是在DXUT.h中定义。当D3D程序出错时,可以返回响应的错误信息,以便快速定位问题。
DXUTERR_NODIRECT3D
没有D3D9设备
DXUTERR_NOCOMPATIBLEDEVICES
无法找到兼容的设备
DXUTERR_MEDIANOTFOUND
找不到资源文件
DXUTERR_NONZEROREFCOUNT
有对象没有被释放
DXUTERR_CREATINGDEVICE
Create device时发生错误
DXUTERR_RESETTINGDEVICE
Reset device时发生错误
DXUTERR_CREATINGDEVICEOBJECTS
在device create callback函数中出错
DXUTERR_RESETTINGDEVICEOBJECTS
在device reset callback函数中出错
DXUTERR_DEVICEREMOVED
设备被移除
DXUTERR_NODIRECT3D11
没有D3D11设备
DXUTDisplayErrorMessage()
显示错误信息。DXUTInit的形参bShowMsgBoxOnError就是控制是否显示错误对话框
2. 错误信息提示
在DXUTmisc.h中定义。用于打印各种信息已经弹出错误信息框。
HRESULTWINAPIDXUTTrace(constCHAR*strFile,DWORDdwLine,HRESULThr,constWCHAR*strMsg,boolbPopMsgBox );
用以显示错误信息框以帮助我们调试。内部调用API函数DXTrace实现。
3. 宏
为了简化函数的使用,定义了多个宏。
3.1 输出错误信息
#if defined(DEBUG)|| defined(_DEBUG)
#defineDXUT_ERR(str,hr) DXUTTrace(__FILE__, (DWORD)__LINE__,hr,str, false )
#defineDXUT_ERR_MSGBOX(str,hr) DXUTTrace(__FILE__,(DWORD)__LINE__,hr,str,true )
#defineDXUTTRACE DXUTOutputDebugString
#else
#defineDXUT_ERR(str,hr) (hr)
#defineDXUT_ERR_MSGBOX(str,hr) (hr)
#defineDXUTTRACE (__noop)
#endif
只有在调试状态时(DEBUG),这几个宏才起效。这几个宏在DXUT11的Sample也不直接使用,而是给下面的断言使用。
3.2 出错断言
#if defined(DEBUG)|| defined(_DEBUG)
#ifndefV
#defineV(x) {hr = (x);if( FAILED(hr) ) {DXUTTrace(__FILE__, (DWORD)__LINE__,hr,L#x,true ); } }
#endif
#ifndefV_RETURN
#defineV_RETURN(x) {hr = (x);if( FAILED(hr) ) {returnDXUTTrace(__FILE__,(DWORD)__LINE__,hr,L#x,true ); } }
#endif
#else
#ifndefV
#defineV(x) {hr = (x); }
#endif
#ifndefV_RETURN
#defineV_RETURN(x) {hr = (x);if( FAILED(hr) ) {returnhr; } }
#endif
#endif
用V或V_RETURN判断这句是否成功,若不成功,在DEBUG状态下会弹出错误信息框。