我们写的函数会用返回值表示程序执行的正确与否,使用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. 【转】Struts1.x系列教程(5):HTML标签库

    转载地址:http://www.blogjava.net/nokiaguy/archive/2009/01/archive/2009/01/archive/2009/01/archive/2009/0 ...

  2. 【Tomcat】Tomcat Session在Redis共享

    参考的优秀文章 Redis-backed non-sticky session store for Apache Tomcat 简单地配置Tomcat Session在Redis共享 我使用的是现有的 ...

  3. Spring MVC 线程安全问题的思考

    Spring MVC 线程安全问题的思考 在读一些博文的时候发现有些文章对SpringMVC的Controller线程安全的验证并不正确,比如没有探究controller线程不安全的具体原因,比如将请 ...

  4. linux环境下安装mysql数据库遇到的问题

    总结一句话: 安装完mysql数据库记得授权远程登录.   坑的现象: ERROR 1045 (28000): Access denied for user 'guoxp'@'localhost' ( ...

  5. 我的android学习经历32

    android系统架构 1.Linux内核层(LINUX KERNEL) 这是系统架构的最低层,这层为android设备的硬件提供了驱动 2.系统运行库层(LIBRARIES) 这一层为倒数第二层,利 ...

  6. sql 函数的理解

    CAST (expression AS data_type) 用于数据的转化 isnull(@s+',','select years,months,') 判断(@s+',')是否为空,注意点,即使(@ ...

  7. Codeforces Round #263 (Div. 1)

    B 树形dp 组合的思想. Z队长的思路. dp[i][1]表示以i为跟结点的子树向上贡献1个的方案,dp[i][0]表示以i为跟结点的子树向上贡献0个的方案. 如果当前为叶子节点,dp[i][0] ...

  8. Eclipse SVN 安装步骤

    1.在eclipse中安装svn插件 Eclipse ---> Help ---> Install New Software ---> Add Name : 任意 Location ...

  9. c++ 在windows下建立目录

    #include <direct.h> #include <stdlib.h> #include <stdio.h> int main( void ) { ) { ...

  10. [分享] WIN7x64封装体积小于4G制作过程

    raymond 发表于 2015-11-1 18:27:17 https://www.itsk.com/thread-359041-1-1.html 前人栽树,后人乘凉!感谢各位大神的作品!我只是按部 ...