日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GetLastError()和FormatMessage()

發布時間:2025/3/12 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GetLastError()和FormatMessage() 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在Win32編程時不免會出現錯誤,最頭痛的就是不知道錯哪里,為什么會錯,微軟同樣想到這個事情,為此,提供了一個不錯的函數GetLastError(),此函數可以返回上一次出錯的錯誤代碼。

比如下面這段代碼:

#include<windows.h>

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
??? return DefWindowProc(hwnd,message,wParam,lParam);
}

BOOL InitApp(HINSTANCE hInstance,WNDCLASS *wndclass)
{
??? wndclass->cbClsExtra=0;? //無附加窗口類內存
??? wndclass->cbWndExtra=0;? //無附加窗口內存
??? wndclass->hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
??? wndclass->hCursor=LoadCursor(NULL,IDC_ARROW);
??? wndclass->hIcon=LoadIcon(NULL,IDI_APPLICATION);
??? wndclass->hInstance=hInstance;
??? wndclass->lpfnWndProc=WndProc;
??? wndclass->lpszClassName=TEXT("NewStart");
??? wndclass->lpszMenuName=NULL;
??? wndclass->style=WS_HSCROLL|CS_HREDRAW;????? //應該這里故意寫錯 但是編譯能過

??? return RegisterClass(wndclass);
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
??? char buf[500];
??? BOOL fOK;
??? HWND hwnd;
??? DWORD dwErr,systemLocale;
??? HLOCAL hLocal=NULL;
??? MSG msg;
??? WNDCLASS wndclass;
??? int flag;
??? if(InitApp(hInstance,&wndclass)==NULL)
??? {???
??????? dwErr=GetLastError();
??????? wsprintf(buf,L"%d",dwErr);
??????? MessageBox(NULL,buf,TEXT("Error Report"),MB_OK);
??????? return 0;
??? }
??? hwnd=CreateWindow(TEXT("NewStart"),TEXT("Hello!"),WS_SYSMENU|WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT,400,300,NULL,NULL,hInstance,NULL);
??? ShowWindow(hwnd,nShowCmd);
??? UpdateWindow(hwnd);
??? while((flag=GetMessage(&msg,hwnd,0,0))!=0&&flag!=-1)
??? {
??????? TranslateMessage(&msg);
??????? DispatchMessage(&msg);
??? }
??? return msg.wParam;
}

GetLastError()會返回一個錯誤號 87 然后你可以通過msdn查到這個錯誤編號的意思為 參數不正確 的確是這樣的,并且如果你調試這段代碼查看$err或者是dwErr都可以得到這個錯誤編號,如果你在這些變量后加上,hr可以得到87對應的錯誤解釋

當你想讓程序執行過程中顯示錯誤解釋,那就要用到另一個函數FormatMessage(),代碼如下:

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
??? char buf[500];
??? BOOL fOK;
??? HWND hwnd;
??? DWORD dwErr,systemLocale;
??? HLOCAL hLocal=NULL;
??? MSG msg;
??? WNDCLASS wndclass;
??? int flag;
??? if(InitApp(hInstance,&wndclass)==NULL)
??? {???
??????? dwErr=GetLastError();
??????? systemLocale=MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL);
??????? fOK=FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_ALLOCATE_BUFFER,
??????????????????????????? NULL,dwErr,systemLocale,(LPWSTR)&hLocal,0,NULL);
??????? MessageBox(NULL,(LPCWSTR)LocalLock(hLocal),TEXT("hello"),MB_OK);
??????? return 0;
??? }
??? hwnd=CreateWindow(TEXT("NewStart"),TEXT("Hello!"),WS_SYSMENU|WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT,400,300,NULL,NULL,hInstance,NULL);
??? ShowWindow(hwnd,nShowCmd);
??? UpdateWindow(hwnd);
??? while((flag=GetMessage(&msg,hwnd,0,0))!=0&&flag!=-1)
??? {
??????? TranslateMessage(&msg);
??????? DispatchMessage(&msg);
??? }
??? return msg.wParam;
}

這里要解釋一些東西:

HLOCAL是一個指向內存塊的句柄,初始化為0;

MAKELANGID在msdn上的解釋是This macro creates a language identifier from a primary language identifier and a sub-language identifier.

就是可以通過這個函數創建語言標示符,而他有2個參數,第一語言標示符和子語言標示符,我們這里的LANG_NEUTRAL,SUBLANG_NEUTRAL聯合放在一起的值等于0,也就是操作系統的默認語言。

FORMAT_MESSAGE_FROM_SYSTEM:這個宏是告訴FormatMessage,我們希望獲得一個與一個系統定義的錯誤代碼對應額字符串。

FORMAT_MESSAGE_IGNORE_INSERTS:這個宏允許我們獲得含有%占位符的消息。

FORMAT_MESSAGE_ALLOCATE_BUFFER: 這個宏告訴該函數分配一足夠容納錯誤文本描述的內存。

FormatMessage將錯誤信息存在hLocal處。

FormatMessage這個函數其實功能很強大,其他具體的用法建議看msdn:http://msdn.microsoft.com/en-us/library/ms679351(VS.85).aspx

LocalLock()?? msdn上的解釋為Locks a local memory object and returns a pointer to the first byte of the object's memory block。

也就是說這個函數可以用來鎖定一個內存對象,并且返回這項這個對象內存塊的首地址。

總結

以上是生活随笔為你收集整理的GetLastError()和FormatMessage()的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。