经典与现代的结合:在MFC中集成RAD .NET框架
发布时间:2006-05-05 19:03:00 来源:msdn 网友评论 0 条作者:孙辉
MFC已经有十几年的历史了,然而直到今天,他仍然是Visual C++的关键组成部分。从1996年的Visual C++ 4.2至今将近8年的时间,MFC的主体特征没有出现明显的变化,依旧是“古老”的面孔,因此关于这个类库的种种评论自然是情理之中的事情了。从我个人的观点上看,MFC功能依旧健壮、强大,而且是业界少有的、稳定的、经过足够长历史考验的开发框架。深入研究这个类库,你会找到酒越酿越醇的感觉。MFC的一个成功因素之一就是提供了一套完整的Document/View框架,然而这一点也是许多针对MFC批评的矛头指向。也许是由于这个框架太经典,使人们看上去MFC不再“婷婷玉立”,而是“人老珠黄”,以至于打开今天的Visual Studio IDE的时候,多少会有点不协调的感觉:比起其它基于.NET框架的开发语言,用MFC开发会显得很“土气”、“孤独”——没有RAD机制,明显的缺乏与其它时髦对象的“互操作”能力,而且严格恪守自己的领地。每当生成一个基于文档的MFC程序,我们总是看到一张沧桑的面孔,好像刘姥姥进入大观园,与周围时髦的C#、VB.NET等存在明显的“代沟”与“不相容”。曾经有很多人问我MFC还有前途吗?是否已经行将就木?关于是MFC还是.NET的讨论时隐时现,不绝于耳。CLR是个充满魅力的世界,这种魅力,使得C#、VB.NET等变得光彩夺目。然而,MFC并没有衰老,如果你深入的了解MFC,你会发现,MFC完全可以与C#、VB.NET争奇斗艳……在MFC项目中使用托管扩展
支持托管扩展
.NET FrameWork提供的托管扩展支持确保了在MFC项目支持托管扩展(CLR),开发者可以使MFC工程(本文我们将使用Test作为工程名称)通过打开项目的托管扩展属性开关,来增加编译器的托管支持。
对偶.NET对象
在打开托管扩展编译开关以后,您就可以在MFC项目中使用托管对象了,通常的做法是:为每个重要的MFC对象匹配一个托管对象以形成一个对偶对,彼此匹配的对象包含指向对方的指针,这样,其他.NET对象可以通过对偶对中的.NET对象操作MFC对象;而其他MFC对象可以通过对偶对中的MFC对象操作.NET对象
namespace test { __gc public class testDocObject : public Object { public: testDocObject(void) { } }; }
经过以上步骤,Visual Studio.NET生成的代码被装进了MFC程序,当然完全可以手动创建.h文件和.cpp文件,输入相应的代码,然后把它们添加到当前工程。由于以上步骤在托管扩展编程中经常遇到,因此,将上述过程自动化是必要的,有鉴于此,我们在附赠的光盘中提供了完整的添加.NET对象的Wizard。
在MFC非托管类中定义托管成员变量
在MFC类中使用托管对象,提供对象的声明和初始化方法与传统的方法略有不同。以在文档类CtestDoc中添加一个托管成员变量为例,声明托管对象的代码如下:
public: gcroot<:testdocobject*>m_ptestDocObj;
gcroot类型安全包装模板可以将托管参考类型指针作为成员变量嵌入到非托管类中,该变量就可以像其他类型的变量一样使用了。在CtestDoc的成员函数InitialDocument中创建这个对象,代码如下:
BOOL CtestDoc::InitialDocument() { #pragma push_macro("new") #undef new m_ptestDocObj = new test::testDocObject(); #pragma pop_macro("new") }
由于testDocObject是一个托管参考类型,它总被分配在CLR堆上,所以自然不能使用在afx.h中定义的new操作符来直接初始化该对象以避免该托管对象在非托管的本地C++堆上创建导致的错误。在托管对象中声明MFC对象,与常规方法一致。
掌握了上述的基本托管类和对象在传统MFC项目中的对偶使用方法,就可以保证您充分使用.NET框架所提供的丰富的类库支持(引用相关的动态链接库并声明名称空间是必要的)。如果希望更多地了解托管和非托管C++代码混用的技术,可以参考Tom Archer与Nishant Sivakumar合著,由Addison Wesley出版社出版的《Extending MFC Applications with the .NET Framework》一书,相信会很有帮助。宿主.NET控件
- 推荐阅讯
- VC++中利用磁盘序列号识别正版软件
- Windows Sockets API实现网络异步通讯
- C++中要求(或禁止)对象产生于heap中
- c++类的多重继承与虚拟继承
- More Effective C++之引用计数
- 伪随机数生成及在VC++中的实现
- 用VC++制作一个简单的局域网消息发送工程
- c++友元的入门教程
- 最常见的20种VC++编译错误信息
- VC编程技巧:IE控件的高级用法
- 阅读排行
- 1.Borland 发布C++ Builder 2006 RAD 环境
- 2.C/C++程序员应聘常见面试题深入剖析
- 3.Visual C++常用数据类型转换详解
- 4.C++中的 static 关键字
- 5.利用VC++实现局域网实时视频传输
- 6.浅谈C/C++内存泄漏及其检测工具
- 7.英国投票否决C++/CLI 微软强攻ISO标准受挫
- 8.VC++下用MSComm控件实现串口通讯
- 9.伪随机数生成及在VC++中的实现
- 10.VC++编程实现对波形数据的频谱分析
- 专题教程
- Windows Server-Windows Server文档-Windows Server新闻-Windows Ser PostgreSQL-PostgreSQL文档-PostgreSQL新闻-PostgreSQL专家
- WebLogic-WebLogic文档-WebLogic新闻-WebLogic专家 FreeBSD-FreeBSD文档-FreeBSD新闻-FreeBSD专家
- Linux-内核 GUI KDE Gnome DNS FTP 安全 安装-Linux专区 Windows-AD IIS ServerCore 虚拟化 安全 HPC-Windows专区
- 大话G游 专题:手机病毒揭密
- ARP攻击防范与解决方案 路由故障处理手册
