• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 對程序錯誤的處理

    發表于:2007-05-25來源:作者:點擊數: 標簽:編程windows程序中的錯誤
    windows編程中的錯誤處理 本文用于本人收藏之用。 閱讀《windows核心編程》的筆記 開始windows編程之前,要了解windows函數是怎么做錯誤處理的。 當調用一個windows函數的時候。它首先檢查傳遞給它的各個參數的有效性,然后再設法做處理。 當傳入一個錯誤的

    windows編程中的錯誤處理

    本文用于本人收藏之用。

    閱讀《windows核心編程》的筆記

    開始windows編程之前,要了解windows函數是怎么做錯誤處理的。

    當調用一個windows函數的時候。它首先檢查傳遞給它的各個參數的有效性,然后再設法做處理。

    當傳入一個錯誤的參數或操作在處理過程中出現不成功,則返回一個值。

    當返回值是VOID的時候,是不可能錯誤的。

    當返回值是LONG/DWORD的時候。windows處理比較復雜。一般如果返回0或-1 表示不能計數。

    Microsoft公司編譯了一個錯誤表,為每個錯誤分配一個32位的號碼。當發生錯誤的時候??梢哉{用GetLastError()函數,得到最近的錯誤。注意:該函數只返回32位的錯誤號。

    WinError.h中包含了錯誤代碼的列表。這個文件的列表內容是這樣的:

    //MessageId: ERROR_SUCCESS

    //MessageText:

    //

    //The operation completed suclearcase/" target="_blank" >ccessfully.

    //

    #define ERROR_SUCCESS  0L

    ... ...

    每個錯誤都是這樣描述的:錯誤ID號,錯誤文本,錯誤號碼(一般,應該避免使用號碼,可以使用ID號)。

    同時記?。寒攚indows函數運行失敗,請立即運行GetLastError()函數進行錯誤處理。但是,當windows函數運行成功,它就不會改寫錯誤代碼,并不指明運行成功。(當然有例外)

    在windows98中,不能使用這種機制來發現錯誤。因為,windows98很大部分是16位函數。

    在調試的時候,在Watch窗口中輸入“@err,hr”,就可以顯示最后一個函數調用時的錯誤號碼和錯誤英文描述文本

    如果在程序編寫中,想把錯誤顯示給用戶看,windows提供了一個函數:FormatMessage定義如下:

    DWORD FormatMessage(DWORD dwFlags , LPCVOID pSource , DWORD MessageID , DWORD dwLanguageID ,

    PTSTR pszBuffer , DWORD nSize , va_list * Arguments );

    FormatMessage()函數的功能非常豐富,向用戶顯示消息,它是首選函數。后面會展示該函數的用法。

    以上是windows的錯誤處理機制,你也可以在你的程序中使用這種機制。

    將你認為合適的號碼傳給windows的線程池調用下面的函數:SetLastError(DWORD dwErrCode);

    最好,能在WinError.h中存在的錯誤號。如果你實在是找不到反映你實際需要代碼,可以自己創建錯誤號。

    錯誤號可以劃分域的:31~30 表示嚴重性(0 表示成功 1 表示供參考 2 表示警告 3 表示錯誤)

    29 表示是用戶定義的錯誤號還是是Microsoft定義:0 表示是Microsoft定義的 1 表示用戶定義的。

    28 是保留 必須是0 。

    27~16 設備代碼,由Microsoft定義。

    15~0 錯誤代碼,由Microsoft或用戶定義。

    這些,還會在以后的文章中涉及!

    下面開始是一個示例程序,重點展示如何使用FormatMessage函數:

    //This is a copy of the book windows kernel programing //I don't know how to translate the book's name.Please forgive me

    ///////////// *** program start now ***////////////////

    // Get the error code

    DWORD dwError = GetDlgItemInt(hwnd,IDC_ERRORCODE,NULL,FALSE);

    HLOCAL hLocal = NULL; //Buffer that gets the error message strings

    //Get the error code's textual discription

    BOOL fOK = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,

    NULL, dwError , MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US), (LPTSTR) & hLocal , 0 , NULL);

    ... ...

    if(!hLocal != NULL){

    SetDlgItemText(hwnd,IDC_ERRORTEXT,(PCTSTR) LocalLock(hLocal));

    LocalFree(hLocal);

    }else{

    SetDlgItemText(hwnd,IDC_ERRORTEXT,TEXT("Error number not found."));

    }

    今天就寫這么多了。不愿意再寫下去了。下面還有一個示例,就是上面這個程序的完整代碼,我得好好研究。

    這樣才可以學習好編程~!

    I like study

    wsyghk

    原文轉自:http://www.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>