我们写的函数会用返回值表示程序执行的正确与否,使用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. 至强CPU性能排行,从X3210起,由低至高排列。

    X3210X3220E5410E5506X5355X3320E5507X5365E5-2603E3-1220LE5-2403E5607X3330L5506X3230L5420E5-2407W3520E ...

  2. AES对称加密和解密

    package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingException; impo ...

  3. python(九)re模块

    python中re模块提供了正则表达式相关操作. 1. 字符串匹配: .    匹配除换行符以外的任意字符 \w 匹配字符或数字或下划线或汉字 \s  匹配任意空白字符 \d 匹配数字 \b 匹配单词 ...

  4. 替换 data.frame 中的特殊的值

    替换空值: foo <- data.frame("day"= c(1, 3, 5, 7), "od" = c(0.1, "#N/A", ...

  5. VB6中的引用传递 与 VB.NET中的引用传递的区别

    首先注意一点,在VB6中缺省参数传递的方式是:引用传递,而在VB.NET中缺省参数传递的方式是:值传递. 然后我们看下面VB6中的引用传递与VB.NET中的引用传递的对比. VB6中的引用传递 Pri ...

  6. Ubuntu 16.04 + Caffe

    主要参考: https://github.com/BVLC/caffe/wiki/Ubuntu-16.04-or-15.10-Installation-Guide http://caffe.berke ...

  7. (转)内联(inline)函数与虚函数(virtual)的讨论

    本文转自: http://topic.csdn.net/t/20051220/09/4469273.html 函数的inline属性是在编译时确定的, 然而,virtual的性质是在运行时确定的,这两 ...

  8. [Prodinner项目]学习分享_第一部分_Model层

    事先声明一下,小弟我是菜鸟一个,在研究大半天之后,基本会开发一些简单的功能了,特此分享一下,也为自己做一个笔记. 项目简介: MVC4 , EF5 , Code First , 多层架构 开发工具:V ...

  9. iOS - iOS 适配

    前言 什么是适配: 适应.兼容各种不同的情况. iOS 开发中,适配的常见种类: 1)系统适配, 针对不同版本的操作系统进行适配. 2)屏幕适配,针对不同大小的屏幕尺寸进行适配. iPhone 的尺寸 ...

  10. Django1.9开发博客(9)- 用户认证

    你应该注意到了一点,当你去新建.修改和删除文章的时候并不需要登录,这样的话任何浏览网站的用户都能随时修改和删除我的文章.这个可不是我想要的! 编辑和删除的认证 我们需要保护post_new, post ...