今天讀《Windows核心編程》的第一章:錯誤處理,按照書上的例子寫出了一個ErrorShow的例子,其中涉及到了挺多“核心”的東西,先記錄下來與大家分享
首先我們需要一些基礎知識。
調用Windows函數時,它會先驗證我們傳給他的參數,然後再開始執行任務。如果傳入的參數無效,或者由於其他原因導致操作無法執行,則函數的返回值將給出函數因爲某些原因失敗了。
VOID 這個函數不可能失敗,只有極少數的Windows函數返回值類型爲VOID
BOOL 如果函數失敗,返回值爲0;否則,返回值是一個非0的值。應避免檢測返回值是否爲TRUE;最穩妥的辦法是檢測返回值是否不爲FALSE。
HANDLE 如果函數失敗,則返回值通常爲NULL;否則,HANDLE將標識一個可以操縱的對象。請注意這種返回值,因爲某些函數會返回INVALID_HANDLE_VALUE的一個句柄值,它被定義爲-1。函數的Platform SDK 文檔清楚說明了函數是返回NULL 還是INVALID_HANDLE_VALUE。
PVOID 如果函數調用失敗,則返回NULL;否則,PVOID將標識一個數據塊的內存地址。
LONG/DWORD 這種問題比較棘手。返回計數的函數通常會返回一個LONG或者DWORD。如果函數處於某種原因不能對我們想要計數的東西進行計數,它通常會返回0或-1(具體取決於函數)。如果要調用一個返回LONG/DWORD的函數,務必仔細閱讀Platform SDK文檔,確保我們會正確地檢查可能出現的錯誤。
------摘自《Windows核心編程》
我們可以對這個錯誤代碼用GetLastError()函數進行檢測。
下邊是我根據書本上的例子寫的GetLastError的MFC程序,其中我只放上LookUp按鈕的OnBnClickd事件
其中需要說明的如下:
HLOCAL
在WinDef.h中發現
typedef HANDLE HLOCAL;
在WinNt.h中發現
typedef void *HANDLE;
原來HANDLE和HLOCAL就是void*。自我理解就是指向一塊內存區域的指針。在改程序中,我們在FormatMessage中把它指向了生成的錯誤消息的文本。