科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道CRuntimeClass结构

CRuntimeClass结构

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

每个从CObject中派生的类都有有一个CRuntimeClass对象同它关联以完成在运行时得到类实例的信息或者是它的基类,它在afx.h中的定义。

作者:ghost 来源:CSDN 2007年9月28日

关键字: ghost 结构

  • 评论
  • 分享微博
  • 分享邮件

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中。



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1629908

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章