正在阅读:经典与现代的结合:在MFC中集成RAD .NET框架经典与现代的结合:在MFC中集成RAD .NET框架

2005-07-14 09:59 出处: 作者:孙辉 责任编辑:moningfeng

  在Visual Studio .NET 中,没有提供关于添加托管C++类对象的向导,因此,你可以先添加一个基于托管C++的Component对象(如图3)。


(图3. Add Class向导:增加托管C++ Component对象)

  添加了该testDocObject托管组件对象之后,将该对象的基类改为Object,并删除一些代码得到一个最小托管类:

namespace test
{
__gc public class testDocObject
: public Object
{
public:
testDocObject(void)
{
}
};
}


  经过以上步骤,Visual Studio.NET生成的代码被装进了MFC程序,当然完全可以手动创建.h文件和.cpp文件,输入相应的代码,然后把它们添加到当前工程。由于以上步骤在托管扩展编程中经常遇到,因此,将上述过程自动化是必要的,有鉴于此,我们在附赠的光盘中提供了完整的添加.NET对象的Wizard。

在MFC非托管类中定义托管成员变量

  在MFC类中使用托管对象,提供对象的声明和初始化方法与传统的方法略有不同。以在文档类CtestDoc中添加一个托管成员变量为例,声明托管对象的代码如下:

public:
gcroot 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合著的《Extending MFC Applications with the .NET Framework》一书,相信会很有帮助。
键盘也能翻页,试试“← →”键

相关文章

关注我们

最新资讯离线随时看 聊天吐槽赢奖品