更改默认类工厂和聚合模型
ATL 使用 CComCoClass 为对象定义默认类工厂和聚合模型。 CComCoClass
指定以下两个宏:
DECLARE_CLASSFACTORY 将类工厂声明为 CComClassFactory。
DECLARE_AGGREGATABLE 声明对象可以聚合。
可以通过在类定义中指定另一个宏来替代这些默认值中的任何一个。 例如,若要使用 CComClassFactory2 而不是 CComClassFactory
,请指定 DECLARE_CLASSFACTORY2 宏:
class ATL_NO_VTABLE CMyClass2 :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMyClass2, &CLSID_MyClass>,
public IDispatchImpl<IMyClass, &IID_IMyClass, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IDispatchImpl<IMyDualInterface, &__uuidof(IMyDualInterface), &LIBID_NVC_ATL_COMLib, /* wMajor = */ 1, /* wMinor = */ 0>
{
public:
DECLARE_CLASSFACTORY2(CMyLicense)
// Remainder of class declaration omitted
定义类工厂的其他两个宏是 DECLARE_CLASSFACTORY_AUTO_THREAD 和 DECLARE_CLASSFACTORY_SINGLETON。
ATL 还使用 typedef
机制来实现默认行为。 例如,DECLARE_AGGREGATABLE 宏使用 typedef
定义调用 _CreatorClass
的类型,然后在整个 ATL 中引用该类型。 请注意,在派生类中,使用与基类的 typedef
同名的 typedef
会导致 ATL 使用定义并且重写默认行为。