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

mac2022-06-30  84

通常在 调用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 <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失败!\n原因:%s", GetSysErrorMessage().c_str()); MessageBox(NULL, errMsg, "ERROR", MB_OK); } }

 

最新回复(0)