• 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
  • 相关阅读:
    进程&线程
    PLAN
    Note-Virus
    编译器 CL.EXE / RC.EXE
    windows API
    centos6.5系统中yum命令出错
    VMware Workstation10 下安装 CentOS6.5( 安装图文教程 )
    Linux下网络能ping通地址 但是ping不通域名
    MySQL数据库优化的八种方式(经典必看)
    Java中常见的对象类型简述(DO、BO、DTO、VO、AO、PO)
  • 原文地址:https://www.cnblogs.com/zhangdongsheng/p/2412268.html
Copyright © 2020-2023  润新知