C++获取系统错误代码以及相应的错误信息

通常在 调用Win32 API失败时,可通过调用GetLastError()函数获取错误代码,然后根据错误代码可以查到调用失败的原因。其函数原型如下:

DWORD WINAPI GetLastError(VOID);

通过该函数获取的仅仅是错误代码,想要知道具体原因还需要查找该返回错误码所对应的错误信息。当然,也可以进一步通过调用FormatMessage函数获取相应的错误信息,其函数原型如下:

WINBASEAPI
DWORD
WINAPI
FormatMessageA(
    __in     DWORD dwFlags,         //错误信息类型标志
    __in_opt LPCVOID lpSource,      //指定本地信息定义 其依赖于第一个参数的设置
    __in     DWORD dwMessageId,     //错误码,如果dwFlags设置为FORMAT_MESSAGE_FROM_STRING 这个参数将被忽略
    __in     DWORD dwLanguageId,    //指定被请求的消息的语言标示   
    __out    LPSTR lpBuffer,        //用来保存格式话后的消息字符串的地址
    __in     DWORD nSize,           //如果第一个参数为指定FORMAT_MESSAGE_ALLOCATE_BUFFER 这个参数就是字符串的最大长度
    __in_opt va_list *Arguments
    );

在实际应用中,可将其进行二次封装成一个函数进行调用。伪代码如下:

#include 
#include 
#include 

using namespace std;

string GetSysErrorMessage()
{
	string errMsg;
	LPVOID lpMsgBuf;
	FormatMessage(
		FORMAT_MESSAGE_ALLOCATE_BUFFER |
		FORMAT_MESSAGE_FROM_SYSTEM |
		FORMAT_MESSAGE_IGNORE_INSERTS,
		NULL,
		GetLastError(),			//Get MessageId
		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
		(LPTSTR)&lpMsgBuf,
		0,
		NULL
	);

	errMsg = (char *)lpMsgBuf;

	// Free the buffer.
	LocalFree(lpMsgBuf);

	return errMsg;
}

int main(int argc, char* argv[])
{
	//调用 Win32 API 失败

	...

	if (/*调用 Win32 API 失败*/)
	{
		char errMsg[1024];
		memset(errMsg, 0, 1024);
		sprintf(errMsg, "调用xxx失败!\n原因:%s", GetSysErrorMessage().c_str());
		MessageBox(NULL, errMsg, "ERROR", MB_OK);
	}
}

 

你可能感兴趣的:(C/C++)