DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE宏分析

来源:互联网 发布:淘宝店开网店进货渠道 编辑:程序博客网 时间:2024/05/18 00:32
//EXE环境下以CCmdTarget继承CObject为例分析 DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE宏struct CRuntimeClass{// AttributesLPCSTR m_lpszClassName;int m_nObjectSize;UINT m_wSchema; // schema number of the loaded classCObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract classCRuntimeClass* m_pBaseClass;// OperationsCObject* CreateObject();BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const;// Implementationvoid Store(CArchive& ar) const;static CRuntimeClass* PASCAL Load(CArchive& ar, UINT* pwSchemaNum);// CRuntimeClass objects linked together in simple listCRuntimeClass* m_pNextClass;       // linked list of registered classes};//Cobject.hvirtual CRuntimeClass* GetRuntimeClass() const;//Cobject.cconst struct CRuntimeClass CObject::classCObject = { "CObject", sizeof(CObject), 0xffff, NULL, NULL, NULL };CRuntimeClass* CObject::GetRuntimeClass() const{return (CRuntimeClass*)(&CObject::classCObject);}//CCmdTarget头文件calss CCmdTarget : public CObject{public:static const CRuntimeClass classCCmdTarget;virtual CRuntimeClass* GetRuntimeClass() const;static CObject* PASCAL CreateObject();}//CCmdTarget源文件CObject * CCmdTarget::CreateObject(){return new CCmdTarget;}const CRuntimeClass CCmdTarget::classCCmdTarget = {"CCmdTarget", sizeof(class CCmdTarget), 0xFFFF, CCmdTarget::CreateObject, (CRuntimeClass*)(&CObject::classCObject), NULL};CRuntimeClass* CCmdTarget::GetRuntimeClass() const{return (CRuntimeClass*)(&CCmdTarget::classCCmdTarget);}//使用:    CRuntimeClass* pRuntimeClass = RUNTIME_CLASS(CCmdTarget);  CObject* pObject = pRuntimeClass->CreateObject();//以上未分析DECLARE_DYNAMIC,其实DECLARE_DYNCREATE是在ECLARE_DYNAMIC添加了动态创建,实现原理是一样的。