`
bruce008
  • 浏览: 173373 次
  • 性别: 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 方法来创建实例对象, 或者动态判断类型。

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    MFC运行库(MFC程序运行所需动态库)

    而动态链接则是在运行时从系统路径或程序同目录下寻找相应的DLL文件,这种方式可以减少程序的大小,但需要确保运行环境已经安装了对应的MFC库。 MFCDLL可能是指一个包含MFC相关动态库文件的压缩包。在实际开发中,...

    VC6 MFC运行库

    MFC运行库是VC6开发的应用程序在运行时必须依赖的动态链接库(DLL)。这些库包含了实现MFC类的功能和接口,以及与Windows API交互的关键代码。当一个使用MFC编译的程序启动时,需要这些运行库文件才能正常运行。描述...

    MFC运行环境配置文件

    VS2015中的MFC运行时依赖于一些特定的库,例如Microsoft Visual C++ Redistributable,这是运行使用VC++编译器创建的应用程序所必需的。这些库包含了运行MFC程序所需的函数实现和数据结构。当你的MFC工程在运行时...

    MFC运行时类型识别(MFC RTTI)与动态创建.doc

    总之,MFC的RTTI机制结合了`CObject`类和`CRuntimeClass`结构,为程序员提供了强大的运行时类型检查和动态创建对象的能力。正确理解和使用这些特性可以极大地增强MFC应用程序的灵活性和可扩展性。

    MFC运行库(vc6.0)

    而MSVCP60.DLL则是C++运行时库的调试版本,它提供了C++标准库的实现,包括STL(Standard Template Library)和其他C++特性。这些库文件对于运行使用VC6.0编译的调试版本程序至关重要。 **MSVCIRTD.ZIP** MSVCIRTD...

    程序开机运行的MFC实现

    在Windows系统中,让一个程序在开机时自动运行通常是通过注册表编辑或者系统服务的方式实现。本主题将详细探讨如何使用C++和MFC(Microsoft Foundation Classes)框架来创建一个程序,使其能够在用户开机时自动启动...

    MFC运行时全屏显示,充满整个窗口

    本文将详细讲解如何利用MFC实现一个窗口的全屏显示,以及在VC6.0环境下进行测试。 全屏显示通常涉及到Windows API函数的调用,以及对MFC框架的理解。首先,我们需要知道窗口的正常显示是由窗口类的风格决定的,其中...

    VC6.0 MFC运行库

    这个库包含了MFC类库的实现,是调试版本的MFC应用程序运行时需要的。在开发阶段,使用Debug版本的MFC库可以帮助开发者找到程序中的错误,因为它提供了更多的诊断信息和内存泄漏检测。 MSVCRTD.DLL是Microsoft C运行...

    vs2005环境下开发的MFC程序运行所需DLL

    当MFC程序编译完成后,它通常会依赖一些特定的DLL文件,这些文件必须在运行时被找到。有两种方法确保这一点: 1. **系统目录**:将这些DLL文件复制到系统目录,如`C:\Windows\System32`,这样系统会在全局范围内...

    MFC实现时钟 MFC实现时钟

    本篇文章将详细探讨如何使用MFC来实现一个基本的桌面时钟程序。 MFC是微软为C++程序员设计的一个类库,它封装了Windows API,使得开发者可以通过面向对象的方式来编写Windows应用程序。MFC库包含了一系列的类,这些...

    MFC程序独立运行

    通过上述两种方法,即使用Shared DLL或Static Library,结合正确的构建配置(Debug与Release),以及借助Depends等工具检查DLL依赖,开发者可以有效地实现MFC程序的独立部署,确保其在各种环境下都能顺利运行。...

    mfc运行库文件 mfc调试动态库

    3. **MSVCP60D.DLL**:这是Microsoft C++运行时库的Debug版本,包含了C++标准库的实现,如STL(Standard Template Library)、内存管理、异常处理等关键功能。在调试环境下,它能提供额外的诊断信息,帮助开发者定位...

    让MFC程序启动时在后台运行,可以用热键调出来

    总结,本教程讲解了如何利用MFC创建一个后台运行的对话框程序,并通过热键实现从后台调至前台的功能。在实际编程中,你可能需要根据具体需求调整代码,例如添加更多的热键组合或改变后台行为。希望这个教程能帮助你...

    控制MFC程序只能运行一次

    下面将详细介绍如何实现MFC程序只能运行一次的机制。 首先,我们需要理解Windows操作系统中的互斥量(Mutex)概念。互斥量是一种同步对象,它允许多个线程共享一个资源,但同一时间只有一个线程可以访问。在MFC中,...

    MFC开机自动运行代码与ShellExe应用

    总结来说,这个MFC程序展示了如何利用C++和MFC进行开机自启动的设置,以及如何通过注册表来实现这一功能。这在开发需要后台运行或服务性质的应用程序时非常有用。通过理解这些代码,开发者可以更好地掌握Windows应用...

    6种方法实现MFC属性页对话框

    动态创建允许在运行时根据需要创建属性页。在CPropertySheet构造函数中,使用ADD_PAGE方法逐个添加CPropertyPage实例。这种方法更灵活,可以处理不确定的页面数量。 4. **使用Wizard97样式**: Wizard97是Windows...

    MFC基本运行原理简介

    在MFC中,通过重载`IsKindOf()`函数来实现RTTI功能,从而可以在运行时判断一个对象是否属于某个类或继承自某个基类。 2. **动态创建**: - 动态创建是指在运行时动态创建对象的过程。MFC通过`CObject`类及其派生类...

    Windows-MFC程序-04.MFC工具栏、运行时类信息机制、运行时创建机制

    这些宏使得MFC类能够参与运行时类信息交换,从而实现动态创建。例如,如果你有一个派生自CObject的类,你可以声明并实现这些宏,然后在运行时通过CRuntimeClass结构和CreateObject函数创建类的实例。 在实际开发中...

Global site tag (gtag.js) - Google Analytics