每个MFC封装类都有一个run_time(?名称不太清楚)结构体,里面存储消息什么的。是谁去遍历这些结构体的呀;是线程类吗????怎么方法进行遍历的?????

解决方案 »

  1.   

    struct CRuntimeClass
    {
    // Attributes
     LPCSTR m_lpszClassName;                      //类名
     int m_nObjectSize;
     UINT m_wSchema; // schema number of the loaded class
     CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class  默认构造函数的函数指针,创建一个类的对象,抽象类则返回NULL
    #ifdef _AFXDLL
     CRuntimeClass* (PASCAL* m_pfnGetBaseClass)();
    #else
     CRuntimeClass* m_pBaseClass;    //基类
    #endif
      

  2.   

    http://www.cnblogs.com/witxjp/archive/2010/04/20/1716036.html
      

  3.   

    其实runtimevlass是靠两个宏来实现的,不是一句两句能说清的,对于这个问题你好好看看《深入浅出mfc》的第三章,你会豁然开朗,这个问题用帖子来回答不是一句两句就能解决的,只要你把那本书第三章好好看看,大概过程你就会明白了
      

  4.   

    其实runtimevlass是靠两个宏来实现的,不是一句两句能说清的,对于这个问题你好好看看《深入浅出mfc》的第三章,你会豁然开朗,这个问题用帖子来回答不是一句两句就能解决的,只要你把那本书第三章好好看看,大概过程你就会明白了
      

  5.   

    MFC很老了,在 C++的RTTI标准出来之前,MFC自己搞了套RTTI,就是这个RunTimeClass后来很多机制基于这套RTTI实现,像动态创建主要靠静态类成员组成一个网,支持RTTI的MFC类在网中都有一个点,每个类有个虚函数能访问这个点,通过这个点每个对象就能知道自己是什么类型
      

  6.   

    查点资料,好像是利用动态创建的//不太明白这个动态是怎么个动态法,是动态遍历链表吗???怎么触发遍历链表的,是啥函数。大哥 你说的网 是链表吗???
    IMPLEMENT_DYNCREATE(CFrameWnd,CWnd);
    每个类有个虚函数能访问这个点//是IsKindOf虚函数???用什么办法触发IsKindOf函数去访问这个点的
      

  7.   

    先去看看RTTI是啥玩意,有啥用途。本质上就是动态判断一个类的类型,扩展用法就是能用类型信息动态创建类的实例。在MFC中,框架只提供了有限的从CObject派生的类型定义,比如CWnd/CFrameWnd/CDialog之类,但是用户代码中通常都派生了很多自定义类型,比如CMyFrame/CMyView/CMyDoc等等,在一些特定应用中,比如MDI程序,需要动态创建用户定义的窗口类,怎么办呢?MFC从来都不知道是不是存在CMyFrame这些类型,怎么创建?CRuntimeClass就派上用场了。每个从CObject派生的类都通过宏的方式定义了一个对应的CRuntimeClass派生类,且实现了CreateObject方法,里面只有一行语句,就是new一个类自身的对象,这是完成自动创建的第一个关键,MFC框架只需要知道这个类对应的CRuntimeClass,然后调用它的CreateObject就能完成动态对象创建。那MFC怎样才能找到类的CRuntimeClass信息呢?这是第二个关键。在用户代码中定义了运行时类,它会把类名和对应的运行时类填入一个全局链表中,这个全局链表的表头存放在模块信息表中(不管是EXE还是DLL,都有一个全局的模块信息表),MFC框架只要获得每个模块的模块信息表,就能找到它登记的所有运行时类信息。MFC怎样找到每个模块的模块信息表呢?这是第三个关键。在程序启动时,每个被加载的模块都会执行一些初始化代码,这个代码会把模块自身的模块信息表(其实还有其它类型的信息表)向MFC框架注册,让MFC框架记录下所有已加载的基于MFC创建的模块的关键信息,MFC动态创建自定义类型的能力就顺理成章了。看似简单的东西,其实MFC内部做了非常多的工作,以至于阅读MFC源码是一件相当不容易的事情,一旦明白了原理,就知道MFC为什么要搞得那么复杂了。复杂也带来了风险,例如:A.EXE和B.DLL都是基于MFC的项目,A.EXE启动时需要加载B.DLL。如果两者都以动态链接的形式使用MFC,使用起来没有任何问题,因为MFC.DLL库本身只会加载一次。但如果一个使用动态链接MFC,另一个使用静态链接MFC,或者两个模块都使用静态链接MFC方式编译,深层次的麻烦就来了,因为程序运行后,MFC框架代码实际上存在两份,A和B模块各自向不同的框架(MFCa和MFCb)注册了自己的模块信息,但是框架并不清楚还有其它框架存在,也就是说MFCa和MFCb互不知情。此时A申请动态创建B中的类,MFCa接到申请,但核实后发现并不存在B模块信息,创建失败。反过来也一样。
    除了这些例子,MFC中还有很多陷阱,比如TLS使用的陷阱、COM使用的陷阱等等,不知道MFC框架实现原理的人最好别轻易改动MFC的使用方式。