[Windows 核心编程] 第一章. 对程序错误的处理

本章主要讲

一. Windows 对程序错误的处理一组函数:

    1. DWORD GetLastError()      

       功能:返回此函数前被调用失败的Windows 函数错误码;

       备注:紧跟在检测函数之后并且在检测函数失败时调用; 被检测函数调用成功是不会更改LastError的

    2. DWORD WINAPI FormatMessage( __in      DWORD dwFlags,
                       __in_opt  LPCVOID lpSource,
                       __in      DWORD dwMessageId,
                       __in      DWORD dwLanguageId,
                       __out     LPTSTR lpBuffer,
                       __in      DWORD nSize,
                       __in_opt  va_list *Arguments);

       功能:此处功能主要用于将windows 错误代码转换成对应的错误文本描述

       备注: FormatMessage 功能丰富详见MSDN
    3. void SetLastError(__in DWORD dwError)

       功能:  设置某一函数执行后的错误代码,出错时设定

       备注:  用户可自定义错误代码,即可用实现windows一样的错误处理功能, GetLastError也可识别到.

                但要遵循dwError格式,详见MSDN,Windows 错误代码包括在winError.h 文件中

二.  windows 错误处理原理

      设置当前线程最后一个错误代码

 

 三. 函数使用

代码
 1 BOOL WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd)\
 2 {
 3     HANDLE hFile = CreateFile(_T("c:\\inotexist.TXT"), 00, NULL, OPEN_EXISTING, 0, NULL);
 4     if (INVALID_HANDLE_VALUE == hFile)
 5     {
 6         DWORD    dwError        = GetLastError();  // 紧跟检测函数之后, 此时检测CreateFile出错原因
 7         LPVOID    pszBuffer     = NULL;
 8         DWORD    hResult        = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ALLOCATE_BUFFER,
 9                                                 NULL,
10                                                 dwError, 
11                                                 0
12                                                 (LPTSTR)&pszBuffer, 
13                                                 0,
14                                                 NULL);
15         if (S_OK != hResult)
16         {
17             MessageBox(NULL, (LPTSTR)LocalLock(pszBuffer), _T("Error Message"), MB_OK);
18        LocalFree(pszBuffer);      // FormatMessage 函数己分配了pszBuffer空间,用完后释放
19         }
20     }
21 
22     return TRUE;
23 }

 四. 额外收获

   在Visual Studio 中的Watch视窗中写入@err.hr  单步调试时可查看每一个windows API函数执行后的结果(成功的或失败时的错误代码和错误文本描述)

 

 五. 小练习:

    通过FormatMessage函数, 实现类似VS中ErrLookup小工具的功能; 源码: ErrorExplorer

    编写练习时一点小心得:

    a.  SetClassLongPtr(HWND, GCL_HICON, (LONG)hIcon);   更改或设置对框架左上角的小图标, 此函数还有别的功能, 详见MSDN

    b.  I. HANDLE_MSG(HWND, MSG, MSG_PROC) 宏, 通过此宏可以简化窗体过程函数中复杂的switch 函数结构, 例:

           HANDLE_MSG(hwnd, WM_COMMAND, OnCommand) 展开后为: HANDLE_WM_COMMAND(hwnd, OnCommand),具体MSG_PROC 原型见:

           windowsx.h 中查找类似HANDLE_WM_COMMAND的宏可找到对应消息的处理函数原型。

         II. FORWARD_WM_COMMAND(HWND, CTRL_ID,  CTRL_HWND, CODE_NOTIFY, FUNCTION) 宏, 本宏主要功能是向指定控件发送特定的

             COMMAND事件, windows还提供类似其他的消息转发宏

         以上宏被包涵在: windowsx.h 头文件中

   c.   OutputDebugString(LPTSTR)  在调试时跟踪一些参数信息是可用到, 此信息被显示到VS的输出视图窗体中.

 

posted @ 2010-12-05 18:15  zTercel  阅读(609)  评论(0)    收藏  举报