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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

GetLastError()和FormatMessage()

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

比如下面這段代碼:

#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ú)附加窗口類內(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。