前言
Microsoft Windows是一个复杂的操作系统。它提供的特性非常丰富,对任何个人而言,要想完全透彻地理解整个系统几乎不可能。其复杂性也使我们很难确定应该把主要精力集中在哪些地方。万丈高楼平地起,就我个人而言,我始终倾向于从最底层开始,深刻理解系统的基本构件。一旦掌握了最基本的东西,就很容易向自己的知识库中逐步添加更多高层的东西。所以本书将集中介绍Windows的基本构件和基础概念,对于构架和实现Windows应用程序来说,这些都是必须掌握的。简而言之,本书是向读者介绍各个Windows特性,并介绍如何通过C和C++(www.cppentry.com)语言来了解并使用这些特性。
虽然本书不会涵盖某些Windows概念,比如组件对象模型(Component Object Model ,后面简称为COM),但COM是在进程、线程、内存管理、DLL、线程本地存储区以及Unicode等基本构件的基础上构建的。如果了解了这些基本构件,那么要理解COM就相当于理解如何使用这些基本构件。对于那些试图跳过这些基本构件,悉心钻研COM体系结构的朋友,我深表同情。要完善知识库,他们还有很长一段路要走,这必然会对他们的代码和软件开发进度产生很大的负面影响。
Microsoft .NET Framework的公共语言运行时(Common Language Runtime,CLR)是本书未涉及的另一种技术(感兴趣的朋友可以阅读我的另一本专著《框架设计:CLR via C#》)。不过,CLR是作为动态链接库(dynamic link library,DLL)中的一个COM对象来实现的,它需要被载入到进程中,它需要使用线程来执行代码,它需要处理Unicode字符串,它还需要在内存中对这些字符串进行管理。因此,本书所介绍的基本构件仍然有助于软件开发人员编写托管代码。此外,借助于CLR的平台调用(Platform Invocation,P/Invoke)技术,我们可以调用本书所介绍的各种Windows API。
如此一来,本书的宗旨是介绍每一个Windows开发人员都应该掌握的基本的Windows构件(至少在我看来如此)。在介绍每一个构件的时候,我还会描述系统是如何使用这些构件的,我们自己的应用程序如何充分利用这些构件。在很多章中,我会介绍如何创建自己的构件。我们自己的构件一般都实现为普通函数或C++(www.cppentry.com)类,它们把一些Windows构件组合在一起,从而创造出一个整体,其结果远远大于各部分之和。
64位Windows操作系统
Microsoft发售支持x86 CPU体系结构的32位Windows操作系统已经有多年的历史。如今,Microsoft还提供支持x64和IA-64 CPU体系结构的64位Windows操作系统。基于这些64位CPU体系结构的计算机迅速为市场所接受。事实上,在不远的将来,所有台式机和服务器都将使用64位CPU。为此,Microsoft已发表声明,Windows Server 2008将是最后一款32位版本的Windows操作系统!对于开发人员而言,现在是时候集中精力让自己的应用程序能在64位Windows操作系统上正常运行了。贯穿本书,将全面覆盖相关的知识,让开发人员的应用程序能够在64位Windows操作系统(同时也包括32位Windows)上正常运行。
应用程序从64位地址空间所获得的最大的好处是,能够轻松处理大量数据,因为应用程序的进程不再受限于2GB可用地址空间。即使应用程序并不需要所有这些空间,Windows本身也可以利用这个显然大得多的地址空间(约8TB)来加快运行速度。
对于64位Windows操作系统,我们需要了解哪些呢?下面简单看一看。
64位Windows内核是32位Windows内核的移植版本。这意味着以前所学的32位Windows所有细节和难点均适用于64位Windows。事实上,Microsoft已经修改了32位Windows的源代码,使其既可以编译生成32位系统,也可以编译生成64位系统。两个系统使用同一个源代码库,所以新的特性和缺陷的修复会同时应用于这两个系统。
因为内核使用相同的代码和基本概念,所以在两个平台上的Windows API是一样的。这意味着我们不必重新设计或实现应用程序,就能让它在64位Windows操作系统上运行。我们只需要对源代码做少许改动,然后重新构建应用程序即可。
为了保持向后兼容性,64位Windows操作系统是可以执行32位应用程序的。但是,如果应用程序是作为64位应用程序来生成的,那么它的性能会有显著的提高。
因为移植32位代码非常容易,所以64位Windows操作系统中已经有很多的设备驱动程序、工具和应用程序了。遗憾的是,Visual Studio是32位的,而且Microsoft似乎还并不急于将其移植为64位的。不过,好消息是32位的Visual Studio在64位Windows操作系统上的确运行得非常好,只不过其数据结构的地址空间有限。而且,我们还可以用Visual Studio来调试64位应用程序。
并不需要学习太多新知识。大多数数据类型仍然保持32位宽度,这是很多读者很高兴看到的。它们是INT,DWORD,LONG和BOOL等。事实上,大多数情况下我们只需要担心指针和句柄,因为它们现在变成64位了。
对于如何将现有源代码修改为64位,Microsoft已经提供了相当丰富的信息,所以我们不打算在本书中深入这些细节。不过,在我写每一章的时候,我都会考虑到64位Windows操作系统。在适当的时候,我会加入64位Windows的特定信息。同时,我还在64位Windows中编译和测试了本书中的所有示例程序。所以,如果读者效仿书中的示例程序和我的做法,那么创建一个能够为32位或64位Windows编译的源代码库应该完全不成问题。
《Windows核心编程(www.cppentry.com)(第5版)》中有哪些新内容
在过去,本书曾经被冠以"Advanced NT","Advanced Windows"和"Programming Application for Microsoft Windows"等名字。为保持这个传统,本书的第5版也有一个新的书名,即Windows via C/C++(www.cppentry.com)。新的书名表示本书是为打算理解Windows的C和C++(www.cppentry.com)程序员设计的。第5版全面覆盖了Windows XP,Windows Vista和Windows Server 2008中的170个新增函数和Windows特性。
有些章已经全部重写,比如第11章,这一章解释了如何使用新的线程池API。第4版原有的各章都已经大幅修订,以突出介绍新的特性。例如,在第4章,现在已经包含了用户帐户控制(User Account Control)的介绍,第8章现在介绍了新的同步机制。
同时,我还更全面地介绍了C/C++(www.cppentry.com)运行库如何与操作系统交互,特别强调安全性和异常处理。最后,第5版新增了两章内容,解释了I/O操作的工作原理以及如何深入理解新的Windows Error Reporting系统,此系统改变了我们必须考虑应用程序错误报告和应用程序恢复的方式。
除了新的结构和更深入的介绍,我还增加了大量新的内容。第5版着重在以下几个方面进行了更深入的讲解。
Windows Vista和Windows Server 2008新增特性 当然,除非本书涵盖了Windows XP,Windows Vista,Windows Server 2008和C/C++(www.cppentry.com)运行库的所有新特性,否则它就算不上是真正的修订。第5版着重强调安全字符串函数、内核对象变化(比如名称空间和边界描述符)、线程和进程属性列表、线程和I/O优先级安排、取消同步I/O、向量异常处理等方面的最新信息。
64位Windows支持 本书旨在解决64位Windows的特定问题,所有示例程序都在64位Windows上生成并测试过。
使用C++(www.cppentry.com)语言 示例程序使用C++(www.cppentry.com)语言,所需要的代码更少,而且C++(www.cppentry.com)的逻辑更清楚,也更容易理解。
可重用的代码 我尽可能让源代码既通用,又可重用。这样一来,读者只需对单独的函数或者整个C++(www.cppentry.com)类稍作改动或根本无须做改动,就可以在自己的应用程序中使用它们。C++(www.cppentry.com)语言的使用进一步增强了代码的可重用性。
ProcessInfo实用工具 前几版中一直都有的这个特殊示例程序已经被增强,可以显示进程拥有者、命令行和UAD相关详情。
LockCop实用工具 这个示例程序是新增的。它显示了系统中有哪些进程正在运行。一旦选定了一个进程,这个工具就会列出进程中的所有线程,以及每个线程是被哪种同步机制阻塞,同时明确地指出死锁的情况。
API拦截 我介绍了一些更新后的C++(www.cppentry.com)类,这些类使得对进程中的一个或所有模块进行API拦截变得相当简单。我的代码甚至拦截了应用程序在运行的时候对LoadLibrary和GetProcAddress的调用,这进一步加强了对API的拦截。
结构化异常处理有所增强 我重写并重新组织了结构化异常处理的内容。我进一步介绍了未处理异常,并针对如何根据自己的需求自定义Windows Error Reporting系统。
示例代码和系统需求
本书的示例程序可以从本书配套网页下载,网址如下:
http://www.wintellect.com/books.aspx
为了构建示例程序,读者朋友需要安装Visual Studio 2005或更新版本,Microsoft Platform SDK for Windows Vista和Windows Server 2008(有些版本的Visual Studio自带这个SDK)。此外,要运行示例程序,还需要一台已安装Windows Vista(或更新的版本)的计算机(或虚拟机)。
本书支持
我们已经尽力确保本书及其配套内容的准确性。我们会将收集到的勘误或改动添加到一个勘误表中,读者可以从以下网址下载这个勘误表:
http://www.wintellect.com/books.aspx
问题和评论
有关本书或者网络配套内容的任何评论、问题或想法,或者通过访问上述网址仍然未能解决的疑惑,请通过电子邮件发送给Microsoft Press:
mspinput@microsoft.com
或者将信件寄到以下地址:
Microsoft Press
Attn:Windows via C/C++(www.cppentry.com) Edition
One Microsoft Way
Redmond,WA 98052-6399
请注意,上述地址并不提供对Microsoft软件产品的支持。
【责任编辑:
云霞 TEL:(010)68476606】