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 使用定义并且重写默认行为。