纯字符串
TCHAR* GetErrorString(HRESULT hr) {
TCHAR* perrstr;
FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL,
hr,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(TCHAR*)&perrstr,
0,
NULL
);
return perrstr;
}
字符串格式化
TCHAR* FormatString(_In_z_ TCHAR CONST* fmt, ...) {
PTSTR output;
va_list args;
va_start(args, fmt);
FormatMessage(
FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER,
fmt, 0, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(TCHAR*)&output, 0, &args
);
va_end(args);
return output;
}
调试弹窗
HRESULT DXTrace(_In_z_ TCHAR CONST* strFile, _In_ DWORD dwLine, _In_ HRESULT hr,
_In_opt_ TCHAR CONST* strMsg, _In_ BOOL bPopMsgBox) {
if(strMsg == NULL) {
strMsg = TEXT("未知");
}
LPTSTR hrErrorSrting = GetErrorString(hr);
TCHAR* formatedErrorString;
formatedErrorString = FormatString(
TEXT("%1!s!(%2!d!): %5!s! 错误码含义:%3!s!(0x%4!08x!)%n"),
strFile, dwLine, hrErrorSrting, hr, strMsg
);
OutputDebugString(formatedErrorString);
LocalFree(formatedErrorString);
if(bPopMsgBox) {
formatedErrorString = FormatString(
TEXT(
"文件名:%1!s!%n"
"行号:%2!d!%n"
"错误码含义:%3!s!(0x%4!08x!)%n"
"当前调用:%5!s!%n"
"你需要调试当前应用程序吗?"),
strFile, dwLine, hrErrorSrting, hr, strMsg
);
int msgResult = MessageBox(GetForegroundWindow(), formatedErrorString, TEXT("错误"), MB_YESNO | MB_ICONERROR);
LocalFree(formatedErrorString);
if(msgResult == IDYES) {
DebugBreak();
}
}
LocalFree(hrErrorSrting);
return hr;
}