DirectX11--HR宏关于dxerr库的替代方案
原文:
DirectX11--HR宏关于dxerr库的替代方案
DirectX11 With Windows SDK完整目录 欢迎加入QQ群: 727623616 可以一起探讨DX11,以及有什么问题也可以在这里汇报。 综述参考文章:https://blogs.msdn.microsoft.com/chuckw/2012/04/24/wheres-dxerr-lib/ 在龙书11中所使用的 在DirectX SDK中,包含了头文件 此时此刻,你仍然有两种选择来脱离对DirectX SDK的依赖:
新的dxerr源码微软已经将 dxerr_nov2015.zip下载地址 在我以往的DirectX11项目中,则是从DXUT中拉过来的 DXUT Github/Core 但要注意的是,由于新的 抛弃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函数这里我将 // ------------------------------ // 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_ 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' '; // 擦除FormatMessageW带来的换行符(把rn的r置换为 即可) } swprintf_s(strBufferHR,40,L" (0x%0.8x)",hr); wcscat_s(strBufferError,strBufferHR); swprintf_s(strBuffer,L"错误码含义:%ls",strBufferError); OutputDebugStringW(strBuffer); OutputDebugStringW(L"n"); if (bPopMsgBox) { wcscpy_s(strBufferFile,MAX_PATH,L""); if (strFile) wcscpy_s(strBufferFile,strFile); wcscpy_s(strBufferMsg,1024,L""); if (nMsgLen > 0) swprintf_s(strBufferMsg,L"当前调用:%lsn",strMsg); swprintf_s(strBuffer,L"文件名:%lsn行号:%lsn错误码含义:%lsn%ls您需要调试当前应用程序吗?",strBufferFile,strBufferLine,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__,L#x,true); } } #endif #else #ifndef HR #define HR(x) (x) #endif #endif 测试效果如下: 在调试输出窗口也可以看到: DirectX11 With Windows SDK完整目录 欢迎加入QQ群: 727623616 可以一起探讨DX11,以及有什么问题也可以在这里汇报。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- active-directory – 用户在AD用户和计算机中不可见
- 强化经济上至关重要的Windows计算机
- 记 Win10 - Archlinux - Archlinux(Emergency) 三系统安装/
- 如何防止在UWP中的任务切换器中显示
- windows – VMMap如何知道给定的内存区域是Thread Stack,具
- .net – System.Diagnostics.EventLog – 连接到系统的设备
- windows – 在Bash中循环:语法错误:意外的文件结束
- .net – Windows Azure上的AspPDF和AspJPEG
- windows-services – 更改服务的启动类型(Windows)
- windows – 用于构建qt的clang的mkspecs是什么?