Để rút ngắn mã và giảm thiểu phiền nhiễu, chúng ta bỏ qua xử lý lỗi trong hướng dẫn này. Tuy nhiên, chúng ta thực hiện một macro để kiểm tra kết quả HRESULT được trả về bởi nhiều hàm của Direct3D. macro của chúng ta được xác định như sau trong 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

Nếu hàm trả về một kết quả thất bại thì chúng ta sx gửi mã lỗi đến hàm DXTrace() (#include <dxerr.h> và liên kết thư viện dxer.lib).


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

Hàm này sẽ hiển thị một hộp thông điệp tốt đẹp cho thấy các tập tin và dòng số nơi xảy ra lỗi, cũng như một mô tả văn bản của các lỗi và tên của các hàm mà tạo ra các lỗi; Hình dưới cho thấy một ví dụ. Lưu ý rằng nếu bạn chỉ định sai cho tham số cuối cùng của DXTrace, sau đó thay vì một hộp thông báo, các thông tin gỡ lỗi sẽ được xuất ra cửa sổ đầu ra Visual C ++. Quan sát rằng HR macro không có gì nếu chúng ta không ở trong chế độ gỡ lỗi. Ngoài ra, HR phải là một macro và không phải là một hàm; nếu không __FILE__ và __LINE__ sẽ tìm đến tập tin và dòng của hàm thay vì các tập tin và dòng nơi mà hàm HR được gọi.

ScreenShot_20160607000819.png
Một hộp thoại báo lỗi của DXTrace nếu hàm trả về một lỗi.

Bây giờ chúng ta chỉ cần sử dụng macro này để bao quanh một hàm Direct3D mà trả về một HRESULT như ví dụ này chỉ ra:


HR(D3DX10CreateShaderResourceViewFromFile(md3dDevice,
L&quot;grass.dds&quot;, 0, 0, &amp;mGrassTexRV, 0 ));

Này hoạt động tốt để gỡ lỗi bản demo của chúng ta, nhưng một ứng dụng thực sự nên xử lý lỗi mạnh mẽ hơn.