《Windows核心编程》第1章 对程序错误的处理

当调用一个Windows函数时,它首先要检验传递给它的的各个参数的有效性,然后再设法执行任务。如果传递了一个无效参数,或者由于某种原因无法执行这项操作,那么操作系统就会返回一个值,指明该函数在某种程度上运行失败了。

一个Windows函数返回的错误代码对了解该函数为什么会运行失败常常很有用。微软公司编译了一个所有可能的错误代码的列表,并且为每个错误代码分配了一个32位的号码。

当一个Windows函数检测到一个错误时,它会使用一个称为线程本地存储器(thread-local storage)的机制,将相应的错误代码号码与调用的线程关联起来。这将使线程能够互相独立地运行,而不会影响各自的错误代码。当函数返回时,它的返回值就能指明一个错误已经发生。若要确定这是个什么错误,可以调用GetLastError函数。

WinError.h头文件包含了微软公司定义的错误代码的列表。每个错误都有3种表示法:一个消息ID(这是你可以在源代码中使用的一个宏,以便与 GetLastError的返回值进行比较),消息文本(对错误的英文描述)和一个号码(应该避免使用这个号码,可使用消息ID)。

当Windows函数运行失败时,应该立即调用GetLastError函数,以便定位失败原因。否则如果调用另一个Windows函数后,它的值很可能被改写。
 
有些Windows函数能够成功运行,其中有许多原因。例如,创建指明的事件内核对象之所以能够取得成功,是因为你实际上创建了该对象,或者因为已经存在带有相同名字的事件内核对象。要搞清楚成功的原因,我们也能够通过调用GetLastError函数来确定其他的一些信息。

在VC调试状态下,可以配置Watch窗口,以便始终都能显示线程的最后错误代码的号码和该错误的英文描述。通过选定Watch窗口中的一行,并键入“@err,hr”,就能够做到这一点。此外Visual studio还提供一个小的实用程序Error Lookup(可以在Tools菜单下面找到),可以使用它将错误代码的号码转换成相应文本描述。

如果想要向用户显示该错误的文本描述,Windows提供了一个函数FormatMessage,可以将错误代码转换成它的文本描述。该函数能够检测出用户首选的语言,并返回相应的文本。

如果你编写了一个给其他人调用的函数,你的函数可能由于某种原因而运行失败,你必须向函数的调用者说明它已经运行失败。若要指明函数运行失败,只需要设定线程的最后的错误代码,然后让你的函数返回FALSE、INVALID_HANDLE_VALUE、NULL或者返回任何合适的信息。若要设定线程的最后错误代码,可以调用函数:VOID SetLastError(DWORD dwErrCode);
将你认为WinError.h中合适的32位号码传递给该函数,当然也可以自己定义这个错误代码。

错误代码是个32位的数字,被划分成各个域。重要域是第29位。微软公司规定,他们建立的所有错误代码的这个信息位均使用0。如果创建自己的错误代码,必须使29位为1,以避免和微软公司的错误代码发生冲突。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值