“杀毒手”是怎样“练”成的。
(2008-12-12 16:11:08)
标签:
vcmfc并行开发杀毒手趋势杂谈 |
分类: 研究探索 |
说起来还真有点自嘲,我这个国内某知名高校的软件工程专业的小本,居然时第一次开发团队VC并行项目。不过自嘲归自嘲,自从做了杀毒手,嘿,不但MFC深入浅出了,也能自己搞VC皮肤了。
其实杀毒手的目标定位跟它的名字有点冲突。一开始杀毒手的主要需求是为了帮助趋势的企业版客户做一些强力杀毒的功能,但是又考虑将来push solution的需要,所以附带了一些其他的功能,以便在后续版本做成一个“发布病毒解决方案的平台”。所以,这个杀毒手的名字,其实并不是十分贴切的,当然,这也是处于“一名惊人”的需要:)
我的模块是负责开发UI和各模块的通信数据。
杀毒手的架构是类似插件的设计,每个模块是个dll,继承自某一个接口,然后通过主程序Load进来。虽然我这是第一次做团队VC项目,但是据我的先前考察,发现这样的做法是切实可行而且是比较好的并行开发模式。
当然这便带来了一些困难。比如我的UI模块。如果是个人开发,我只需做一个skin库就可以。但是,杀毒手的做法是,每个功能模块通过UI的dll来动态生成控件。所以UI模块要和功能模块在事先进行充分的沟通、约定。
以前在学校都是个人做一些VC的中小型工具,所以界面美化都是用一些第三方的控件库。所以精力都集中在程序的逻辑上,而从来没有考虑过界面的产生、通信、消息循环已经销毁的机制。于是,只好硬着头皮上了。
先从“如何创建不规则窗体”开始。加了两天小班,研究了如何通过单色图来定制窗口形状,也阅读了通过定制Crect来控制窗口的外形,终于成功做出一个“奇形怪状”的窗口,但是却十分喜欢。接着,着手“通过dll动态创建控件,并让控件响应事件,然后传回给调用窗体”,加了3天班,对“dll的导出函数”,“MFC的动态绑定消息”有了深入的了解。接下来,开始美化界面,从“最简单的界面贴图”,到“重写MFC的窗体绘制函数”,再到“重绘各个控件”,这真是一个艰难的历程,不过都被我一个个搞定,更重要的是,我对MFC产生窗体的函数和过程有了了解,熟悉了常用控件的使用方法。
经过2个多星期的奋斗,一个友好的界面终于诞生。本来以为以及大功告成。可是新的问题又来了:内存泄露。因为控件是功能模块通过调用UI模块开发的函数动态创建出来的,所以我的模块里有了大量的new,但是为了保证这些控件一直显示在界面上,所以我没有对应的delete。但是由于控件类型功能模块是保密的,所以功能模块也无法delete。那到底是谁来delete?只能是UI模块了。没办法,只能重构代码。对类进行重新设计,将所有控件进行“树形”设计。在父窗口的类中加入子控件的List,那么在父窗口析构的时候,就会遍历这个list,然后对list里的每个子控件进行递归析构。所以,只要最顶层的主窗体销毁,那么其下的所有子窗口也就会销毁了。哦也,Memory Leak也被成功搞定。
UI模块与功能模块的数据的通信是个繁琐的过程。因为通信的数据不固定,所以很难做得“简单而又全面”,我目前的做法只能是有一份类似的SDK文档,其中约定了UI模块与功能模块的数据约定,类似name-value的数据结构。对于这个数据结构,我们曾讨论使用简单的string,到复杂的xml结构,后来都被否定,因为string的格式松散,xml的读写效率低,所以最后自己设计了一个类来存储这些数据,能解决格式松散和读写的问题,但是实例化的时候,要写比较大量的“简单”代码。如果你有什么好方法,请千万不要吝啬告诉我。
整个杀毒手的净开发时间大概在一个月左右。我在c++,vb,asp,asp.net,flash,photoshop,vc#,web中游荡了一圈之后,发现还是钟爱c++,难道这就是传说中的轮回?貌似我在杀毒手之前最近的一个VC项目还是大二做的,不禁又要自嘲一下了。通过杀毒手的开发过程,我觉得自己对MFC、C++的认识又真的上了一个台阶,我想,大概是因为又过了几年,项目的经验丰富了,所以对语言的认识也就在一个新的高度了。还记得大一时最讨厌C++的指针了,而我现在却是那么的喜欢它。真所谓温故而知新,不亦悦乎。
最后要略略带过的是,杀毒手的开发团队只有5个人,无法在一个月的时间内,做出一个类似“集合了杀毒、免疫、扫描等综合功能的产品”。所以,在杀毒手发布后,我们也看到一些业内人士的详细评测,我们很感谢他们做的无偿劳动,但是毕竟我们的主要定位还是帮助企业客户端强力杀毒。当然,我们会在后续版本里不断完善,将其真正作为一个发布杀毒方案的平台。请大家到时支持我们的杀毒手,支持我们的趋势!
谢幕,台下想起热烈的掌声,偶尔还听到阵阵“Jason,我爱你”的美女尖叫声。哦也:)
Jason Zhou