很多时候,如果你在自己写的程序中检测到一个错误,你可能希望向用户显示错误的文本描述,而不是显示一个干巴巴的错误编号。而绝大多数用户根本并不知道这个错误编号到底是什么意思。
所以你需要向最终用户显示错误的文本描述,而不是一串数字。
Windows提供了这样一个函数
FormatMessage
这个函数可以将错误ID转换为相应的文本描述。
=====================以下为测试代码=====================
/************************************************************************ * 文件描述:将Error ID转换为文本描述 * 作 者:LandyTan * 日 期:2018/06/20 * 修改历史:2018/06/20 LandyTan 创建 ************************************************************************/ #include "stdafx.h" #include <Windows.h> #include <iostream> using namespace std; class CErrorMessage { public: /* 描 述:获取上一次Error的文本描述 返回值:成功返回一个指向缓冲区的地址,失败返回NULL 注 意:该function返回的值需调用者手动释放 */ static LPWSTR GetErrorMessage() { DWORD dwError = GetLastError(); // 获取上一次Error的编号 HLOCAL hLocal = NULL; // 接收数据的Buffer /*获取Error编号对应的文本描述(详情请参阅MSDN)*/ int nRet = FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwError, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), (LPWSTR)&hLocal, 0, NULL); /*检查是否成功获取Error编号对应的文本描述*/ if (nRet) {// 成功 LPWSTR pRetBuf = new WCHAR[512]{0}; memcpy(pRetBuf, hLocal, nRet * sizeof(wchar_t)); LocalFree(hLocal); return pRetBuf; } else return NULL; } /* 描 述:获取上一次Error的ID 返回值:Error ID */ inline static DWORD GetLastError() { return ::GetLastError(); } }; /* 描 述:Test CErrorMessage::GetErrorMessage Function */ int _tmain(int argc, _TCHAR* argv[]) { HANDLE hAndle = GetDlgItem(NULL, 0);// 这将会发生错误 if (!hAndle) { /*通过调用CErrorMessage::GetErrorMessage()方法获取错误描述*/ LPWSTR pBuf = CErrorMessage::GetErrorMessage(); if (pBuf){ wcout.imbue(locale("chs")); wcout << pBuf << endl; delete[]pBuf; } } CloseHandle(hAndle); system("pause"); return 0; }