Windows核心编程——第一章 错误处理-1.显示错误编号对应的文本描述

很多时候,如果你在自己写的程序中检测到一个错误,你可能希望向用户显示错误的文本描述,而不是显示一个干巴巴的错误编号。而绝大多数用户根本并不知道这个错误编号到底是什么意思。

所以你需要向最终用户显示错误的文本描述,而不是一串数字。

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;
}

  

猜你喜欢

转载自www.cnblogs.com/LandyTan/p/9201896.html