CRuntimeClass结构

来源:互联网 发布:山东融资服务网络平台 编辑:程序博客网 时间:2024/05/10 10:19

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指向的类在派生来。

 // dynamic name lookup and creation
      static CRuntimeClass* PASCAL FromName(LPCSTR lpszClassName);
      static CRuntimeClass* PASCAL FromName(LPCWSTR lpszClassName);
      static CObject* PASCAL CreateObject(LPCSTR lpszClassName);
      static CObject* PASCAL CreateObject(LPCWSTR lpszClassName);

// 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
      const AFX_CLASSINIT* m_pClassInit;
};  

此间导出宏:

struct AFX_CLASSINIT
 { AFX_CLASSINIT(CRuntimeClass* pNewClass) { AfxClassInit(pNewClass); } };

结构中两个方法的实现如下:

CObject* CRuntimeClass::CreateObject()
{
     ENSURE(this);

     if (m_pfnCreateObject == NULL)
     {
             TRACE(traceAppMsg, 0,
              _T("Error: Trying to create object which is not ")
              _T("DECLARE_DYNCREATE /nor DECLARE_SERIAL: %hs./n"),
             m_lpszClassName);
             return NULL;
      }

     CObject* pObject = NULL;
     TRY
     {
              pObject = (*m_pfnCreateObject)();
     }
     END_TRY

     return pObject;
}

BOOL CRuntimeClass::IsDerivedFrom(const CRuntimeClass* pBaseClass) const
{
     ENSURE(this != NULL);
     ASSERT(AfxIsValidAddress(this, sizeof(CRuntimeClass), FALSE));
     ENSURE(pBaseClass != NULL);
     ASSERT(AfxIsValidAddress(pBaseClass, sizeof(CRuntimeClass), FALSE));

 // simple SI case
     const CRuntimeClass* pClassThis = this;
#ifdef _AFXDLL
     for (;;)
#else
     while (pClassThis != NULL)
#endif
 {
      if (pClassThis == pBaseClass)
      return TRUE;
#ifdef _AFXDLL
     if (pClassThis->m_pfnGetBaseClass == NULL)
     break;
     pClassThis = (*pClassThis->m_pfnGetBaseClass)();
#else
    pClassThis = pClassThis->m_pBaseClass;
#endif
 }
     return FALSE;       // walked to the top, no match
}

此结构存在于头文件afx.h中。结构中方法存在于文件objcore.cpp中。

原创粉丝点击