Chinaunix首页 | 论坛 | 博客
  • 博客访问: 524683
  • 博文数量: 213
  • 博客积分: 7027
  • 博客等级: 少将
  • 技术积分: 1974
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-24 08:51
文章分类

全部博文(213)

文章存档

2007年(213)

我的朋友

分类: C/C++

2007-10-08 21:37:36

Win32系统编程之四书五经

创建人:DearBook技术编辑 DearBook_Tech


好文章! 给作者敬个礼




(感谢孟岩老师为大家提供这篇学习指南,本文发表于《程序员》11月上半月期)

通常在某一个具体细分的技术领域,会自然而然地出现3-5本顶级著作,它们彼此互相配合,形成一个完整的体系。我乐于将这种现称为“四书五经现象”。本期就从Win32系统编程开始。
几年前,台湾著名技术作家侯捷先生曾经写过一篇影响很大的书评文章,叫做《MFC四大天王》。文章的意思是说在MFC的浩瀚书海中,只要认真研读和学习其中四本,就可以“五岳归来不看山”。侯先生虽以MFC为例,但是这个道理却同样适合于MFC之外的很多具体技术领域,这不能不说是一个有趣的统计现象。通常在某一个具体细分的技术领域,会自然而然地出现3-5本顶级著作,它们彼此互相配合,形成一个完整的体系。对于学习者来说,只需要认真研读这几本书,就足以升堂入室。我乐于将这种现称为“四书五经现象”。对于读者来说,如果能够找到该领域中的“四书五经”,则无论在时间上还是金钱上都是最经济的选择。好书几本,胜过烂书几捆,这个体会想必大家都有。为此,《程序员》杂志开辟了这样一个新的书评专栏,帮助读者遴选各个技术领域里的“四书五经”。本期就从Win32系统编程开始。

所谓的Win32开发,就是在C语言的层面上,直接使用Win32 API开发Windows应用程序或者系统程序。虽说现在直接用Win32 API开发应用程序的人已经不多了,深入理解Windows系统程序设计原理,仍然是成为Windows开发高手的必经之路。所谓的Win32,其实是一个API规范,与UNIX系统编程接口标准POSIX是同一个性质的概念。从设计上讲,Win32绝对算不上是简洁优雅,因此学习Win32系统编程,相对来说是比较困难的。Win32来源于Win16,而Win16最初设计于1980年代中早期。设计Win16的时候,Microsoft还是一家小公司,应该说能力还有限。同时,Win16的主要目标是DOS之上GUI系统,设计上偏重GUI部分,在系统编程领域考虑不多。等到设计Win32时,微软能力增强了,有心要把Win32打造成第一流的操作系统API规范,但是已经背上了Win16的历史包袱。所以相对而言,Win32的设计实在赶不上POSIX那么简介优雅。微软在随后又先后进入了COM时代和.NET时代,每一次进步都需要继续背负以前的历史包袱,使得微软的技术体系越来越复杂。微软技术的复杂性,是微软与Java竞争中的最大弱势。而对我们程序员个人来说,无论你现在是在学习和使用最新的.NET技术,还是继续坚持COM开发模型,要克服微软技术的复杂性,必须上溯到Win32。那么Win32领域的“四书五经”是那些?我们一一道来:

1. Charles Petzold, 《 Windows 程序设计(第5版)(上、下册) 》 北京大学出版社
这本是尽人皆知的Win32 API编程经典,也称为“Petzold Book”,学习Win32 API编程的人几乎都从这本书入手。这本书的优点是落墨细致,对基本概念和基本技巧的解释非常详尽,不厌其烦。同时,这本书篇幅虽然不小,但是包容的东西并不多,基本上把重点放在GUI编程上和常规编程任务上,所以能够把很多问题讲得非常透彻。通常第一次阅读这本书,都会觉得作者行文有一些罗嗦。但是日后在开发中,却会发现,这些当时觉得罗嗦的论述,都是实际工作中值得反复查阅咀嚼的宝贵资料。这就是所谓的Petzold风格,既可做tutorial,又可做reference。
几年前,人民邮电出版社出版过一本Charles Calvert的《 21天学通WINDOWS 95编程(上、下册) 》,那本书的定位与“Petzold Book”相似,而且写得也非常出色,在控件编程方面的阐述甚至超过了“Petzold Book”。可惜这本书完全被“Petzold Book”的光芒所覆盖。不仅国内没有再版过,而且原出版者也彻底打消了与“Petzold Book”对抗的念头。
现在仍然用Win32 API直接开发GUI的人,恐怕是少之又少,所以这本书的意义不及当年。更公允的说,Petzold Book现在最大的意义是作为Win32的入门教材。不经过它的洗礼,很难升堂入室。

2. Jeffrey Richter, 《 Windows核心编程 》第四版 机械工业出版社
这本书的前三版名为Advanced Windows,第四版改名为Programming Applications for Microsoft Windows。作者在前言里还特别讲了改名的原因。但是在我看来,这本书还是叫做Advanced Windows更贴切。因为这本书虽然同样是讲Win32 API,却几乎和Petzold Book没有任何重复。初级的内容完全略过不提,GUI部分也是一带而过,全书顷力与系统编程,一上来就讲Win32核心对象,从进程到线程,从DLL到SEH,从钩子到内存管理,可以说是不避艰险,迎难而上,将最复杂最微妙的细节完整展现出来,同时配备又大量精心准备的例子,代码质量非常高超。因此,这本书从问世之日起,就成为Win32系统编程方面的圣经,作者Jeff Richter也成了Win32编程方面的绝对权威。想要学习Win32核心编程,不读这本书是无法想象的。遗憾的是,这本书的中文版翻译配不上原书的高水平,可以说是大错不多,小错不少。如果有读者要认真研读此书,可以去寻找北京大学出版社出版的影印版。
这本书是Richter的代表作,也奠定了Richter世界顶级技术作家的地位。我本人非常喜欢读Richter的书,因为他的文字是写给专业人士看的,决不假装弱智,同时有相当体贴细致,非常符合我的习惯和胃口。所以通常在某个领域有了Richter的书,我就不会去看别人的书了。
对于某些读者来说,Marshall Brain的Win32: System Service 3/e(中文名《深入学习:Win32系统服务开发与实例》,电子工业出版社“深入学习”系列)和Johnson Hart的Win32 System Programming 2/e(中文名《 Win32系统编程—Windows 2000应用程序开发指南(第二版) 》,中国电力出版社)都是不错的选择。两本书的论述都不如Richter深入,但是例子精当,讲解恰到好处。Brain的书覆盖面很广,例子非常有启发性,而Hart的书最适合从UNIX转到Win32的朋友。我发现自己在有空闲的时候喜欢啃Richter的书,但是在实践中需要快速学习解决方案时,反而Brain和Hart的书对我更有帮助。所以这两本书虽然不象Richter那么必须,但是也是非常实用的补充。

Petzold Book和Richter的这本书,构成一个连冠一致的系列,一般Win32学习者精读并且基本掌握这两本书的主要思想和技术,就可以称得上是Win32系统开发的专家了。如果说这两本书的弱点,主要存在两个方面。其一是两本书写作时将Win9X的开发作为一个基本出发点,因此对于Win2000平台的新特性介绍不足。特别是对于Windows 2000服务端高性能软件的开发,基本上没有涉及,很多Win32特有的机制也没有覆盖到。因此,如果想在Win32方面再上一层楼,可以考虑Jeffrey Richter的另一本书。

3. Jeffrey Richter, Programming Server-side Application for Microsoft Windows(影印版)北京大学出版社

知道I/O Completion Port吗?知道如何在多CPU服务器上把机器的能力发挥到极至吗?知道如何利用Windows的logging service吗?知道如何利用WMI开发服务端程序吗?即使你是一个Win32开发高手,也许对上述问题也会感到困难。随着一般应用程序的开发逐渐转移到Java、.NET或者至少Delphi这样的RAD平台上,Win32能够完全发挥威力的最后一个角落,大概就是服务端高性能程序设计了。而如果你想在这个领域有所建树,Jeffrey Richter的这本书就不可不读。这本书几乎是这个领域里唯一的一本书,而Jeffrey Richter的实力又保证了这本书的水平达到了相当的高度。读这本书给人以震撼的快感,你会感叹,Jeffrey Richter对于Windows系统的理解竟能够达到如此深度!
这本书跟上面提到的Petzold Book和《 Windows核心编程 》几乎又是零重叠,所涉及的内容都是高级技术,特别是自Windows 2000以来出现的服务器软件开发新技术。与前两本配合起来,形成了一条从基础到专家的完整链条。在当今业界,仍然使用纯Win32开发程序的开发者,又不少是在金字塔顶端的“高手”级人物。如果说Petzold Book在今天的主要意义在于教育,《 Windows核心编程 》的主要意义在于深化你对系统的理解,那么这本书中教授的知识是实实在在吃饭的家伙。因此,对于高手和有志最终成为高手的程序员来说,这本书是一本难得的经典。


Windows编程从入门到精通
创建人:某自动化公司研发部经理 shooterlily

一般计算机本科学生应该学过Pascal或C语言,如果你没接触过C++,推荐两本书,清华出版社钱能的《 C++程序设计教程 》,机械工业出版社Jesse Liberty的《 C++ 自学通 》,两本书都是先复习C语言语法再介绍C++面向对象的基本概念,国内一些大学本科采用前者作为教材,后者对C++各主要概念都有涉及,任选一本看看,总之入门最好不要选择比较难的书,如《 C++编程思想(英文版•第2版) 》,有可能会打击你的学习兴趣。
有了C++的基础,可以开始接触VC,入门的一本书是《 VISUAL C++6从入门到精通 》,该书简单介绍了VC对话框应用中基本控件的使用,书名夸大其辞,入门还行,精通是远远不够,但作为没接触过VC环境的程序员来说简单易懂。
前面推荐的是几本入门书,自己的印象已经有些模糊,也许很多人会不同意我的观点,但下面列出的书目反对的人应该会少很多,因为它们基本上都是经典之作。
第二本可以看经典的清华出版社的《 Visual C++技术内幕(第四版) 》,这本书质量不错,但有点被过度的推崇了,可能和作者的英年早逝有些许关系,这本书放在这个位置阅读可能会有一部分看不懂,没关系,跳过去,以后水平提高后再回头翻一翻。
第三本推荐看华中科技出版社侯捷的《 深入浅出MFC(第二版) 》,侯捷是台湾著名的技术专家,在国内有很高的声誉,这本书可以带你理解MFC程序的生与死,以及AppWizard生成的那些该死的宏到底是什么意思。
这时你应该对使用VC编程有比较明确的概念了,也许你需要对C++再做适当的充电,比如异常、模板等概念的了解,如果有人问你拷贝构造函数是什么意思,你能回答出来吗?Bruce Eckel的《 C++编程思想(英文版•第2版) 》也许在这个时候要容易看懂一些,这本书名气很大,值得一看,但个人认为也是有些言过其实,可能是翻译的原因。

如果需要解决MFC编程的一些疑惑,推荐一本书,《 MFC经典问答 》,看过之后你会后悔怎么没早点听说这本书,一些实际编程时常见的困难问题都得到了解释,这本书还可以作为日常编程的参考书。
如果感觉调试程序有些不够在行的话,建议你一定要去阅读John Robbins的《应用程序调试技术》,这本书对于调试技术讲的极好,特别有一章介绍了VC调试器的使用,如果你不知道VC调试器的Set Next Statement有何妙用的话,你应该好好读读那一章。我丝毫不吝惜对这本书的赞美之词,因为它的确很棒,我也读了两遍(当然不能连续读,又不是背书准备考试)。
编写WINDOWS程序如果不会用API还是很困难的,这里推荐大家阅读Charles Petzold的《 Windows 程序设计(第5版)(上、下册) 》,北大出版社出版,这是WINDOWS编程的圣经,应该是优秀程序员必读的书,而作者也是WINDOWS编程领域的大师,看书就应该看大师的书。
你对于C++的理解和专家对于C++的理解有什么差别吗?看看Scott Meyers的《 Effective C++中文版 》和《 More Effective C++中文版 》,你会明白什么叫做差距。另外还有一本Stanley Lippman的《 C++ Primer 中文版(第三版) 》,是和Stroustrup的《The C++ Programming Language》齐名的巨著,但1000多页的大砖头可以砸死人。
当你看了上面的书感觉不错的话,那么你应该更进一步,看一看机械工业出版社出版,Jeffrey Richter的《 Windows核心编程 》,这本书也被奉为至尊,无需多言,作者也是一位大师,现在在.NET下已经修成正果,出版了最负盛名的.NET书籍《 Microsoft.NET框架程序设计(英文版) 》,成为一代宗师。唯一遗憾《 Windows核心编程 》中文版翻译的不好,甚至有将肯定语气翻译为否定语气的情况,一本书有二十个译者,翻译质量也可想而知,所以最好对照英文的电子版看。巧合的是《 Microsoft.NET框架程序设计(英文版) 》中文版的翻译也广受批评,好在清华出版社还算负责,承诺近期将推出其修订版,不过至今未果。
书看到此处,你应该已经是WINDOWS编程的小高手了,技术方面已经没有什么太大的问题了,你已经有很多的实际编程经验,这时候需要补充一些设计方面的知识。
编程需要培养三方面的知识,技术、算法、设计,程序员一般很注重技术,而往往对算法和设计不太在意。在做较大型的项目时,设计是尤其重要的,因为常用的算法一般可以下载到源代码或库文件直接使用,而设计却是抄袭不来的。
提到设计不能不提近年来很热的一本书,Gof的《设计模式--可复用面向对象软件的基础》,的确是非常非常好的一本书,不过也许你会看得云里雾里的,没关系,先掌握一些概念,因为现在模式已经成为一门专业语言,和别人交流时直接说采用某某模式要比说一大堆话简单的多,看完后需要再补充别的一些参考书,再做些习题,设计不通过动手很难真正领悟和掌握的。
另一本与《 设计模式--可复用面向对象软件的基础 》并称“软工双雄”的书叫《重构——改善既有代码的设计(中文版)》,个人认为只要阅读前4章学习学习思想即可,当然这洗脑的作用还是值得的。还有一本网上评价很高的书,《 敏捷软件开发:原则、模式与实践 》,这本书获得SDMagazine第13届Jolt大奖,建议大家有空去读一读,本人正在学习中,感觉不错。



阅读(2838) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~