DECLARE_DYNCREATE
场景:DECLARE_DYNCREATE跟IMPLEMENT_DYNCREATE宏分析
DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE宏分析
DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE宏分析
//EXE环境下以CCmdTarget继承CObject为例分析 DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE宏 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; // Operations CObject* CreateObject(); BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const; // Implementation void Store(CArchive& ar) const; static CRuntimeClass* PASCAL Load(CArchive& ar, UINT* pwSchemaNum); // CRuntimeClass objects linked together in simple list CRuntimeClass* m_pNextClass; // linked list of registered classes }; //Cobject.h virtual CRuntimeClass* GetRuntimeClass() const; //Cobject.c const 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添加了动态创建,实现原理是一样的。