现在手头有一个项目需要移植用户的一个很古老的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 方法来创建实例对象, 或者动态判断类型。