[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 错误处理原理
设置当前线程最后一个错误代码
三. 函数使用
代码
2 {
3 HANDLE hFile = CreateFile(_T("c:\\inotexist.TXT"), 0, 0, 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);
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的输出视图窗体中.

浙公网安备 33010602011771号