框架原理第三讲,RTTCreate,运行时类型创建.(以MFC框架讲解)
框架原理第三讲,RTTCreate,运行时类型创建.(以MFC框架讲解)
通过昨天的讲解,我们已经理解了运行时类型识别是什么.
比如 CObject * pthis = (Cobject *)CreateObject("xxxx"); 这样通过字符串创建的方式是运行时类型创建.
只不过昨天为了讲解它的前半部分,举了一个简单的例子.
运行时类型识别,就是把我们的类名,和基类地址保存起来. 从一个链表中保存起来.
运行时类型创建就是把这个每个类的信息,在建立一张表来保存起来.
比如昨天我们写的
class CMyRuntimeClass { public: // Attributes LPCSTR m_lpszClassName; //名字 int m_nObjectSize; //对象大小 UINT m_wSchema; //版本号 CMyObject* (*m_pfnCreateObject)(); //创建对象的函数指针 CMyRuntimeClass* m_pBaseClass; //基类 CMyRuntimeClass* m_pNextClass; //下一个基类 void *pInit; //初始化数据 };
这个每个类都要初始化.且每个类初始化的时候,填写自己的类名. 创建对象的函数指针等等.
我们现在要做的就是把它在建立一张表保存起来.
1.创建链表,保存CRuntimeClass的信息
2.每次都要进行初始化,所以建立一个类专门进行初始化
置于为什么要新建立一个类进行初始化
是这样的.
我们用户建立的类,需要加入到这个链表中保存起来,但是要怎么保存?
1.构造中加入链表?
不行,这样每次new 对象就加一次很麻烦
2.全局变量加链表,保证每次加入一个.
可以,但是会遇到作用域的问题.
class CMyClassInit { public: CMyClassInit(CMyRuntimeClass* pRuntimeClass) { g_RuntimeList.push_back(pRuntimeClass); //每次运行,加入到链表中. } ~CMyClassInit() { } };
只需要变为静态的成员,既可加入到链表中.
因为静态成员太多,所以封装为了宏.
声明宏
所以支持动态创建的实现宏
只需要用户自己的类(除了theapp),以及所有支持动态创建的类(凡是继承CWND的类都要支持动态创建)
加上声明宏和实现宏既可.
使用RTTI动态创建.
1.提供根据名称创建对象的函数(在WMain)
CMyObject *CreateMyObj(const char *pClsName) { //遍历 for (MyIterator it = g_RuntimeList.begin(); it != g_RuntimeList.end(); it++) { CMyRuntimeClass *pRuntimeClass = *it; if (strcmp(pRuntimeClass->m_lpszClassName, pClsName) == 0) { if (pRuntimeClass->m_pfnCreateObject != NULL) return pRuntimeClass->m_pfnCreateObject(); } } return NULL; }
其内部就是遍历我们的链表信息,取得每一个类的CreateObj.
2.调用动态创建.
置于用户的类,在一开始生成类向导的时候才进行填写.
坚持两字,简单,轻便,但是真正的执行起来确实需要很长很长时间.当你把坚持两字当做你要走的路,那么你总会成功. 想学习,有问题请加群.群号:725864912(收费)群名称: 逆向学习小分队 群里有大量学习资源. 以及定期直播答疑.有一个良好的学习氛围. 涉及到外挂反外挂病毒 司法取证加解密 驱动过保护 VT 等技术,期待你的进入。
详情请点击链接查看置顶博客 https://www.cnblogs.com/iBinary/p/7572603.html
本文来自博客园,作者:iBinary,未经允许禁止转载 转载前可联系本人.对于爬虫人员来说如果发现保留起诉权力.https://www.cnblogs.com/iBinary/p/8077419.html
欢迎大家关注我的微信公众号.不定期的更新文章.更新技术. 关注公众号后请大家养成 不白嫖的习惯.欢迎大家赞赏. 也希望在看完公众号文章之后 不忘 点击 收藏 转发 以及点击在看功能. QQ群: