在《深入浅出MFC》一书的MFC六大关键技术仿真中,说各个类的静态CRuntimeClass成员变量是通过CRuntimeClass中的CRuntimeClass* pNext连接起来的,在动态创建对象时,根据提供的类名在这个链表中查找对应的CRuntimeClass成员,进而能够创建对象。但我在MFC实际的CRuntimeClass结构中并没有找到类似于CRuntimeClass* pNext的成员,大家能告诉我MFC是通过什么方法查找各个类的CRuntimeClass成员变量的吗?

解决方案 »

  1.   

    具体参照DECLARE_DYNAMIC宏定义。
      

  2.   

    TopLevel:
    在 哪个文件里可以看到DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC的定义?
      

  3.   

    [转]不知道对不对~
    CRuntimeClass结构
    要理解CObject,我们先来看一下CRuntimeClass这个在MFC中至关重要的一个结构。
    每个从CObject中派生的类都有有一个CRuntimeClass对象同它关联以完成在运行时得到类实例的信息或者是它的基类。 在afx.h中它的定义如下: 
    struct CRuntimeClass
    {
    // Attributes
    LPCSTR m_lpszClassName; //类名,一般是指包含CRuntimeClass对象的类的名称
    int m_nObjectSize; //包含CRuntimeClass对象的类sizeof的大小,不包括它分配的内存
    UINT m_wSchema; // schema number of the loaded class
    CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class 指向一个建立实例的构造函数#ifdef _AFXDLL
    CRuntimeClass* (PASCAL* m_pfnGetBaseClass)();
    #else
    CRuntimeClass* m_pBaseClass;
    #endif//以上m_pBaseClass的指针(函数)是MFC运行时确定类层次的关键,它一个简单的单向链表// Operations
    CObject* CreateObject(); //这个函数给予CObject 派生类运行时动态建立的能力
    BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const;//这个函数使用 m_pBaseClass或 m_pfnGetBaseClass遍历整个类层次确定是否pBaseClass指向的类是基类,
    //使用它可以判断某类是否是从pBaseClass指向的类在派生来。// Implementation
    void Store(CArchive& ar) const;
    static CRuntimeClass* PASCAL Load(CArchive& ar, UINT* pwSchemaNum);// CRuntimeClass objects linked together in simple list
    CRuntimeClass* m_pNextClass; // linked list of registered classes
    };
      

  4.   

    MFC的afx.h文件中CRuntimeClass定义如下: 
    struct CRuntimeClass
    {
    // Attributes
    LPCSTR m_lpszClassName;
    int m_nObjectSize;
    UINT m_wSchema; // schema number of the loaded class
    CObject* (PASCAL* m_pfnCreateObject)(); 
    #ifdef _AFXDLL
    CRuntimeClass* (PASCAL* m_pfnGetBaseClass)();
    #else
    CRuntimeClass* m_pBaseClass;
    #endif// Operations
    CObject* CreateObject();
    BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const;// Implementation
    void Store(CArchive& ar) const;
    static CRuntimeClass* PASCAL Load(CArchive& ar, UINT* pwSchemaNum); // CRuntimeClass objects linked together in simple list
    CRuntimeClass* m_pNextClass
    };大家看,是有m_pNextClass这个成员的,但MSDN对CRuntimeClass 的介绍中为什么没有呢?大家可以看一看,afx.h文件中CRuntimeClass定义与MSDN中对CRuntimeClass 的介绍是不一样的。
      

  5.   

    到Afx.h文件下,
    建议你还是看一下侯老师的书吧。
      

  6.   

    afx.h文件中CRuntimeClass定义与MSDN中对CRuntimeClass 的介绍是不一样的