第1章 对程序错误的处理
调用Windows函数时,首先检验传递参数的有效性,如无效,或无法执行,系统返回一个值,指明该函数运行失败。
Windows函数常用的返回值类型:
VOID 该函数的运行不可能失败。
BOOL 失败返回0,否则非0。可测试
HANDLE 失败返回NULL,否则返回HANDLE。标识可操作对象
注,有些函数失败返回句柄值INVALID_HANDLE_VALUE,值为-1。具体见Platform SDK 文档
PVOID 失败,返回NULL,否则PVOID,标识数据块内存地址
LONG/DWORD 根据返回值阅读Platform SDK文档,以确保正确检查潜在的错误
Microsoft编译了一个所有可能的错误代码列表,每个代码都有一个32位的号码.
Windows函数检测到错误时,会使用线程本地存储器(thread-local storage)将相应的错误代码号码与调用的线程关联起来(线程本地存储器见21章)。这使线程能互相独立运行,不会影响各自的错误代码。函数返回值将指明错误已经发生,如要确定错误,需调用GetLastError函数:返回值为一个32位错误代码。
WinError.h文件中包含了错误代码列表。每个错误由3部分组成:消息ID,消息文本和一个号码。
1. Microsoft选择使用最后错误代码机制(成功时也改写最后的错误代码)来返回函数成功原因信息。运行成功时,可通过调用 GetLadtError函数来确定其他的一些信息。
调试时,可在 Watch窗口中键入“@err,hr”,就能监控线程的最后错误代码。
图1-1键入“@err,hr”Watch窗口观看最后错误代码
2. Visual studio还配有Error Lookup程序,可将错误代码号换成相应文本描述。
3. 可用Format-Message()函数将错误代码转换成它的文本描述。
DWORD dwError = GetDlgItemInt(hwnd, IDC_ERRORCODE, NULL, FALSE); //nr
HLCAL hlocal = NULL; //Buffer that gets the error message string
BOOL f0k= FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | //标志
FORMAT_MESSAGE_ALLOCATE_BUFFER, //分配内存
NULL, dwError, //错误代码号
MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
(LPTSTR) &hlocal, 0, NULL); //内存句柄
此函数为多语言的,这里选择英语描述。
定义自己的错误代码:
设定线程最后的错误代码,让函数返回FALSE、INVALID_HANDLE_VA LUE、NULL等合适信息即可。
1. 使用 WinError.h中已经存在的代码:
VOID SetLastError(DWORD dwErrCode);
2. 创建自己的代码:错误代码域的第29位(客户定义代码位)必须为1
第2章 Unicode
单字节字符集