天天看點

php api錯誤碼,Windows API 錯誤碼

在多數情況下,windows API在發生錯誤時很少抛出異常,多數是通過函數傳回值進行處理。(windows api中無傳回值的函數很少。)

windows api錯誤處理通常按照以下方式:首先api函數傳回特殊的值,表明函數内部發生錯誤;然後調用方可以使用GetLastError獲得對應的錯誤碼。

通常情況下windows api按照傳回類型可以分為以下幾類:

傳回值為BOOL類型。有錯誤發生,傳回值為0,否則傳回非零值。

傳回值為HANDLE類型。有錯誤發生時,傳回NULL或INVALID_HANDLE_VALUE(值為-1)。

傳回值為LONG類型或DWORD類型。有錯誤發生時,傳回0或-1。

由于windows api傳回類型不太一緻,是以在實際處理windows api錯誤時建議檢視下msdn上對應的說明,并按照其中的解釋處理對應的錯誤碼。

DWORD WINAPI GetLastError(void);

通過調用GetLastError函數傳回的錯誤碼是一個DWORD類型(32bit),其固定位域映射格式如下(按照windows下小端位順序,從低位到高位依次編号0,1,…,30,31;注意下表中都是按照二進制資料表示的):

含義

bit30~31

安全級别,00=安全,01=資訊,10=警告,11=錯誤

bit29

錯誤來源,0-Microsoft定義的,1-使用者自定義錯誤碼

bit28

保留位,必須是0

bit16~27

錯誤來源的工具碼,Microsoft定義的(Winerror.h)

bit0~15

工具對應的狀态碼,Microsoft或使用者定義。

如果需要的話,我們也可以自己定義錯誤碼,并使用windows api類似的錯誤機制,具體可參考 SetLastError 、 SetLastErrorEx函數,但需要注意自定義的錯誤碼不要跟windows錯誤碼重複。

檢視錯誤碼對應的資訊可以使用visual c++提供的錯誤查找工具(Error Lookup Tool),也可以直接在調試器的觀察視窗中輸入“@err , hr”。

當然也可以使用FormatMessage函數将錯誤碼直接轉化成對應的字元串。調用代碼如下:

php api錯誤碼,Windows API 錯誤碼
php api錯誤碼,Windows API 錯誤碼

//Windows錯誤碼解析程式,ErrCodeParseDemo//簡單介紹如何将錯誤碼轉化為對應的字元串資訊//建議使用vs2005以上版本編譯 unicode編碼

#include #include#include

usingstd::wcout;usingstd::endl;voidOutputFormatMessage(DWORD errCode)

{

LPTSTR lpMsgBuf=NULL;

FormatMessage(

FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,

NULL,

errCode,

MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),

(LPTSTR)&lpMsgBuf,0, NULL );

wcout<< "err:" << std::hex << errCode << "Msg tips:" <

LocalFree(lpMsgBuf);

}int _tmain(int argc, _TCHAR*argv[])

{//輸出中文

std::wcout.imbue(std::locale("chs"));//設定控制台标題欄

SetConsoleTitle(TEXT("ErrCodeParseDemo"));

OutputFormatMessage(ERROR_INVALID_FUNCTION);

OutputFormatMessage(ERROR_HANDLE_EOF);return 0;

}

View Code