zoukankan      html  css  js  c++  java
  • MFC RTTI (DECLARE_DYNAMIC 及IMPLEMENT_DYNAMIC 宏)

    1.1     链表元素CRuntimeClass

    当达到RTTI的能力必须要达到一种能力就是在构建类的时候记录必要信息,以建立型录。型录中的类住处最好以链表的形式存。

    链表元素将以 CRuntimeClass描述

    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

            CRuntimeClass* m_pBaseClass;

            // CRuntimeClass objects linked together in simple list

            static CRuntimeClass* pFirstClass; // start of class list

            CRuntimeClass* m_pNextClass;       // linked list of registered classes

    };

    struct AFX_CLASSINIT

    {

    AFX_CLASSINIT(CRuntimeClass* pNewClass);

    };

    每一个类都有一个CRuntimeClass的成员变量。命名规则为 “class类名”。

    1.2     宏

    1.2.1  DECLARE_DYNAMIC

    说明:

    1.声明CRuntimeClass的静态变量,变量名为 class+类名

    2静态成员函数CRuntimeClass* GetRuntimeClass()const 来获取当前类CRuntimeClass静态成员的指针。

    class CCmdTarget : public CObject

    {

            DECLARE_DYNAMIC(CCmdTarget)

                       /*展开的话*/

    /*

    public:

             static CRuntimeClass classCCmdTarget;            //声明一个CRuntimeClass的变量

             virtual CRuntimeClass* GetRuntimeClass() const;  //声明一个函数GetRuntimeClass返回一个CRuntimeClass*

    */

    1.2.2  IMPLEMENT_DYNAMIC

    说明:此宏实现以下行为

    1. 初始化当前类的CRuntimeClass类型的成员变量。 初始化方式如下:
      m_lpszClassName=类名
      m_nObjectSize=sizeof(类)
      m_wSchema= 0xffff
      m_pfnCreateObject =NULL
      m_pBaseClass=指向父类的CRuntimeClass的指针
      m_pNextClass=NULL
    2. 初始化类静态成员CRuntimeClass的变量
      新类的CRuntime的成员m_pNextClass= CRuntimeClass::pFirstClasse
      CRuntimeClass::pFirstClass = pNewClass;

      这的意思是类成员classCRuntimeClass成员的pNext指向 CRuntimeClass::pFirstClasse;然后CRuntimeClass::pFirstClasse这个指针又指向了classCRuntimeClass这个类成员对象

    说明:
    CRuntimeClass::pFirstClasse这个指针始终指向最后一个类的’class类名’

    最后一个类的’class类名’的next成员始终指向他父类的 ‘class类名’

    IMPLEMENT_DYNAMIC(CCmdTarget, CObject) 

    /*

    CCmdTarget.classCCmdTarget={"CCmdTGarget",sizeof(CCmdTarget),0xffff,NULL,&CObject.classCObject,NULL};

    CCmdTarget.classCCmdTarget.m_pNextClass=CRuntimeClass::pFirstClass;

    CRuntimeClass::pFirstClass=CCmdTarget.classCCmdTarget;

    */

    参考:深入浅出MFC

    本人新博客网址为:http://www.hizds.com
    本博客注有“转”字样的为转载文章,其余为本人原创文章,转载请务必注明出处或保存此段。c++/lua/windows逆向交流群:69148232
  • 相关阅读:
    【转帖】电阻电容的封装
    FT2232H的MCU Host Bus Emulation 模式
    google cpp style guide
    CY7C131 BUSY信号线的接法
    有关沟通的常识
    关于for和foreach,兼顾效率与安全
    绩效面谈中处理分歧的小窍门
    SQL 合并列值和拆分列值
    如何保护.net中的dll文件(防止破解、反编译dll)(转)
    .NET框架图解之五:System.Reflection
  • 原文地址:https://www.cnblogs.com/zhangdongsheng/p/2412268.html
Copyright © 2011-2022 走看看