`
bruce008
  • 浏览: 170199 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

实现MFC 的运行时

阅读更多

现在手头有一个项目需要移植用户的一个很古老的legacy 项目 由MFC 开发。现在客户的想法是逐步实现, 这样的话要在MFC 的桌面程序中嵌入已经移植的 web 模块。  当然我们的新的模块是 JSF 实现的web page。 现在的初步的想法是将web page 嵌入一个 ActiveX 控件中。  在mfc 中 基本上我们可以用CWebBrowser 类来完成。  这个类会通过CreateControl 的方式来创建一个 ie browser Active X。

 

很长时间没有玩MFC了,  还是很怀念当初用它的日子。其实以前用它也是断断续续的,  当然为了理解它的机理搞了本侯捷老师的 深入浅出MFC。(这本书早已经送给一个朋友了)。 最近些年基本上都是玩Java,C#,对于它们来讲要运行时创建一个对象非常容易的。 只要classLoader 能够load 你所指定的对象的Class 基本上  Class.forName(className).newInstance() 就可以得到一个对象聊。   

 

但是得知道c++ 是不支持这种动态方式来创建对象的。 在MFC又是怎么实现动态信息 甚至于动态创建的呢? 现在回头看看还是非常容易理解的, 借助大量的宏来定义来静态的一些全局对象。 比如如果能够一个类对应一个这种全局对象来表示它的class name,  它的base class。 在MFC中有一个CRuntimeClass 就是用来做这个事情的。   如果我们要实现动态创建我们的类必须继承自CObject。 然后 在class 定义中加入 DECLARE_DYNCREATE(类名)

 

 

DECLARE_DYNCREATE(CMyClass)

 

相当于

 

public: 

    static const AFX_DATA CRuntimeClass classCMyClass;

    virtual CRuntimeClass* GetRuntimeClass() const;

    static CObject* PASCAL CreateObject();

 

 

 

然后这几个东东就是再 IMPLEMENT_DYNCREATE 里面来实现了。还有一个 CRuntimeClass *   pRC = RUNTIME_CLASS(类名) 也就是来找到这个 classCMyClass  CRuntimeClass 静态对象聊。只不过在CRuntimeClass 中间还有很多其它attributes 比如创建函数指针,基类的CRuntimeClass* 指针。 都会在MFC框架中一一实现。这个就是MFC 的 runtime information 的 基石了。  

 

 

最本质的实现机理差不多就是借助c++的宏 为每个类定义唯一的静态类型对象。接下来通过这个类型对象的CreateObject 方法来创建实例对象, 或者动态判断类型。

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics