- 定价:¥99.00
- 校园优惠价:¥79.20 (80折) (马上了解)
- 评分:
(已有198条评价)
- 促销活动:
- 我要买:
基本信息
- 原书名:Windows via C/C++
- 原出版社: Microsoft Press
【插图】

编辑推荐
权威力作 再度新鲜亮相.
名著名译 彰显经典魅力
中英联动 丰富阅读体验..
深刻剖析底层实现机理
直击Windows编程精髓...
内容简介
作译者
目录
第1章 错误处理
1.1 定义自己的错误代码
1.2 ErrorShow示例程序
第2章 字符和字符串处理
2.1 字符编码
2.2 ANSI字符和Unicode字符与字符串数据类型
2.3 Windows中的Unicode函数和ANSI函数
2.4 C运行库中的Unicode函数和ANSI函数
2.5 C运行库中的安全字符串函数
2.5.1 初识新的安全字符串函数
2.5.2 在处理字符串时如何获得更多控制
2.5.3 Windows字符串函数
2.6 为何要用Unicode
2.7 推荐的字符和字符串处理方式
2.8 Unicode与ANSI字符串转换
2.8.1 导出ANSI和Unicode DLL函数
2.8.2 判断文本是ANSI还是Unicode
第3章 内核对象
3.1 何为内核对象
译者序
——译 序 1
你是否在Windows平台上开发应用程序?你是否希望对Windows提供的各项服务有更深入的理解?你是否需要使用Windows提供的高级功能?你是否在找寻一些Windows实用技术来解决项目中的难题?如果对上述问题的回答是肯定的,那么你绝对不应该错过本书。
自这本《Windows核心编程(第4版)》出版至今,转眼间已经过去了八年。在这八年期间,Windows世界已经发生了许多变化,Windows XP、Windows 2003、Windows Vista以及Windows Server 2008相继推出。与之对应的,《Windows核心编程》(第5版)也与时俱进,针对最新的Windows操作系统进行更新,为我们了解并发挥最新的平台特性提供了宝贵的指引。
这是一本Windows系统编程的权威专著,许多年之前我就已经读过它的第4版;这是一本生动的教科书,它帮助我更深入地了解Windows系统;同时它又是一本参考书,在我开发Windows应用程序的过程中遇到问题时,我会到本书中寻找答案。希望它同样能够为你答疑解惑,并解决你的实际问题。
本书由葛子昂、周靖、廖敏共同翻译:第8~22章由葛子昂翻译,第1~6章由周靖翻译,第23~26章及附录由廖敏翻译,第7章由刘江友情客串翻译,全书由葛子昂最终审阅和统稿。鉴于时间和精力有限,一些翻译难免存在不足甚至错误之处,为此我建立了一份网上勘误表。如果读者发现任何错误,都可以通过该网页与我联系,一旦确认,我会立即将其更新到勘误表中。勘误表的网址为www.gesoftfactory.com/ge/WindowsViaCpp。
最后,感谢Jeffrey和Christophe在本书翻译过程中不厌其烦地解答我的问题,核实并纠正英文版中发现的一些错误。感谢李劲松、王渊峰、张羿、孙展波、谭映辉以及孙祺对中文版的全部或部分章节进行了审阅并提出宝贵的意见。感谢潘爱民在百忙中抽空阅读部分译稿,并给以反馈。感谢妻儿和家人对我的理解和支持,本书的翻译工作占用了本应属于你们的时间,现在终于可以有更多时间来陪伴你们了。
继往开来创新高,推陈出新品佳酿
——译 序 2
1993年,本书第1版Advanced NT出版的时候,我和三个朋友一起成立了一个“四喜工作室”。由于四个人只有一台计算机,所以我们几个每天一睁眼,第一件事情便是抢占计算机,这台286配置简单,根本无法与现在的计算机相提并论,而且当时也没有网络,所以计算机的用途非常有限,主要也就是文字处理,玩游戏,编简单程序等,但它带给我们的乐趣至今难以忘怀。受限于当时的环境,数据和游戏的交换也基本上在圈内好友之间进行,就像搞地下活动一样约好时间地点碰头。幸运的是,由此结交了一大批计算机爱好者,后来他们大多成为IT届的领军人物。
其时,从大环境看,我国网络也开始悄然起步。1993年年初,中国科学院高能物理研究所接入斯坦福大学线性加速器中心的64K专线开通,国内科学家开始在国内使用电子邮件。随后几个月的时间,金桥工程和域名体系的确立和部署,三大院校网的连接,最终将我国带入信息高速公路,推动我国IT业的迅猛发展。
由此而来的便是计算机类图书和报纸期刊的炙手可热,《电脑报》等IT媒体相继崛起,计算机图书更是出现供不应求的现象,在当时,即便是国外引进翻译出版的图书,也能轻松突破几万册的销量,计算机图书的发展达到全盛时期。
在这个时期,国内开发人员先后成为Jeffrey和McConell等大师的拥趸。因为在IT界,虽然资深程序员不胜枚举,但同时又是深受程序员喜爱的技术图书作家的乏善可陈。而像他们那样,曾经写过多部书,部部都引人入胜,令人醍醐灌顶,就更是凤毛麟角。他们是Windows编程世界中的中流砥柱,也是Windows技术当之无愧的布道者。曾有不少读者放言,只要是Jeffrey的书,他们必定会花时间研读,并加以收藏。这一点都不夸张,我们同时代的很多人都是在这批书的滋润下成长起来的。他们熟读了Advanced NT之后,又如痴如狂地捧起了Advanced Windows和Programming Application for Microsoft Windows等续作。他们是Jeffrey的粉丝,同时也是微软开发阵营的主力军。
随着微软宣布放弃对Windows XP以及以前版本的支持,Windows Vista的普及势在必行,迟早会安装到普通用户的计算机上。Windows Vista有很多吸引人的新特性,相信大家不用不知道,一用忘不了。(在翻译Microsoft Press的Windows Vista Inside Out一书的过程中,我已经深切体会到她的妙处)。作为一名程序员,有必要在第一时间适应在新的操作系统下的编程。历经15年,本书也随着Windows操作系统的“改朝换代”,升级到第5版,即Windows via C/C++。如果您要用C/C++开发Windows应用程序,那就不要走弯路,直接让Jeffrey告诉您如何利用Windows的新特性和新函数来编写出高效、优美的Windows应用程序。
对于本书的学习,谨以《史记 孔子世家》中孔子学琴一文与大家共勉(请原谅,这里引用了我另一本书的译序,因其寓意深刻,故忍不住又拿出来与大家分享?):
前言
Microsoft Windows是一个复杂的操作系统。它提供的特性非常丰富,对任何个人而言,要想完全透彻地理解整个系统几乎不可能。其复杂性也使我们很难确定应该把主要精力集中在哪些地方。万丈高楼平地起,就我个人而言,我始终倾向于从最底层开始,深刻理解系统的基本构件。一旦掌握了最基本的东西,就很容易向自己的知识库中逐步添加更多高层的东西。所以本书将集中介绍Windows的基本构件和基础概念,对于构架和实现Windows应用程序来说,这些都是必须掌握的。简而言之,本书是向读者介绍各个Windows特性,并介绍如何通过C和C++语言来了解并使用这些特性。
虽然本书不会涵盖某些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++类,它们把一些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核心编程(第5版)》中有哪些新内容
在过去,本书曾经被冠以“Advanced NT”,“Advanced Windows”和“Programming Application for Microsoft Windows”等名字。为保持这个传统,本书的第5版也有一个新的书名,即Windows via C/C++。新的书名表示本书是为打算理解Windows的C和C++程序员设计的。第5版全面覆盖了Windows XP,Windows Vista和Windows Server 2008中的170个新增函数和Windows特性。
有些章已经全部重写,比如第11章,这一章解释了如何使用新的线程池API。第4版原有的各章都已经大幅修订,以突出介绍新的特性。例如,在第4章,现在已经包含了用户账户控制(User Account Control)的介绍,第8章现在介绍了新的同步机制。
同时,我还更全面地介绍了C/C++运行库如何与操作系统交互,特别强调安全性和异常处理。最后,第5版新增了两章内容,解释了I/O操作的工作原理以及如何深入理解新的Windows Error Reporting系统,此系统改变了我们必须考虑应用程序错误报告和应用程序恢复的方式。
序言
当Jeffrey请我为本书写一篇序的时候,我爽快地答应了。我还记得在上个世纪90年代早期寻找本书第1版《高级Windows NT编程》(Advanced Windows NT)时的情形。那时我刚刚开始开发Windows应用程序。在我开发诸如Filemon,Regmon以及HandleEx(现在叫Process Explorer)之类的应用程序时,它既是一本指南,又是一本参考手册。本书第1版面向Windows系统编程,而Charles Petzold的《Windows编程》(Programming Windows)则面向用户界面编程。
在过去的几年中,Jeffrey已经将他关注的重点转向了托管代码,这使得为本书作序对我来说大有意义。Jeffrey已经成为.NET CLR和C#系统编程的权威,当Microsoft还在设计.NET的时候,他的这种转换就已经开始了。他还不时地“嘲弄”我和我的搭档David Solomon——我们合著了《深入解析Windows操作系统》(Windows Internals)系列,说本机代码编程(native code programming)已经日暮西山。我和David始终坚信本机代码编程由于具有不同的API、不同的失败语义(failure semantics)、不同的部署方式以及不同的运行时特征,因此将继续满足某一类应用程序的需求,或者至少是满足部分应用程序的需求。相当一部分Windows客户端应用程序仍然是用本机代码编写的,甚至Microsoft的旗舰服务器端应用程序,包括IIS、SQL Server以及Exchange,几乎完全是用本机代码编写的,或者使用了用本机代码编写的组件。因此,我将本书视作Jeffrey对我们这种信念的无言的肯定。
Windows一直在演化,本书亦是如此。它之前已经经历了许多个版本,甚至书名也一变再变。比如,本书上一版名为Programming Applications for Microsoft Windows。但无论书名如何改变,它的每一版在我的书架上都占有一席之地。(这与Jeffrey给我在书上签名不无关系,不仅如此,而且所签的内容还是我选的,比如“我从Mark那里学到了一切”之类可供炫耀的话。)这一个版本不仅只是换了一个新的书名,它还介绍了Windows Vista和Windows Server 2008中引入的最新API,包括线程、安全、异常处理以及I/O。
本书提供了大量的编程实例,既紧凑又有效地展示了各种关键概念,这使得它尤其有用。许多作者在将代码与读者分享的时候,并没有认识到许多开发人员会直接将代码复制和粘贴到将要发行的应用程序中去。但与我们在互联网上搜索到的代码不同,Jeffrey和Christophe已经确保书中的代码在编写时兼顾了高质量和高准确性。
我相信,无论您是Windows应用程序编程的新手,还是完全用本机代码来编写应用程序或通过P/Invoke来调用.NET Framework未提供的API的老手,都会发现本书的价值。它将有助于发挥强大的平台特性并降低其复杂度,帮助开发人员开发伸缩性更好、更可靠、更安全以及性能更高的应用程序。显然,它依旧会出现在我的书架上,希望这一次Jeffrey和Christophe都能为我签上“我从Mark那里学到了一切”。
Mark Russinovich
(Windows Internals作者)
Technical Fellow
Microsoft Corporation
媒体评论
——Mark Russinovich,《深入解析Windows操作系统》作者
要想在Windows编程方面更上一层楼,迟早都需要好阅读并领会本书的内容。
——Francis Glassborow,C/C++用户协会前主席
搞Windows程序设计有两方面的资源是不可或缺的:一是MSDN,另一个便是本书。
——侯捷,著名技术作家
书摘
第1章 错误处理
1.1 定义自己的错误代码
1.2 ErrorShow示例程序
在深入讨论Microsoft Windows提供的诸多特性之前,应该先理解各个Windows函数如何进行错误处理的。
调用Windows函数时,它会先验证我们传给它们的参数,然后再开始执行任务。如果传入的参数无效,或者由于其他原因导致操作无法执行,则函数的返回值将指出函数因为某些原因失败了。……