C++获取系统错误代码以及相应的错误信息
通常在 调用 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 <iostream>
#include <string>
#include <Windows.h>
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失败!
原因:%s", GetSysErrorMessage().c_str());
MessageBox(NULL, errMsg, "ERROR", MB_OK);
}
}
