Windows 函数错误处理
在涉入并检验微软Windows所能提供的许多特性之前,需要先理解各种Windows函数在错误处理方面的功能。
在调用Windows函数时,函数对传递给的参数进行有效性检验,然后再尝试完成他的工作。如果传递了一个无效参
数或者其他一些原因导致无法执行功能,函数的返回值指明了函数失败的原因。表1-1列出了多数Windows函数使
用的返回值数据类型。
表1-1.Windows函数常用返回类型
数据类型 指明失败类型的值
VOID 该函数不太可能失败,很少数Windows函数返回值类型为VOID
BOOL 如果函数失败,返回值为0;反之,返回值为非0。最好测试返回值是0或者非0,避免测试返回
值是否为TRUE。
HANDLE 如果函数失败,返回值通常为NULL,反之,HANDLE标识一个你可以操作的对象。使用它要小心
,因为一些函数返回句柄值INVALID_HANDLE_VALUE,该值定义为-1。针对各函数的平台SDK文档
会清楚的描述函数返回NULL或者INVALID_HANDLE_VALUE来表明失败。
PVOID 如果函数失败,返回值为NULL,反之,PVOID标识某数据块的内存地址。
LONG/DWORD 这是个棘手的问题,函数返回个数通常返回一个LONG或者DWORD值。如果某种情况下函数数不过
来你要数的事情,函数通常返回0或者-1(依函数不同而异)。如果要调用一个返回LONG/DWORD
值的函数,请详细阅读平台SDK文档来确保正确的检核潜在的错误。
当一个Windows函数返回时附带错误码,明白为什么函数失败通常非常有用。微软业已编译了一系列可能的错误码
并给每个错误码指定了一个32位的数值。
在内部,当一个Windows函数检测到一个错误时,他使用一个称作本地线程存储的机制来关联对应的错误码数值和
调用的线程(本地线程存储在第21章讨论)。他使得各线程各自独立运行而不影响各自的错误码。当函数返回给
你时,他的返回值将表明发生了一个错误。要明确的看到他是哪一个错误,调用以下GetLastError函数:
DWORD GetLastError();
该函数简单地返回线程的32位错误码。
既然有了32位错误码的值,就可以转换该值为更有用的信息。WinError.h头文件包含了微软定义的错误码列表。