学习win32 API开发4-GetLastError和FormatMessage获取错误信息

来源:互联网 发布:ftp端口下载文件 编辑:程序博客网 时间:2024/05/29 03:26

一、FormatMessage

#include "windows.h"void ShowErrMsg() {     TCHAR szBuf[80];     LPVOID lpMsgBuf;    DWORD dw = GetLastError();     FormatMessage(        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,        NULL,        dw,        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),        (LPTSTR) &lpMsgBuf,        0, NULL );    MessageBox(NULL, (LPTSTR)lpMsgBuf, "系统错误", MB_OK|MB_ICONSTOP); //OutputDebugString();    LocalFree(lpMsgBuf);}LRESULT CALLBACK WinProc(HWND hwnd,UINT umsg,WPARAM wparam,LPARAM lparam);int WINAPI WinMain(HINSTANCE hInstance,   HINSTANCE hPrecInstance,   LPSTR lpCmdLine,   int nShowCmd   ){TCHAR* clsName="myclass";WNDCLASS mwc;//设计窗口类mwc.lpfnWndProc = WinProc;//窗口处理函数//mwc.hbrBackground = (HBRUSH)COLOR_WINDOW;//窗口背景色mwc.lpszClassName = clsName;// 窗口类名mwc.style = NULL;//窗口类型mwc.cbClsExtra = 0;//窗口扩展mwc.cbWndExtra = 0;//窗口实例扩展mwc.hCursor = NULL;//窗口鼠标光标mwc.hIcon = NULL;//窗口的最小化图标mwc.lpszMenuName = NULL;//窗口菜单mwc.hInstance = hInstance;//实例句柄//注册窗口类RegisterClass(&mwc);//创建窗口HWND hwnd = CreateWindow(clsName,//类名,就是刚才注册的//"HEHE",TEXT("Windows的标题"),//窗口标题WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX,//外观样式400,//相对于父窗口的X坐标150,//相对于父窗口的Y坐标400,//窗口的宽400,//窗口的高NULL,//父窗口,没有就写NULLNULL,//窗口菜单,也没有,写NULLhInstance,//当前应用程序的实例句柄NULL);//附加数据,没有,为NULLif( hwnd == NULL)//检查窗口是否创建成功{ShowErrMsg();//DWORD err = GetLastError();//TCHAR  er[123] ;//wsprintf(er,"%i",err);//MessageBox(NULL,er,TEXT("提示"),MB_ICONWARNING);MessageBox(NULL,TEXT("创建窗口失败"),TEXT("提示"),MB_ICONWARNING);return 0;}//显示窗口和更新窗口ShowWindow(hwnd,SW_SHOW);UpdateWindow(hwnd);//消息循环MSG msg;while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}//MessageBox(NULL,TEXT("你好 Windows 世界^_^"),TEXT("标题"),MB_OK);return 0;}LRESULT CALLBACK WinProc(HWND hwnd,UINT umsg,WPARAM wparam,LPARAM lparam){switch(umsg){case WM_DESTROY:{PostQuitMessage(0);//终止程序return 0;}}return DefWindowProc(hwnd,umsg,wparam,lparam);}
这个程序与上一篇“win32 开发3-一个窗口创建的经典步骤”的不同之处就是增加了ShowErrMsg,以及把设计窗口类的mwc.hbrBackground = (HBRUSH)COLOR_WINDOW;注释掉了。
用FormatMessage创建一个自己的 ShowErrMsg函数,用窗口来显示错误信息:

void ShowErrMsg() 

    TCHAR szBuf[80]; 
    LPVOID lpMsgBuf;
    DWORD dw = GetLastError(); 
    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,
        dw,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR) &lpMsgBuf,
        0, NULL );
    MessageBox(NULL, (LPTSTR)lpMsgBuf, "系统错误", MB_OK|MB_ICONSTOP); 
    LocalFree(lpMsgBuf);
}

看下程序运行结果:找不到窗口类。

错误信息显示


二、GetLastError

修改程序,把ShowErrMsg()注释掉,最后把对应的代码修改为:

if( hwnd == NULL) //检查窗口是否创建成功
{
//ShowErrMsg();
DWORD err = GetLastError();
TCHAR  er[123] ;
wsprintf(er,"%i",err);
MessageBox(NULL,er,TEXT("提示"),MB_ICONWARNING);

MessageBox(NULL,TEXT("创建窗口失败"),TEXT("提示"),MB_ICONWARNING);
return 0;
}

运行后的结果是:1407,这是GetLastError返回的错误信息代码,搜索这个错误代码可以知道是窗口类不存在。

错误信息显示getlasterror

这两种错我信息显示的方式,个人比较喜欢第一种,更直观,只是稍多点代码。

0 0
原创粉丝点击