大家现在还用MFC做开发吗?MFC会过时吗?你怎么看?
------最佳解决方案--------------------------------------------------------
自从2005年3月8日下午16时“十年MFC经历认识的Microsoft技术”以帖子的方式发表于CSDN论坛后,引起了许多网友得好评,使得笔者诚惶诚恐,考虑到该贴过长(人气指数为5000),因此转移到Blog上,许多网友对此帖的评语只好省略,在此鄙人谢过了!为感谢网友的支持,本人希望今后能发出新的帖子以回报网友对我的鼓励,再一次谢谢!
初识MFC
我最初知道MFC大概是在1993年,那个时候Visual C++还没面世,当时Microsoft的C++编译器还很弱,官方的名字是Microsoft C/C++ 7.0,MFC的版本是1.0,几乎没有引起什么反响,那个时期最好的C++开发环境是Borland C++ 3.1,其实,大概是1992年11月份,一个偶然的机会,我领略到Borland公司的厉害,记不得在什么地方,我看到一个绝妙的集成开发环境,即Turbo C++ 3.0 for Windows,这是我记忆中第一个真正的Windows环境下的C++集成开发环境,那种激动的感觉至今仍记忆犹新,不客气的说,当时至少在C++方面,Microsoft与Borland不是一个水平的,Borland明显的要高于Microsoft ,Borland的产品在技术上给我留下深刻的印象。那个时候Microsoft最好的开发平台是Visual Basic 3.0,而Borland的Delphi正处于开发阶段(Delphi 的代码名称是:“VB Killer”)……,想起这些十几年前的往事,我不禁感慨万千。
十几年来,我用过许多开发环境,关于Visual Basic,我用过最早的DOS版本,Windows版的Visual Basic我基本上全都用过,至今我还记得每个版本的VB安装盘磁盘的盘数。同样,我用过各个版本的Delphi,特别是Delphi 2.0,给我留下极好的印象。Delphi提供真正编译的可视化开发环境,那个时候(1994年左右),Delphi就可以开发带有GUI的动态链接库,你可以想象,在Microsoft Access 2.0的应用程序中可以加载一个Delphi Form并进行程序交互,那种感觉真是棒极了。
Borland C++是我心中无法抹掉的遗憾,从Turbo C到C++ Builder,我深刻的体验到Borland的辉煌和无奈,Delphi从VB Killer走到为VB护航(你可以想象Delphi一步到位的ActiveX 控件开发技术有多牛,早期的VB有多土,早期的VB不能开发动态链接库,因此无法开发ActiveX 控件,想起来真令人嘘唏不已),Borland C++的命运也是不济。Borland C++ 3.1的辉煌永远不再了,十几年的开发工作中,我在C++上投入了大量的精力,Borland C++曾经给我带来无数的激动,然而这个经典的名字却在与Microsoft的竞争中渐渐的流逝了……。
MFC4.0的出现,使得人们感觉Microsoft在C++方面赶上来了,这一版的MFC是Win95推出后出现在Visual C++ 4中(Microsoft没有VC 3,VC4以前的版本是2.2、2.1、2.0、1.51、1.5、1.0)。也许是对Borland C++的潜意识的失望,我不知不觉的接受了MFC,VC 4.2推出时,我通过正常渠道购买了这个编译器的企业版。
------其他解决方案--------------------------------------------------------
认识Application对象
如果你熟悉Microsoft Office,你应该进一步的剖析这个大型软件,Microsoft Office中几乎每个程序都是可二次开发的,这一点得益于Microsoft Office内置的二次开发机制,一个是基于COM机制的VBA模型,另一个是基于.NET框架的托管模型:Visual Studio Tools for Office。作为一名程序员,你应当在技术角度解析Office的技术结构。Microsoft的大多数软件的对象结构可以通过Visual Studio提供的工具OLE/COM Object Viewer考察其类型库得到,通过引用类型库,你甚至可以得到描述对象信息的C++头文件。这样做真是好处多多。一个典型的Office通常都有一个Application对象(或其它一个与之相当的对象),这个对象相当于软件枢纽,在这里,我们不讨论Office,借此话题说说Application对象。大多数支持扩展(Addin、Plugin)的软件都存在类似的构造。通常,一个系统得Application对象或者是一个COM对象,或者是一个.NET对象,如果你的系统存在这类对象,你的系统就基本具备支持Addin、Plugin的机制了。一个理想的做法就是在一个MFC系统中,内置一个ATL对象或.NET对象,稍后我们给出方案如何做到这一点。设计Application对象的关键是如何规划这个对象的属性、方法、事件。如果你希望系统具备良好的扩展性,Application对象是十分关键的,这也是构架艺术的体现。所谓Addin(Plugin),是系统运行时根据需要加载的对象库,Addin(Plugin)之所以可以扩展系统,关键的因素就是系统加载Addin(Plugin)时,将Application对象传递给Addin(Plugin)库,设想一下,如果Application恰到好处的触发了系统事件,而Addin(Plugin)库如愿的解释了事件,一个Addin(Plugin)库的任务不就OK了吗!因此Application对象是系统设计的关键。
如果你精通ATL对象,在你的MFC系统中添加一个ATL对象,这个任务可以用VC Wizard完成。你已经接受了一个事实,就是MFC程序中存在一个CXXXApp对象(CWinApp的派生类),现在你要做的是增加一个对应得ATL对象。这个对象可以在CXXXApp::InitInstance()中创建,如果ATL对象的类是CXXXAppObject,建议你在CXXXApp对象对象中增加一个成员变量,例如:
CComObject <CXXXAppObject >* m_pAppObj,然后可以入下初始化m_pAppObj:
m_pAppObj = new CComObject <CXXXAppObject >;
注意程序结束时在CXXXApp::ExitInstance()中释放m_pAppObj,语句如下:
delete m_pAppObj;
你可以将系统得关键属性设置成CXXXAppObject的属性,例如系统得标题、是否为多文档等等。系统希望外部调用的功能可以实现为CXXXAppObject的方法,这一点取决于你的需要。系统需要外部扩展的功能,表现为CXXXAppObject的事件,关键是在恰当的位置触发事件以及提供的事件参数。例如,你可以在CXXXApp::InitInstance()触发应用程序开始的事件OnStartUp,Plugin捕获事件后,可以进行特定的初始化(身份确认、初始信息查询等等);
你可以在CXXXApp::ExitInstance()触发应用程序结束事件,Plugin捕获事件后,处理用户需要的系统退出工作。所有的设计取决于具体设计。
如何加载Plugin,是一个有趣的问题,如果Plugin实现为一个COM范畴(Category),可以运用COM技术枚举这个Category;可以将Plugin安装到一个特定目录,也可以通过注册表。Plugin的实现可以用COM技术、也可以用.NET框架。适当的机会我会提供例子……
一些感想
一时心血来潮,就发了这个帖子,很难说是有心,还是无意。几天前我在新浪网上看应氏杯围棋决赛,我觉得该赢了吧,作为一个围棋迷,我们等了十几年,等到了属于国人的应氏杯。记得7、8年前在还在大学工作的时候,有一次,一位同事兴致冲冲的走道我面前对我说:“嗨,昨天马XX赢了李昌镐!”,当时我在系办公室正在看报纸,那位仁兄见我头都没抬,非常不满的抢下报纸,对我吼道:“喂!马XX赢了李昌镐!!你听到没有!!!”,我对他说:“你大惊小怪个啥?!马XX输了李昌镐多少盘,你知道吗?”,马XX几乎一直在输给李昌镐,人们已经不奇怪了,偶尔赢一次,国人就把他捧得北都找不到了,李昌镐弱冠17的时候就傲视这个世界了,可至今面孔不变,几天前的农心杯,中日联军5个人,被他打个落花流水,李昌镐是公认的世界第一,以至于有的高手知道下一个对手如果是他,就会去订回程机票。这次应氏杯,国人竟然感谢崔哲瀚,何也?因为这个弱冠19的小子,挡住了他的大哥李昌镐才使得应氏杯有了悬念。当国人媒体在说韩国仅李昌镐一人厉害的时候,不知道是出何居心还是自欺欺人,李昌镐年方30,不知道要力压中、日多少年!面对这个名字,真有点麻木了,这个太极虎!软件界又来了我们一向不齿的印度虎,2001年我们的软件出口额仅是印度的四十分之一,我们震惊了,怎么可能呢?这个四十分之一水分很大,很可能更可怜!当时我在大连参加一个关于“大连软件出口国内第一”的官方会议,那位大人在会上说:“据说,我们大连软件出口国内排名第一,市有关领导希望今天的会议给出这个第一的数字依据,希望你们把数据报上来,去年的数据也可申报,注意,我们要的只是数据,你们仔细体会,我们根据数据,有奖励,机会难得呀!”……。某一天,几个朋友在我家看央视的对话节目,对话一方为国内的软件大鳄们(用友、阿尔派等公司的老总们),另一方为印度软件的一个代表团。当问及中、印软件差距的时候,我们的刘老总(代表阿尔派)不以为然的说,据他的看法,我们已经快赶上(印度)了,……,言下之意颇有印度的水平不过如此的感觉,印度方的话我至今记忆犹新:“是否赶上,国际市场说的算!在中国看来,印度程序员的个性不足,技术也不怎么样,其实是个错觉,印度软件首先注重个性,许多重要的美国商品化软件都是在印度本土开发的……”,我们的舆论总是将印度程序员的水平描述的平庸至极,可是差距日渐拉开,……,围棋、足球(不好意思谈,谈不出口!)、软件,我们被近邻严酷的封锁了,乐坏了记者们、给媒体带来了生机……