GetLastError()和FormatMessage()
比如下面這段代碼:
#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;? //無(wú)附加窗口類(lèi)內(nèi)存
??? wndclass->cbWndExtra=0;? //無(wú)附加窗口內(nèi)存
??? 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;????? //應(yīng)該這里故意寫(xiě)錯(cuò) 但是編譯能過(guò)
??? 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()會(huì)返回一個(gè)錯(cuò)誤號(hào) 87 然后你可以通過(guò)msdn查到這個(gè)錯(cuò)誤編號(hào)的意思為 參數(shù)不正確 的確是這樣的,并且如果你調(diào)試這段代碼查看$err或者是dwErr都可以得到這個(gè)錯(cuò)誤編號(hào),如果你在這些變量后加上,hr可以得到87對(duì)應(yīng)的錯(cuò)誤解釋
當(dāng)你想讓程序執(zhí)行過(guò)程中顯示錯(cuò)誤解釋,那就要用到另一個(gè)函數(shù)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是一個(gè)指向內(nèi)存塊的句柄,初始化為0;
MAKELANGID在msdn上的解釋是This macro creates a language identifier from a primary language identifier and a sub-language identifier.
就是可以通過(guò)這個(gè)函數(shù)創(chuàng)建語(yǔ)言標(biāo)示符,而他有2個(gè)參數(shù),第一語(yǔ)言標(biāo)示符和子語(yǔ)言標(biāo)示符,我們這里的LANG_NEUTRAL,SUBLANG_NEUTRAL聯(lián)合放在一起的值等于0,也就是操作系統(tǒng)的默認(rèn)語(yǔ)言。
FORMAT_MESSAGE_FROM_SYSTEM:這個(gè)宏是告訴FormatMessage,我們希望獲得一個(gè)與一個(gè)系統(tǒng)定義的錯(cuò)誤代碼對(duì)應(yīng)額字符串。
FORMAT_MESSAGE_IGNORE_INSERTS:這個(gè)宏允許我們獲得含有%占位符的消息。
FORMAT_MESSAGE_ALLOCATE_BUFFER: 這個(gè)宏告訴該函數(shù)分配一足夠容納錯(cuò)誤文本描述的內(nèi)存。
FormatMessage將錯(cuò)誤信息存在hLocal處。
FormatMessage這個(gè)函數(shù)其實(shí)功能很強(qiáng)大,其他具體的用法建議看msdn:http://msdn.microsoft.com/en-us/library/ms679351(VS.85).aspx
LocalLock()?? msdn上的解釋為L(zhǎng)ocks a local memory object and returns a pointer to the first byte of the object's memory block。
也就是說(shuō)這個(gè)函數(shù)可以用來(lái)鎖定一個(gè)內(nèi)存對(duì)象,并且返回這項(xiàng)這個(gè)對(duì)象內(nèi)存塊的首地址。
總結(jié)
以上是生活随笔為你收集整理的GetLastError()和FormatMessage()的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: VC中GetLastError()获取错
- 下一篇: python打飞机源码_python 飞