用真正的MFC 宏集,根据类名字符串动态生成!DECLARE_xxx, IMPLEMENT_xxx

来源:互联网 发布:手机淘宝5.9.2旧版本 编辑:程序博客网 时间:2024/06/05 17:03

凡读过侯老的关于MFC的书的人,没有人不晓得他对MFC RTTI机制细致入微的描述和模拟。

 

但那些macro(巨集)都是侯老为了描述问题方便,对真的 MFC 宏的拆解和重新组合。

 

那么用真正的MFC中定义的宏,如何动态生成。看我下面的程序吧。具体就不解释了,关心原理

人的都是看过侯老书的人,看过侯老书的人,自然知道原理。

 

(本程序在vc6 下测试通过。建立一个空白的win32程序,然后加入下面这一个程序文件就可以了。

别忘了在project setting中设置 use MFC in a static library 或 shared DLL。)

 

转载请注明出处

 

/*------------------ MFC dynamic creation ------------------

  Author: dubiousway

  Desc: a simulation of MFC dynamic creation,
        using real macros defined in MFC:
        DECLARE_xxx, IMPLEMENT_xxx

  Date: 11.25.2010
----------------------------------------------------------*/

#include <stdio.h>
#include <afx.h>


class CMyClsA:public CObject{
public:
    DECLARE_SERIAL(CMyClsA)
    CMyClsA(){ printf("CMyClsA constructor!/n"); }
};

class CMyClsB:public CObject{
public:
    DECLARE_SERIAL(CMyClsB)
    CMyClsB(){ printf("CMyClsB constructor!/n"); }
};

class CMyClsAA:public CMyClsA{
public:
    DECLARE_SERIAL(CMyClsAA)
    CMyClsAA(){ printf("CMyClsAA constructor!/n"); }
};


IMPLEMENT_SERIAL(CMyClsA,CObject,1)
IMPLEMENT_SERIAL(CMyClsB,CObject,1)
IMPLEMENT_SERIAL(CMyClsAA,CMyClsA,1)


CObject* CreateFromName(char* className){
    const CRuntimeClass* pClass;
    AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
    for (pClass = pModuleState->m_classList; pClass != NULL;pClass = pClass->m_pNextClass)
        if (lstrcmp(className, pClass->m_lpszClassName) == 0)
            break;
    return (pClass->m_pfnCreateObject)();
}


int main(){

    CObject* pObj1= CreateFromName("CMyClsB");
    CObject* pObj2= CreateFromName("CMyClsAA");
    delete pObj1;
    delete pObj2;

    return 0;
}


原创粉丝点击