Windows核心编程读书笔记-1

Windows核心编程这本书目前为止看了4章不到我觉得升华了我对Windows系统的认识,有种茅塞顿开的感觉,本读书笔记系列是我详细阅读《Windows核心编程》第五版并为了更好理解而准备的,本篇是第一章。

第一章:

第一章内容非常短,主要是讲述了如何在未来的阅读中解决异常和编译错误而写的,主要是如下两个API:

 

Windows核心编程读书笔记-1_第1张图片

GetLastError这个函数是返回上一个错误的数字代码,Windows程序中发生错误都会有一个相应的数字作为对应而这个数字也有相应的文字描述,而GetLastError这个函数仅仅返回的是数字代码。所有的32位数字代码定义存在于WinError.h中。

Windows核心编程读书笔记-1_第2张图片

如何得到GetLastError()返回错误代码的具体描述呢? 可以通过FormatMessage()函数来实现,这个函数第一个参数dwFlags标志了一些API的特点,书中主要介绍了三个:

FORMAT_MESSAGE_ALLOCATE_BUFFER 标志,这个标志意思是如果调用了FormatMessage函数那它会帮你分配一段内存来装载错误信息,如果使用了这个标志那么FormatMessage中的lpBuffer与nSize参数只要填写一个指针与0就行了,函数会自动帮你完成分配内存释放内存与计算该段内存大小的工作。

FORMAT_MESSAGE_FROM_SYSTEM标志,该标志含义可以直接看MSDN中的一段描述:

如果这个标志被使用,那么应用能够传递GetLastError函数的结果来获取系统定义的错误信息描述。

FORMAT_MESSAGE_IGNORE_INSERTS标志,该标志的意思就是允许我们使用%占位符,比如说%d, %s之类。

FORMAT_MESSAGE_FROM_HMODULE标志,该标志存在于第一章附带程序中,那个程序在系统定义的错误代码中未找到对应项时,于lpSource中寻找。如果lpSource被指定为NULL,那就在本模块中寻找。

Windows核心编程读书笔记-1_第3张图片

最后一个参数是va_list类型的,关于va_list可以参考我的一篇博客:

va_list

总结一下这个函数的目的主要是为了格式化显示信息,但是在这一章中,把这个函数用作显示错误信息,所以一般情况下最后一个参数设为NULL。

 

除了用代码来显示错误信息,Windows核心编程还教我们了如何在调试的时候获取,按下F11进入调试模式后:

Windows核心编程读书笔记-1_第4张图片

比如FindWindow这个函数中,第一个参数填写出了问题,可在Watch(即监视)窗口中对应的hwnd变量改名为$err,hr,即可在后面值项中获得相应的错误信息,这里的错误信息为:"0x0000007b 文件名、目录名或卷标语法不正确"。

Windows核心编程还告诉我们可以使用VS自带的工具Error Loopup来寻找错误:

Windows核心编程读书笔记-1_第5张图片

该工具位于:C:\....\Microsoft Visual Studio 10.0\Common7\Tools中。

与此同时,我们甚至能够自己来定义一个32位的错误代码,使用SetLastError()函数,它还有个SetLastErrorEx()拓展函数,但是与其是一样的,因为SetLastErrorEx()的第二个参数被保留忽略:

Windows核心编程读书笔记-1_第6张图片

由于前256个错误代码是系统定义的,所以我们自己定义的时候一般定义在256后,同时错误代码拥有不同的字段,如下:

Windows核心编程读书笔记-1_第7张图片

需要注意的是29位必须为1,因为这是我们自己定义的错误号码。

书中附带程序是一个自己写的ErrorLookup程序,该程序以SDK编程角度来讲非常简单,但是WIndows核心编程中所用了一种新的编写SDK程序的方法,利用大量的宏与各类新的头文件来描述消息驱动的Windows程序,我看了后感觉耳目一新,具体内容我会专门用一篇博客来谈论,其内容位于Windows核心编程书本的附录中。

 

 

你可能感兴趣的:(Windows系统编程)