前言
也许,你是一个顽固的SDK簇拥者;
也许,你对MFC抱着无比排斥的态度,甚至像我一样对它几乎一无所知;
也许,你符合上面两条,而且正在寻求着一种出路;
也许,你找到了一条出路——WTL,但是仍然为它的技术支持、它的上下兼容性感到担忧;
也许,你还有着更多的也许;
也许,这时候你看到了李马的这篇文章。
世界上的故事,往往就是由各种“也许”交织而成的。
我的转型
历史告诉我,在向别人推荐一样东西的时候,首先应该告诉别人你从中获益了多少,如是才能够使这一切更加具有说服力。比如我告诉你,我自从用了ATL之后,腰不酸了、腿不疼了、走路也有劲儿了,那么你没准儿就会对ATL产生些许的好感。是的,在《前言》的这一节里,我将以我自身的Win32 GUI程序设计经历来向你不遗余力地推荐ATL——因为我的这一系列连载就是以它为主题的。
2000年,我开始用Visual Basic学写Win32下(严格地说,当时的Windows 95并不能算是纯粹的Win32系统,它只是一个16/32位Windows的杂种)的程序。到了2001年,我开始厌倦它的运行库与运行效率,于是转投了Delphi。也许是Borland的粉丝不好做,也许是我厌倦了PASCAL的严谨,又也许是那种“真正的程序员用VC”的幼稚思想在作怪——总之,我又投向了VC。
一方面是我忒抠门儿,不舍得花钱买好书;另一方面,中国的MFC书籍琳琅满目鱼龙混杂而使我无法提起学习的兴致——反正不知道什么时候开始,我就开始强烈抵触MFC这个本无过错的Framework,而仅仅凭着杂志报纸上寥寥的几篇SDK文章和全英文的MSDN 6.0开始了我艰难的学习长征。所幸,这一路上虽然磕磕绊绊,但最终我还是到达了属于我的陕北。如果您于此期间曾经在网上或其它媒体上看到过我的Win32技术文章,就应该会发现这其中我极少涉猎MFC的任何内容——我不否认我对它存在着狭隘的偏见,虽然我在2005年完成的毕业设计是用MFC编写的。
SDK终究不是一个让人舒适的归宿,我想SDK的粉丝们都应该有着深深的体会。哪怕是你的代码增加到1000行,你都会觉得维护这些东西的难度非常之大——臃肿、堆砌、全局、耦合、复用性差——有太多丑陋的词语都可以用在这上面。是的,我的确说过我不喜欢MFC,但是我也同样不能否认用MFC编写的程序结构清楚、分流明晰——当然,如果你不是深入到MFC内部去看的话。举个例子来说,我所编写的进程查看器July的2.11版本就是用SDK编写的(这个版本是开源的),才1000行出头的代码就已经使得我难以驾驭它们了,以致于后来我不止一次地想重写之——我想过用MFC,甚至Delphi的VCL。不过,运行库的限制和庞大的EXE体积还是使我放弃了这些想法。
如果说MFC和VCL是生长在深宫名门的大家闺秀,那么WTL就可以算是一位浪迹天涯的绝色歌女。我在2004年的时候,曾与它不经意地邂逅。精良的设计、轻巧的EXE、无与伦比的效率——如果不是它的兼容性存在问题的话(如果不修改的话,WTL 7.1连它自己附带的某几个sample都无法通过编译),我几乎就要拜倒在它的石榴裙下了。
于是我继续迷茫,这种迷茫一直持续到了2005年我毕业之后。2005年8月的时候,为了研究不借助MFC调用ActiveX控件的技术,我接触了WTL的发端——为开发COM组件而设计的ATL。时至今日我似乎已经无法回忆起当时的景况,只记得一个月之后,用ATL重写的July v2.20就诞生了。
比起大家闺秀和绝色歌女,ATL则更像是一位温柔贤惠的朴实女子。