DirectX11 With Windows SDK完整目录

欢迎加入QQ群: 727623616 可以一起探讨DX11,以及有什么问题也可以在这里汇报。

综述

参考文章:https://blogs.msdn.microsoft.com/chuckw/2012/04/24/wheres-dxerr-lib/

在龙书11中所使用的HR宏和dxerr库是一个比较实用的错误原因追踪工具。D3D中的某些函数拥有返回值HRESULT,通过dxerr库,可以将错误码转换成错误详细信息的字符串。

在DirectX SDK中,包含了头文件dxerr.h和库文件dxerr.lib,在以往的做法包含了DX SDK后,就可以直接使用dxerr了。但如果是要编写基于Windows SDK的Direct3D程序,在Windows SDK 8.0以上已经没有了dxerr库。

此时此刻,你仍然有两种选择来脱离对DirectX SDK的依赖:

  1. 寻找较新的dxerr.hdxerr.cpp源码来编译出dxerr.lib,或者直接加入你的项目当中;
  2. 直接抛弃dxerr

新的dxerr源码

微软已经将dxerr库开源了,下面的链接可以下载,如果不放心的话,你也可以到上面的参考文章去下载。

dxerr_nov2015.zip下载地址

在我以往的DirectX11项目中,则是从DXUT中拉过来的dxerr

DXUT Github/Core

但要注意的是,由于新的dxerr.h仅提供了DXTrace的Unicode字符集版本,需要将原来的__FILE__替换为__FILEW__,并在项目属性页中将字符集设置为Unicode

抛弃dxerr库

自Windows SDK 8.0起,HRESULT值关于DirectX图形API的错误消息字符串映射已经加入到FormatMessage函数中。我们可以直接脱离对dxerr的依赖,并使用该函数来直接获取错误消息字符串。因此,dxerr库也就没有必要在Windows SDK 8.0以上版本保留了。

FormatMessageW函数--获取格式化消息字符串

鉴于我们只是要获取错误码对应的字符串信息,这里就简单提及一下该函数的部分用法:

DWORD FormatMessageW(
DWORD dwFlags, // [In]FORMAT_MESSAGE系列宏
LPCVOID lpSource, // [In]直接填NULL
DWORD dwMessageId, // [In]传入函数异常时返回的HRESULT
DWORD dwLanguageId, // [In]语言ID
LPTSTR lpBuffer, // [In]用于输出消息字符串的缓冲区
DWORD nSize, // [In]WCHAR缓冲区可容纳元素个数
va_list *Arguments // [In]直接填NULL
);

DXTraceW函数

这里我将dxerrDXTraceW函数的实现进行了修改,由于现在错误码信息为中文,为此也顺便把错误窗口和输出也汉化了。只需要包含Windows.hsal.h就可以使用。

函数原型:

// ------------------------------
// DXTraceW函数
// ------------------------------
// 在调试输出窗口中输出格式化错误信息,可选的错误窗口弹出(已汉化)
// [In]strFile 当前文件名,通常传递宏__FILEW__
// [In]hlslFileName 当前行号,通常传递宏__LINE__
// [In]hr 函数执行出现问题时返回的HRESULT值
// [In]strMsg 用于帮助调试定位的字符串,通常传递L#x(可能为NULL)
// [In]bPopMsgBox 如果为TRUE,则弹出一个消息弹窗告知错误信息
// 返回值: 形参hr
HRESULT WINAPI DXTraceW(_In_z_ const WCHAR* strFile, _In_ DWORD dwLine, _In_ HRESULT hr, _In_opt_ const WCHAR* strMsg, _In_ bool bPopMsgBox);

函数实现:

HRESULT WINAPI DXTraceW(_In_z_ const WCHAR* strFile, _In_ DWORD dwLine, _In_ HRESULT hr,
_In_opt_ const WCHAR* strMsg, _In_ bool bPopMsgBox)
{
WCHAR strBufferFile[MAX_PATH];
WCHAR strBufferLine[128];
WCHAR strBufferError[300];
WCHAR strBufferMsg[1024];
WCHAR strBufferHR[40];
WCHAR strBuffer[3000]; swprintf_s(strBufferLine, 128, L"%lu", dwLine);
if (strFile)
{
swprintf_s(strBuffer, 3000, L"%ls(%ls): ", strFile, strBufferLine);
OutputDebugStringW(strBuffer);
} size_t nMsgLen = (strMsg) ? wcsnlen_s(strMsg, 1024) : 0;
if (nMsgLen > 0)
{
OutputDebugStringW(strMsg);
OutputDebugStringW(L" ");
}
// Windows SDK 8.0起DirectX的错误信息已经集成进错误码中,可以通过FormatMessageW获取错误信息字符串
// 不需要分配字符串内存
FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
nullptr, hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
strBufferError, 256, nullptr); WCHAR* errorStr = wcsrchr(strBufferError, L'\r');
if (errorStr)
{
errorStr[0] = L'\0'; // 擦除FormatMessageW带来的换行符(把\r\n的\r置换为\0即可)
} swprintf_s(strBufferHR, 40, L" (0x%0.8x)", hr);
wcscat_s(strBufferError, strBufferHR);
swprintf_s(strBuffer, 3000, L"错误码含义:%ls", strBufferError);
OutputDebugStringW(strBuffer); OutputDebugStringW(L"\n"); if (bPopMsgBox)
{
wcscpy_s(strBufferFile, MAX_PATH, L"");
if (strFile)
wcscpy_s(strBufferFile, MAX_PATH, strFile); wcscpy_s(strBufferMsg, 1024, L"");
if (nMsgLen > 0)
swprintf_s(strBufferMsg, 1024, L"当前调用:%ls\n", strMsg); swprintf_s(strBuffer, 3000, L"文件名:%ls\n行号:%ls\n错误码含义:%ls\n%ls您需要调试当前应用程序吗?",
strBufferFile, strBufferLine, strBufferError, strBufferMsg); int nResult = MessageBoxW(GetForegroundWindow(), strBuffer, L"错误", MB_YESNO | MB_ICONERROR);
if (nResult == IDYES)
DebugBreak();
} return hr;
}

HR宏

现在的HR宏变成了这样:

// ------------------------------
// HR宏
// ------------------------------
// Debug模式下的错误提醒与追踪
#if defined(DEBUG) | defined(_DEBUG)
#ifndef HR
#define HR(x) \
{ \
HRESULT hr = (x); \
if(FAILED(hr)) \
{ \
DXTraceW(__FILEW__, (DWORD)__LINE__, hr, L#x, true);\
} \
}
#endif
#else
#ifndef HR
#define HR(x) (x)
#endif
#endif

测试效果如下:

在调试输出窗口也可以看到:

DirectX11 With Windows SDK完整目录

欢迎加入QQ群: 727623616 可以一起探讨DX11,以及有什么问题也可以在这里汇报。

DirectX11--HR宏关于dxerr库的替代方案的更多相关文章

  1. DirectX11 学习笔记5 - D3DXMath 库

    directx11 特别推出了一个数学库 用于向量 矩阵的计算.并且使用128位 同一时候计算4条32位数据 (SIMD) 之前基本是用的directx10math.h这个头文件.  这个数学库既然是 ...

  2. SAP HR宏 rp-provide-from-last

    运行se11 Database table: 输入 TRMAC 点击display 查看其内容:第14个按钮(ctrl + shift +F10) 再Name 输入:rp-provide-from-l ...

  3. DirectX11 With Windows SDK--00 目录

    前言 (更新于 2019/4/10) 从第一次接触DirectX 11到现在已经有将近两年的时间了.还记得前年暑假被要求学习DirectX 11,在用龙书的源码配置项目运行环境的时候都花了好几天的时间 ...

  4. DirectX11 With Windows SDK--01 DirectX11初始化

    前言 由于个人觉得龙书里面第4章提供的Direct3D 初始化项目封装得比较好,而且DirectX SDK Samples里面的初始化程序过于精简,不适合后续使用,故选择了以Init Direct3D ...

  5. 【鸡渣饲料系列】《Introdution to 3D Game Programming With DirectX11》 代码转移至vs2015

    <Introdution to 3D Game Programming With DirectX11>我是从这本书学习的directx,被称为“龙书”dx11版,由于是通过这本书学习的所以 ...

  6. DirectX11 With Windows SDK--08 Direct2D与Direct3D互操作性以及利用DWrite显示文字

    前言 注意:从这一章起到后面的所有项目无一例外都利用了Direct2D与Direct3D互操作性,但系统要求为Win10, Win8.x 或 Win7 SP1且安装了KB2670838补丁以支持Dir ...

  7. ijg库的使用的几点注意

    ijg库(http://www.ijg.org/)是用于处理jpeg解码和压缩的库,最新版本为2014发布的版本,可以在官网中下载jpegsr9a.zip 使用vs中个nmake 进行编译,对于这个版 ...

  8. Oracle GoldenGate: 使用宏

         OGG宏与C语言中的宏一样,提供了函数封装的功能,即可以将一些配置参数整理为一个宏,然后在多个参数文件中共用,针对环境复杂或多个复制点的情况尤其有用.下面我们将介绍如何创建一个宏的库,以及在 ...

  9. C++调用C#库简单例程

    有些时候,为了使用别人已经写好的C#库文件,我们需要使用C++调用C#库文件: 以下做了一简单的调用工程,步骤如下: 1.准备C#库 (dll文件)   1)创建C#库:     2)编写C#类:   ...

随机推荐

  1. 海思uboot启动流程详细分析(一)

    第一阶段 start.S 首先我们可以在u-boot.lds中看到ENTRY(_start),即指定了入口_start,_start也就是整个start.S的最开始: 1. reset 在arch\a ...

  2. Linux环境下将Oracle11g数据库模式由非归档模式(Noarchivelog)修改为自动归档模式(archivelog)

    1.查看Oracle当前版本 select * from v$version 如图所示: 2.切换到Oracle用户 su - oracle 如图所示: 3.进入sqlplus(此时尚未登录oracl ...

  3. 【推荐】Pencil原型设计工具

    官网:http://pencil.evolus.vn/ 试用了一下,确实感觉很好用,整体体验上是一种“舒畅”的感觉,真心点赞推荐.整体功能上没有任何多余的东西,让人感觉上手就能用.虽然个人英语水平不咋 ...

  4. HTML基础-------HTML标签(2)

    HTML标签(2) a标签(容器级单标签) 语义:跳转到指定的连接 属性 列表系列 1.无序列表 该列表由两部分组成:ul标签嵌套li标签(ul标签是典型的容器级标签) 图示: 2.有序列表 该列表由 ...

  5. Dom 动态添加元素节点总结

    jQuery创建元素节点的方法: 创建元素节点: $("<div></div>"): 创建文本节点: $("<div>直接将文本的内容 ...

  6. Carthage下没有Build文件夹

    问题描述: 用Carthage管理项目时,执行Carthage upate --platform iOS后发现Carthage目录下没有Build文件夹 解决方案: 在Xcode > Prefe ...

  7. 周末学习笔记——day02(带参装饰器,wraps修改文档注释,三元表达式,列表字典推导式,迭代器,生成器,枚举对象,递归)

    一,复习 ''' 1.函数的参数:实参与形参 形参:定义函数()中出现的参数 实参:调用函数()中出现的参数 形参拿到实参的值,如果整体赋值(自己改变存放值的地址),实参不会改变,(可变类型)如果修改 ...

  8. C: printf参数执行顺序与前置后置自增自减的影响

    起源: 今天在了解副作用side-effect的过程中,看到了下面的网页,把我带到了由printf引起的一系列问题,纠结了一整天,勉强弄懂. 第一个代码没什么好解释的.而第二个printf(" ...

  9. 将WTL应用向导添加到VS2019

    WTL 简介 WTL 全称是 Windows Template Library,像 MFC 一样使用 C++ 的面向对象技术对 Win32 接口进行了封装,使之便于开发 Windows 程序.相对于 ...

  10. mysql主主配置

    数据安装完成后 配置信息  开启二进制文件复制 [client]port=3306[mysqld]basedir=/usr/local/mysqldatadir=/usr/local/mysql/da ...