我们写的函数会用返回值表示程序执行的正确与否,使用void,就意味着程序一定不会出错。Bool类型标识true时为真,false时为假。其他类型根据需要可以定义成不同意义。
 
    Windows除了使用返回值标识函数执行情况,外还引入了错误代码机制。返回值指出函数已发生一个错误。要查看具体是什么错误,就应该使用错误代码。如当我们调用函数打开一个文件,如果打开失败,可能出现多种原因。一是:文件不存在,另一种是该文件被其他程序互斥使用。在这两种情况下都导致文件打开失败,返回值仅仅标识打开失败,但我们不知道原因。这时错误代码就派上用场了。
 
     Windows将错误代码存储于独立于线程的,线程局部存储区中。顾名思义,这个区域是每个线程独有的其他线程无法更改。它存储着一些线程独有的东西,在第二十一章有详细的介绍。在函数执行后,就可以通过调用GetLastError()来获得错误代码。因此这个错误代码永远反映的是上一个函数的执行情况,也就是说它的值是由上一个函数设置的。这就难免发生错误代码被覆盖的情况。如果调用一个函数后,没调用GetLastError就调用其他函数,此时GetLastError返回的是第二个函数的执行情况,而不是第一个,这个要注意。
 
- DWORD GetLastError();
 
由函数原型可以知道该函数返回一个DWROD类型的变量。这仅仅是个数字啊,就像当你要访问一个页面,啥也不说就来个404,对于我们来说不成问题,我们知道这是页面不存在或链接错误。但是对于客户来说可能会一脸茫然,以为是电脑坏了呢。404你是知道,610 ,611,612你知道吗?哈哈,这难不到我们程序员兄弟们,网上一搜全搞定。如果不能上网搜你怎么解决呢。
 
对于GetLastError返回的错误代码,我们不需要考虑这些问题。 VS给我们提供了一个小工具可以将错误代码转换为相应的文本描述。工具--》ErrorLookup。Windows为每个错误代码定义一个宏,
 
如 #define  ERROR_SUCCESS   0L
   #define   ERROR_INVALID_FUNCTION  1L
   #define  ERROR_FILE_NOT_FOUND   2L
..........
 
有了这些宏,只看字面意思都可以知道它到底表示的什么意思,而不用死记硬背这些毫无规律的数字了。
 
一个错误代码对应着一段文本描述,详细的描述错误原因。当我们在自己的程序中检测到一个错误,我们可能需要向用户显示错误的文本描述,而不是一个干巴巴的错误代码,让用户自己去查毕竟不是个好主意。Windows提供一个函数,FormatMesssage可以返回传入的错误代码对应的字符串的首地址。此函数及以后遇到的函数的使用方法不会详细介绍,使用时搜下便知,现在只知道有这样一个函数就可以了。
 
调用GetLastError仅仅是返回windows定义的错误代码,除此之外windows允许这种机制用于我们自己的函数中。比如,我们写了一个函数供别人调用,可以返回false表示调用失败,还可以使用错误代码来提供更多的信息。通过使用SetLastError可以设置我们认为合适的值。它将线程局部存储区的错误代码设置为我们传递的值,此后调用GetLastError返回的就是我们刚刚设置的值。
 
Windows.h中定义了256个错误代码用以标识256种错误情况,我们在调用SetLastError时,可以传入windows定义过得大部分错误代码,毕竟256中错误情况包含了绝大部分情况。如果所有这些都不能反映你的情况,你可以传入大于255的数作为错误代码。大于255的值是windows留给程序员使用的。
 
调试程序时,对上一个错误代码进行监视是很有用的。可以在watch窗口中输入$err,hr。它会在value一列显示当前线程的上一个错误代码和该值对应的文本描述。注意是当前线程的哦!!
 
总结:本章很简单,只需记住GetLastError,FormatMessage,SetLastError就差不多了。

windows核心编程---第一章 谈谈windows中的错误处理机制的更多相关文章

  1. Windows核心编程第一章.错误处理

    Windows核心编程第一章,错误处理. 一丶错误处理 1.核心编程学习总结 不管是做逆向,开始做开发.在Windows下.你都需要看一下核心编程这本书.这本书确实写得很好.所以自己在学习这本书的同时 ...

  2. windows核心编程-第一章 对程序错误的处理

    第一章-对程序错误的处理 在开始介绍Microsoft Windows 的特性之前,必须首先了解 Wi n d o w s的各个函数是如何进行错误处理的. 当调用一个Wi n d o w s函数时,它 ...

  3. windows核心编程---第二章 字符和字符串处理

        使用vc编程时项目-->属性-->常规栏下我们可以设置项目字符集合,它可以是ANSI(多字节)字符集,也可以是unicode字符集.一般情况下说Unicode都是指UTF-16.也 ...

  4. windows核心编程---第九章 同步设备IO与异步设备IO之同步IO

    同步设备IO 所谓同步IO是指线程在发起IO请求后会被挂起,IO完成后继续执行. 异步IO是指:线程发起IO请求后并不会挂起而是继续执行.IO完毕后会得到设备的通知.而IO完成端口就是实现这种通知的很 ...

  5. Windows核心编程第二章,字符串的表示以及宽窄字符的转换

    目录 Windows核心编程,字符串的表示以及宽窄字符的转换 1.字符集 1.1.双字节字符集DBCS 1.2 Unicode字符集 1.3 UTF-8编码 1.4 UTF - 32编码. 1.5 U ...

  6. Windows核心编程 第八章 用户方式中线程的同步(下)

    8.4 关键代码段 关键代码段是指一个小代码段,在代码能够执行前,它必须独占对某些共享资源的访问权.这是让若干行代码能够"以原子操作方式"来使用资源的一种方法.所谓原子操作方式,是 ...

  7. Windows核心编程 第八章 用户方式中线程的同步(上)

    第8章 用户方式中线程的同步 当所有的线程在互相之间不需要进行通信的情况下就能够顺利地运行时, M i c r o s o f t Wi n d o w s的运行性能最好.但是,线程很少能够在所有的时 ...

  8. Windows核心编程 第九章 线程与内核对象的同步(下)

    9.4 等待定时器内核对象 等待定时器是在某个时间或按规定的间隔时间发出自己的信号通知的内核对象.它们通常用来在某个时间执行某个操作. 若要创建等待定时器,只需要调用C r e a t e Wa i ...

  9. windows核心编程-第二章 Unicode

    第2章U n i c o d e 随着M i c r o s o f t公司的Wi n d o w s操作系统在全世界日益广泛的流行,对于软件开发人员来说,将目标瞄准国际上的各个不同市场,已经成为一个 ...

随机推荐

  1. 【20160924】GOCVHelper MFC增强算法(4)

    //string替换     void string_replace(string & strBig, const string & strsrc, const string & ...

  2. EventBus使用详解(二)——EventBus使用进阶

    一.概述 前一篇给大家装简单演示了EventBus的onEventMainThread()函数的接收,其实EventBus还有另外有个不同的函数,他们分别是: 1.onEvent2.onEventMa ...

  3. 【前端】互联网公司2014前端笔试面试题JavaScript篇(待续)

    // 网上找的题目,自己做了下 /**************************** *1. 用js实现随机选取10–100之间的10个数字,存入一个数组,并排序 *************** ...

  4. [四校联考P3] 区间颜色众数 (主席树)

    主席树 Description 给定一个长度为 N 颜色序列A,有M个询问:每次询问一个区间里是否有一种颜色的数量超过了区间的一半,并指出是哪种颜色. Input 输入文件第一行有两个整数:N和C 输 ...

  5. Swift基础语法学习总结

    Swift基础语法学习总结Swift高级语法学习总结Swift语法总结补充(一) 1.基础  1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift ...

  6. "Resuming debugger: error during debugging loop: TypeError: firstViewRangeElement is null"

    翻译过来:“重启调试器:错误调试期间循环:TypeError:firstViewRangeElement为空” 写了一个项目,其中使用到了上传图片的插件,在本地上传图片一切正常,发布到服务器却不正常了 ...

  7. PHP中的闭包和匿名函数

    闭包的概念是指在创建闭包时,闭包会封装周围的状态的函数.即便闭包所在环境不在了.但闭包中封装的状态依然存在. 匿名函数就是没有名称的函数. 它们看似很函数一样,实际上它们属于Closure类的实例 P ...

  8. http知识

    http请求的过程:客户端发起请求,创建端口:http服务器在端口监听客户端请求:http服务器向客户端返回状态和内容. 浏览器搜索自身的DNS缓存-->搜索操作系统自身的DNS缓存(浏览器没有 ...

  9. Java 序列化 反序列化 历史版本处理

    直接引用  http://www.cnblogs.com/xdp-gacl/p/3777987.html

  10. Spirng中Mongodb中write-concern的解释

    Spring在插入数据库时没有返回状态配置:write-concern获取异常<beans xmlns="http://www.springframework.org/schema/b ...