Aggregation und Klassenfactory-Makros
Diese Makros bieten Möglichkeiten zum Steuern der Aggregation und zum Deklarieren von Klassenfabriken.
Makro | Beschreibung |
---|---|
DECLARE_AGGREGATABLE | Deklariert, dass Ihr Objekt aggregiert werden kann (standard). |
DECLARE_CLASSFACTORY | Deklariert die Klassenfactory als CComClassFactory, die ATL-Standardklassenfactory. |
DECLARE_CLASSFACTORY_EX | Deklariert das Klassenfactoryobjekt als Klassenfactory. |
DECLARE_CLASSFACTORY2 | Deklariert CComClassFactory2 als Klassenfactory. |
DECLARE_CLASSFACTORY_AUTO_THREAD | Deklariert CComClassFactoryAutoThread als Klassenfactory. |
DECLARE_CLASSFACTORY_SINGLETON | Deklariert CComClassFactorySingleton als Klassenfactory. |
DECLARE_GET_CONTROLLING_UNKNOWN | Deklariert eine virtuelle GetControllingUnknown Funktion. |
DECLARE_NOT_AGGREGATABLE | Deklariert, dass das Objekt nicht aggregiert werden kann. |
DECLARE_ONLY_AGGREGATABLE | Deklariert, dass das Objekt aggregiert werden muss. |
DECLARE_POLY_AGGREGATABLE | Überprüft den Wert des äußeren Unbekannten und deklariert das aggregatierbare oder nicht aggregierbare Objekt entsprechend. |
DECLARE_PROTECT_FINAL_CONSTRUCT | Schützt das äußere Objekt vor dem Löschen während der Konstruktion eines inneren Objekts. |
DECLARE_VIEW_STATUS | Gibt die VIEWSTATUS-Flags für den Container an. |
Anforderungen
Kopfzeile: atlcom.h
DECLARE_AGGREGATABLE
Gibt an, dass Ihr Objekt aggregiert werden kann.
DECLARE_AGGREGATABLE( x )
Parameter
x
[in] Der Name der Klasse, die Sie als aggregierbar definieren.
Hinweise
CComCoClass enthält dieses Makro, um das Standardaggregationsmodell anzugeben. Um diese Standardeinstellung außer Kraft zu setzen, geben Sie entweder das DECLARE_NOT_AGGREGATABLE - oder DECLARE_ONLY_AGGREGATABLE Makro in der Klassendefinition an.
Beispiel
class ATL_NO_VTABLE CNoAggClass :
public CComObjectRoot,
public CComCoClass<CNoAggClass, &CLSID_NoAggClass>
{
public:
CNoAggClass()
{
}
DECLARE_NOT_AGGREGATABLE(CNoAggClass)
};
DECLARE_CLASSFACTORY
Deklariert CComClassFactory als Klassenfactory.
DECLARE_CLASSFACTORY()
Hinweise
CComCoClass verwendet dieses Makro, um die Standardklassenfactory für Ihr Objekt zu deklarieren.
Beispiel
class ATL_NO_VTABLE CMyClass :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMyClass, &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_CLASSFACTORY()
// Remainder of class declaration omitted
CComClassFactory-Klasse
Diese Klasse implementiert die IClassFactory-Schnittstelle .
class CComClassFactory : public IClassFactory,
public CComObjectRootEx<CComGlobalsThreadModel>
Hinweise
CComClassFactory
implementiert die IClassFactory-Schnittstelle , die Methoden zum Erstellen eines Objekts einer bestimmten CLSID enthält, sowie das Sperren der Klassenfactory im Arbeitsspeicher, damit neue Objekte schneller erstellt werden können. IClassFactory
muss für jede Klasse implementiert werden, die Sie in der Systemregistrierung registrieren und der Sie eine CLSID zuweisen.
ATL-Objekte erwerben normalerweise eine Klassenfactory, indem sie von CComCoClass abgeleitet wird. Diese Klasse enthält das Makro DECLARE_CLASSFACTORY, das als Standardklassenfactory deklariert wird CComClassFactory
. Um diese Standardeinstellung außer Kraft zu setzen, geben Sie eines der DECLARE_CLASSFACTORYXXX-Makros in Ihrer Klassendefinition an. Beispielsweise verwendet das DECLARE_CLASSFACTORY_EX-Makro die angegebene Klasse für die Klassenfactory:
class ATL_NO_VTABLE CMyCustomClass :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMyCustomClass, &CLSID_MyCustomClass>,
public IDispatchImpl<IMyCustomClass, &IID_IMyCustomClass, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
DECLARE_CLASSFACTORY_EX(CMyClassFactory)
// Remainder of class declaration omitted.
Die obige Klassendefinition gibt an, dass CMyClassFactory
als Standardklassenfactory des Objekts verwendet wird. CMyClassFactory
muss von CComClassFactory
und außer Kraft setzen CreateInstance
.
ATL stellt drei weitere Makros bereit, die eine Klassenfactory deklarieren:
DECLARE_CLASSFACTORY2 verwendet CComClassFactory2, wodurch die Erstellung über eine Lizenz gesteuert wird.
DECLARE_CLASSFACTORY_AUTO_THREAD verwendet CComClassFactoryAutoThread, das Objekte in mehreren Wohnungen erstellt.
DECLARE_CLASSFACTORY_SINGLETON verwendet CComClassFactorySingleton, das ein einzelnes CComObjectGlobal -Objekt erstellt.
DECLARE_CLASSFACTORY_EX
cf
Deklariert als Klassenfactory.
DECLARE_CLASSFACTORY_EX( cf )
Parameter
vgl
[in] Der Name der Klasse, die Ihr Klassenfactoryobjekt implementiert.
Hinweise
Der cf-Parameter muss von CComClassFactory abgeleitet und die CreateInstance
Methode überschreiben.
CComCoClass enthält das DECLARE_CLASSFACTORY-Makro , das als Standardklassenfactory angibt CComClassFactory
. Indem Sie jedoch das DECLARE_CLASSFACTORY_EX Makro in die Klassendefinition Ihres Objekts einschließen, setzen Sie diese Standardeinstellung außer Kraft.
Beispiel
class ATL_NO_VTABLE CMyCustomClass :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMyCustomClass, &CLSID_MyCustomClass>,
public IDispatchImpl<IMyCustomClass, &IID_IMyCustomClass, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
DECLARE_CLASSFACTORY_EX(CMyClassFactory)
// Remainder of class declaration omitted.
DECLARE_CLASSFACTORY2
Deklariert CComClassFactory2 als Klassenfactory.
DECLARE_CLASSFACTORY2( lic )
Parameter
lic
[in] Eine Klasse, die VerifyLicenseKey
, GetLicenseKey
und IsLicenseValid
.
Hinweise
CComCoClass enthält das DECLARE_CLASSFACTORY-Makro, das CComClassFactory als Standardklassenfactory angibt. Indem Sie jedoch das DECLARE_CLASSFACTORY2 Makro in die Klassendefinition Ihres Objekts einschließen, setzen Sie diese Standardeinstellung außer Kraft.
Beispiel
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
CComClassFactory2-Klasse
Diese Klasse implementiert die IClassFactory2-Schnittstelle .
template <class license>
class CComClassFactory2 : public IClassFactory2,
public CComObjectRootEx<CComGlobalsThreadModel>,
public license
Parameter
license
Eine Klasse, die die folgenden statischen Funktionen implementiert:
static BOOL VerifyLicenseKey( BSTR bstr );
static BOOL GetLicenseKey( DWORD dwReserved, BSTR * pBstr );
static BOOL IsLicenseValid( );
Hinweise
CComClassFactory2
implementiert die IClassFactory2-Schnittstelle , die eine Erweiterung von IClassFactory ist. IClassFactory2
steuert die Objekterstellung über eine Lizenz. Eine Klassenfactory, die auf einem lizenzierten Computer ausgeführt wird, kann einen Laufzeitlizenzschlüssel bereitstellen. Mit diesem Lizenzschlüssel kann eine Anwendung Objekte instanziieren, wenn keine vollständige Computerlizenz vorhanden ist.
ATL-Objekte erwerben normalerweise eine Klassenfactory, indem sie von CComCoClass abgeleitet wird. Diese Klasse enthält das Makro DECLARE_CLASSFACTORY, das CComClassFactory als Standardklassenfactory deklariert. Geben Sie zum Verwenden CComClassFactory2
das DECLARE_CLASSFACTORY2 Makro in der Klassendefinition des Objekts an. Zum Beispiel:
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
CMyLicense
, der Vorlagenparameter für CComClassFactory2
, muss die statischen Funktionen VerifyLicenseKey
GetLicenseKey
, , und IsLicenseValid
. Im Folgenden sehen Sie ein Beispiel für eine einfache Lizenzklasse:
class CMyLicense
{
protected:
static BOOL VerifyLicenseKey(BSTR bstr)
{
USES_CONVERSION;
return !lstrcmp(OLE2T(bstr), _T("My run-time license key"));
}
static BOOL GetLicenseKey(DWORD /*dwReserved*/, BSTR* pBstr)
{
USES_CONVERSION;
*pBstr = SysAllocString( T2OLE(_T("My run-time license key")));
return TRUE;
}
static BOOL IsLicenseValid() { return TRUE; }
};
CComClassFactory2
abgeleitet von sowohl als auch CComClassFactory2Base
von der Lizenz. CComClassFactory2Base
, wiederum abgeleitet von IClassFactory2
und CComObjectRootEx< CComGlobalsThreadModel >.
DECLARE_CLASSFACTORY_AUTO_THREAD
Deklariert CComClassFactoryAutoThread als Klassenfactory.
DECLARE_CLASSFACTORY_AUTO_THREAD()
Hinweise
CComCoClass enthält das DECLARE_CLASSFACTORY-Makro, das CComClassFactory als Standardklassenfactory angibt. Indem Sie jedoch das DECLARE_CLASSFACTORY_AUTO_THREAD Makro in die Klassendefinition Ihres Objekts einschließen, setzen Sie diese Standardeinstellung außer Kraft.
Wenn Sie Objekte in mehreren Wohnungen (in einem out-of-proc-Server) erstellen, fügen Sie Ihrer Klasse DECLARE_CLASSFACTORY_AUTO_THREAD hinzu.
Beispiel
class ATL_NO_VTABLE CMyAutoClass :
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<CMyAutoClass, &CLSID_MyAutoClass>,
public IMyAutoClass
{
public:
DECLARE_CLASSFACTORY_AUTO_THREAD()
// Remainder of class declaration omitted.
CComClassFactoryAutoThread-Klasse
Diese Klasse implementiert die IClassFactory-Schnittstelle und ermöglicht das Erstellen von Objekten in mehreren Wohnungen.
Wichtig
Diese Klasse und ihre Member können nicht in Anwendungen verwendet werden, die in der Windows-Runtime ausgeführt werden.
class CComClassFactoryAutoThread : public IClassFactory,
public CComObjectRootEx<CComGlobalsThreadModel>
Hinweise
CComClassFactoryAutoThread
ähnelt CComClassFactory, ermöglicht jedoch die Erstellung von Objekten in mehreren Wohnungen. Um diese Unterstützung nutzen zu können, leiten Sie Ihr EXE-Modul von CComAutoThreadModule ab.
ATL-Objekte erwerben normalerweise eine Klassenfactory, indem sie von CComCoClass abgeleitet wird. Diese Klasse enthält das Makro DECLARE_CLASSFACTORY, das CComClassFactory als Standardklassenfactory deklariert. Geben Sie zum Verwenden CComClassFactoryAutoThread
das DECLARE_CLASSFACTORY_AUTO_THREAD Makro in der Klassendefinition des Objekts an. Zum Beispiel:
class ATL_NO_VTABLE CMyAutoClass :
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<CMyAutoClass, &CLSID_MyAutoClass>,
public IMyAutoClass
{
public:
DECLARE_CLASSFACTORY_AUTO_THREAD()
// Remainder of class declaration omitted.
DECLARE_CLASSFACTORY_SINGLETON
Deklariert CComClassFactorySingleton als Klassenfactory.
DECLARE_CLASSFACTORY_SINGLETON( obj )
Parameter
obj
[in] Der Name des Klassenobjekts.
Hinweise
CComCoClass enthält das DECLARE_CLASSFACTORY-Makro, das CComClassFactory als Standardklassenfactory angibt. Indem Sie jedoch das DECLARE_CLASSFACTORY_SINGLETON Makro in die Klassendefinition Ihres Objekts einschließen, setzen Sie diese Standardeinstellung außer Kraft.
Beispiel
class ATL_NO_VTABLE CMySingletonClass :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMySingletonClass, &CLSID_MySingletonClass>,
public IMySingletonClass
{
public:
DECLARE_CLASSFACTORY_SINGLETON(CMySingletonClass)
// Remainder of class declaration omitted.
CComClassFactorySingleton-Klasse
Diese Klasse wird von CComClassFactory abgeleitet und verwendet CComObjectGlobal , um ein einzelnes Objekt zu erstellen.
Wichtig
Diese Klasse und ihre Member können nicht in Anwendungen verwendet werden, die in der Windows-Runtime ausgeführt werden.
template<class T>
class CComClassFactorySingleton : public CComClassFactory
Parameter
T
Ihr Kurs.
CComClassFactorySingleton
abgeleitet von CComClassFactory und verwendet CComObjectGlobal , um ein einzelnes Objekt zu erstellen. Jeder Aufruf der CreateInstance
Methode fragt dieses Objekt einfach nach einem Schnittstellenzeiger ab.
Hinweise
ATL-Objekte erwerben normalerweise eine Klassenfactory, indem sie von CComCoClass abgeleitet wird. Diese Klasse enthält das Makro DECLARE_CLASSFACTORY, das als Standardklassenfactory deklariert wird CComClassFactory
. Geben Sie zum Verwenden CComClassFactorySingleton
das DECLARE_CLASSFACTORY_SINGLETON Makro in der Klassendefinition des Objekts an. Zum Beispiel:
class ATL_NO_VTABLE CMySingletonClass :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMySingletonClass, &CLSID_MySingletonClass>,
public IMySingletonClass
{
public:
DECLARE_CLASSFACTORY_SINGLETON(CMySingletonClass)
// Remainder of class declaration omitted.
DECLARE_GET_CONTROLLING_UNKNOWN
Deklariert eine virtuelle Funktion GetControllingUnknown
.
DECLARE_GET_CONTROLLING_UNKNOWN()
Hinweise
Fügen Sie dieses Makro zu Ihrem Objekt hinzu, wenn Sie die nicht definierte Compilerfehlermeldung GetControllingUnknown
erhalten (z. B. in CComAggregateCreator
).
DECLARE_NOT_AGGREGATABLE
Gibt an, dass Ihr Objekt nicht aggregiert werden kann.
DECLARE_NOT_AGGREGATABLE( x )
Parameter
x
[in] Der Name des Klassenobjekts, das Sie definieren, ist nicht aggregierbar.
Hinweise
DECLARE_NOT_AGGREGATABLE bewirkt CreateInstance
, dass ein Fehler (CLASS_E_NOAGGREGATION) zurückgegeben wird, wenn versucht wird, das Objekt zu aggregieren.
Standardmäßig enthält CComCoClass das DECLARE_AGGREGATABLE Makro, das angibt, dass Ihr Objekt aggregiert werden kann. Um dieses Standardverhalten außer Kraft zu setzen, schließen Sie DECLARE_NOT_AGGREGATABLE in die Klassendefinition ein.
Beispiel
class ATL_NO_VTABLE CNoAggClass :
public CComObjectRoot,
public CComCoClass<CNoAggClass, &CLSID_NoAggClass>
{
public:
CNoAggClass()
{
}
DECLARE_NOT_AGGREGATABLE(CNoAggClass)
};
DECLARE_ONLY_AGGREGATABLE
Gibt an, dass Das Objekt aggregiert werden muss.
DECLARE_ONLY_AGGREGATABLE( x )
Parameter
x
[in] Der Name des Klassenobjekts, das Sie definieren, ist nur aggregierbar.
Hinweise
DECLARE_ONLY_AGGREGATABLE verursacht einen Fehler (E_FAIL), wenn versucht wird, das Objekt als nicht aggregiertes Objekt zu CoCreate
verwenden.
Standardmäßig enthält CComCoClass das DECLARE_AGGREGATABLE Makro, das angibt, dass Ihr Objekt aggregiert werden kann. Um dieses Standardverhalten außer Kraft zu setzen, fügen Sie DECLARE_ONLY_AGGREGATABLE in die Klassendefinition ein.
Beispiel
class ATL_NO_VTABLE COnlyAggClass :
public CComObjectRoot,
public CComCoClass<COnlyAggClass, &CLSID_OnlyAggClass>
{
public:
COnlyAggClass()
{
}
DECLARE_ONLY_AGGREGATABLE(COnlyAggClass)
};
DECLARE_POLY_AGGREGATABLE
Gibt an, dass beim Erstellen des Objekts eine Instanz von CComPolyObject < x > erstellt wird.
DECLARE_POLY_AGGREGATABLE( x )
Parameter
x
[in] Der Name des Klassenobjekts, das Sie als aggregierbar oder nicht aggregierbar definieren.
Hinweise
Während der Erstellung wird der Wert des äußeren Unbekannten überprüft. Wenn es NULL ist, IUnknown
wird für ein nicht aggregiertes Objekt implementiert. Wenn das äußere Unbekannte nicht NULL ist, IUnknown
wird für ein aggregiertes Objekt implementiert.
Der Vorteil der Verwendung von DECLARE_POLY_AGGREGATABLE besteht darin, dass Sie sowohl als auch CComAggObject
CComObject
in Ihrem Modul vermeiden, die aggregierten und nicht aggregierten Fälle zu verarbeiten. Ein einzelnes CComPolyObject
Objekt behandelt beide Fälle. Dies bedeutet, dass nur eine Kopie der vtable und eine Kopie der Funktionen in Ihrem Modul vorhanden ist. Wenn die vtable groß ist, kann dies die Modulgröße erheblich verringern. Wenn die vtable jedoch klein ist, kann die Verwendung CComPolyObject
zu einer etwas größeren Modulgröße führen, da sie nicht für ein aggregiertes oder nicht aggregiertes Objekt optimiert ist, wie es sind CComAggObject
und CComObject
.
Das DECLARE_POLY_AGGREGATABLE Makro wird automatisch in Ihrem Objekt deklariert, wenn Sie den ATL-Steuerelement-Assistenten zum Erstellen eines Vollzugriffs verwenden.
DECLARE_PROTECT_FINAL_CONSTRUCT
Schützt, dass Ihr Objekt gelöscht wird, wenn (während FinalConstruct) das interne aggregierte Objekt die Verweisanzahl erhöht und dann die Anzahl auf 0 erhöht.
DECLARE_PROTECT_FINAL_CONSTRUCT()
DECLARE_VIEW_STATUS
Platzieren Sie dieses Makro in der Steuerelementklasse eines ATL-ActiveX-Steuerelements, um die VIEWSTATUS-Flags für den Container anzugeben.
DECLARE_VIEW_STATUS( statusFlags )
Parameter
statusFlags
[in] Die VIEWSTATUS-Flags. Eine Liste von Flags finden Sie unter VIEWSTATUS .
Beispiel
DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)