读书笔记-Windows核心编程:错误处理
常见的Windows函数返回值数据类型
当windwos 检测到错误时,会使用一种叫线程本地存储区的机制。
其作用是将错误代码与"主调线程’"关联。
是不同线程间互不干扰对方错误代码,使得各个线程独立运行。
当错误产生时,windows函数会返回一个已发生错误,可以使用GetLastError函数,查询上一个函数调用设置的线程的32位错误代码。
<WinError.h>包含了定义的错误代码列表,可以通过查看源码得到。
错误的基本表示方式有,一个消息ID、一个消息文本、和一个标号。
当错误产生是,应该立即调用GetLastError函数,因为此值可能在后续程序运行过程中被改写。(成功调用windows函数可能用ERROR_SUCCESS改写此值)
在一个windows’函数成功调用,可能有两种可能导致成功。
1、内核对象成功创建。
2、存在同名内核对象。
为了区分这2种不同方式导致的函数SUCCESS
windows采用调用GetLastError函数确定额外信息。
如CreatEvent函数创建,存在同名事件,
Return ERROR_ALREADY_EXISTS。
调试添加Wacht监视
FormatMessage-windows提供函数
作用:向用户显示错误的文本描述,而不是提供错误编号。
优点,支持多种语言显示,通过语言标识符作为参数,返回那种语言的的文本。(需要提前作翻译表嵌入程序,或DLL动态导入)
函数定义如下
补充知识:Microsft主控列表
首先,Microsft不存在主控列表,因为主控列表在版本更新时,难以维护。
其次,主控列表问题在于,调用一个windows函数时,其可能调用另一个windows函数,以此类推。任何一个函数都可能失败。
此时,主控列表必须追踪所有函数的路径,生成所有可能的错误代码,实现难度相当之高。
最后,说回第一点,版本更新可能导致函数路径更新,主控列表维护下也势必要接着更新,不便维护。
定义自己的错误代码
使用情况为,我们为他人定义函数,同时提供函数调用失败时的返回情况,给使用者指出其错误原因。
为了指出错误,只需设置线程上的一个错误代码,然后另我们定义的函数返回FALSE、INVALID_HANDLE_VALUE或其他合适的提示错误值。
设置线程错误代码函数为 参数接收任意的32位数值
可以使用WinError.h中的现有代码,当现有代码不适用时,再自定义合适的错误返回值。
以下是WinError.h中的不同错误代码表示的字段。