DECLARE_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添加了动态创建,实现原理是一样的。