我们写的函数会用返回值表示程序执行的正确与否,使用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. jQuery和Ajax的使用(杂记)

    在jsp文件的获取绝对路径标签,其他jsp文件调用就行了 <%@ page language="java" contentType="text/html; char ...

  2. C++文本的读取和写入

    #include <iostream> #include <sstream> #include <fstream> #include <string> ...

  3. [转]unicode,ansi,utf-8,unicode big endian的故事

    unicode,ansi,utf-8,unicode big endian的故事很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的 ...

  4. ggplot2.multiplot:将多个图形使用GGPLOT2在同一页上

    一页多图 介绍 ggplot2.multiplot是一个易于使用的功能,将多个图形在同一页面上使用R统计软件和GGPLOT2绘图方法.这个功能是从easyGgplot2包. 安装并加载easyGgpl ...

  5. C++11中对类(class)新增的特性

    C++11中对类(class)新增的特性 default/delete 控制默认函数 在我们没有显式定义类的复制构造函数和赋值操作符的情况下,编译器会为我们生成默认的这两个函数: 默认的赋值函数以内存 ...

  6. 关于web2py外网访问,图形界面不显示等问题的解决办法

    首先系统版本是ubuntu 15.04,系统默认安装了两个版本的python, sudo python web2py.py 默认会调用python2.7版本来执行 会提示 pydo@planpls:/ ...

  7. linux重启命令学习

    Linux关闭和重启系统一般使用相同的命令可以实现. 在Linux系统下常用在关机/重启命令有shutdown.halt.reboot和init,但每个命令的内部工作过程是不同的. 1.shutdow ...

  8. CSS使用总结

    1.visibility和display的区别: visibility:visible; 显示visibility:hidden; 隐藏,但是保留元素所占的空间display:block;       ...

  9. 分部类(partial)

    一般来说,一个类.结构或接口位于一个源文件中,但某些情况,比如大型项目.特殊部署时,可能需要把一个类.结构或接口放在几个文件中来处理.等到编译时,自动把它们合起来,这就得应用 C# 分部类了. C# ...

  10. Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)

    在android的应用层中,涉及到很多应用框架,例如:Service框架,Activity管理机制,Broadcast机制,对话框框架,标题栏框架,状态栏框架,通知机制,ActionBar框架等等. ...