Aracılığıyla paylaş


Toplama ve Sınıf Üreticisi Makroları

Bu makrolar toplamayı denetlemenin ve sınıf fabrikalarını bildirmenin yollarını sağlar.

Makro Açıklama
DECLARE_AGGREGATABLE Nesnenizin toplanabileceğini bildirir (varsayılan).
DECLARE_CLASSFACTORY Sınıf fabrikasını, ATL varsayılan sınıf fabrikası olan CComClassFactory olarak bildirir.
DECLARE_CLASSFACTORY_EX Sınıf fabrika nesnenizi sınıf fabrikası olarak bildirir.
DECLARE_CLASSFACTORY2 CComClassFactory2'yi sınıf fabrikası olarak bildirir.
DECLARE_CLASSFACTORY_AUTO_THREAD CComClassFactoryAutoThread öğesini sınıf fabrikası olarak bildirir.
DECLARE_CLASSFACTORY_SINGLETON CComClassFactorySingleton'ı sınıf fabrikası olarak bildirir.
DECLARE_GET_CONTROLLING_UNKNOWN Bir sanal GetControllingUnknown işlev bildirir.
DECLARE_NOT_AGGREGATABLE Nesnenizin toplanamayacağını bildirir.
DECLARE_ONLY_AGGREGATABLE Nesnenizin toplanması gerektiğini bildirir.
DECLARE_POLY_AGGREGATABLE Dış bilinmeyenin değerini denetler ve nesnenizi uygun şekilde birlestirilebilir veya birlestirilemez olarak bildirir.
DECLARE_PROTECT_FINAL_CONSTRUCT İç nesnenin oluşturulması sırasında dış nesneyi silinmeye karşı korur.
DECLARE_VIEW_STATUS Kapsayıcı için VIEWSTATUS bayraklarını belirtir.

Gereksinimler

Üst bilgi: atlcom.h

DECLARE_AGGREGATABLE

Nesnenizin toplanabilir olduğunu belirtir.

DECLARE_AGGREGATABLE( x )

Parametreler

x
[in] Toplayıcı olarak tanımladığınız sınıfın adı.

Açıklamalar

CComCoClass , varsayılan toplama modelini belirtmek için bu makroyu içerir. Bu varsayılanı geçersiz kılmak için sınıf tanımınızda DECLARE_NOT_AGGREGATABLE veya DECLARE_ONLY_AGGREGATABLE makroyu belirtin.

Örnek

class ATL_NO_VTABLE CNoAggClass :
   public CComObjectRoot,
   public CComCoClass<CNoAggClass, &CLSID_NoAggClass>
{
public:
   CNoAggClass()
   {
   }

   DECLARE_NOT_AGGREGATABLE(CNoAggClass)
};

DECLARE_CLASSFACTORY

CComClassFactory'yi sınıf fabrikası olarak bildirir.

DECLARE_CLASSFACTORY()

Açıklamalar

CComCoClass , nesneniz için varsayılan sınıf fabrikasını bildirmek üzere bu makroyu kullanır.

Örnek

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 Sınıfı

Bu sınıf IClassFactory arabirimini uygular.

class CComClassFactory : public IClassFactory,
public CComObjectRootEx<CComGlobalsThreadModel>

Açıklamalar

CComClassFactory, belirli bir CLSID nesnesini oluşturmaya ve yeni nesnelerin daha hızlı oluşturulmasına izin vermek için sınıf fabrikasını belleğe kilitlemeye yönelik yöntemleri içeren IClassFactory arabirimini uygular. IClassFactory sistem kayıt defterine kaydettiğiniz ve CLSID atadığınız her sınıf için uygulanmalıdır.

ATL nesneleri normalde CComCoClass'tan türetilerek bir sınıf fabrikası alır. Bu sınıf, varsayılan sınıf fabrikası olarak bildiren CComClassFactory makro DECLARE_CLASSFACTORY içerir. Bu varsayılanı geçersiz kılmak için sınıf tanımınızdaki DECLARE_CLASSFACTORYXXX makrolarından birini belirtin. Örneğin, DECLARE_CLASSFACTORY_EX makro sınıf fabrikası için belirtilen sınıfı kullanır:

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.

Yukarıdaki sınıf tanımı, CMyClassFactory nesnenin varsayılan sınıf fabrikası olarak bunun kullanılacağını belirtir. CMyClassFactory ,'den CComClassFactory türetilmelidir ve geçersiz kılmalıdır CreateInstance.

ATL, sınıf fabrikası bildiren üç makro daha sağlar:

  • DECLARE_CLASSFACTORY2 Bir lisans aracılığıyla oluşturmayı denetleyen CComClassFactory2 kullanır.

  • DECLARE_CLASSFACTORY_AUTO_THREAD Birden çok dairede nesne oluşturan CComClassFactoryAutoThread kullanır.

  • DECLARE_CLASSFACTORY_SINGLETON Tek bir CComObjectGlobal nesnesi oluşturan CComClassFactorySingleton kullanır.

DECLARE_CLASSFACTORY_EX

cf Sınıf fabrikası olduğunu bildirir.

DECLARE_CLASSFACTORY_EX( cf )

Parametreler

Cf
[in] Sınıf fabrika nesnenizi uygulayan sınıfın adı.

Açıklamalar

cf parametresi CComClassFactory'den türetilmelidir ve yöntemini geçersiz kılmalıdırCreateInstance.

CComCoClass, varsayılan sınıf fabrikası olarak belirten CComClassFactory DECLARE_CLASSFACTORY makroyu içerir. Ancak, nesnenizin sınıf tanımına DECLARE_CLASSFACTORY_EX makro ekleyerek bu varsayılanı geçersiz kılarsınız.

Örnek

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

CComClassFactory2'yi sınıf fabrikası olarak bildirir.

DECLARE_CLASSFACTORY2( lic )

Parametreler

lic
[in] , GetLicenseKeyve IsLicenseValiduygulayan VerifyLicenseKeybir sınıf.

Açıklamalar

CComCoClass, CComClassFactory'yi varsayılan sınıf fabrikası olarak belirten DECLARE_CLASSFACTORY makroyu içerir. Ancak, nesnenizin sınıf tanımına DECLARE_CLASSFACTORY2 makro ekleyerek bu varsayılanı geçersiz kılarsınız.

Örnek

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 Sınıfı

Bu sınıf IClassFactory2 arabirimini uygular.

template <class license>
class  CComClassFactory2 : public IClassFactory2,
    public CComObjectRootEx<CComGlobalsThreadModel>,
    public license

Parametreler

lisans
Aşağıdaki statik işlevleri uygulayan bir sınıf:

  • static BOOL VerifyLicenseKey( BSTR bstr );

  • static BOOL GetLicenseKey( DWORD dwReserved, BSTR * pBstr );

  • static BOOL IsLicenseValid( );

Açıklamalar

CComClassFactory2, IClassFactory'nin uzantısı olan IClassFactory2 arabirimini uygular. IClassFactory2 bir lisans aracılığıyla nesne oluşturmayı denetler. Lisanslı bir makinede yürütülen bir sınıf fabrikası bir çalışma zamanı lisans anahtarı sağlayabilir. Bu lisans anahtarı, bir uygulamanın tam makine lisansı olmadığında nesnelerin örneğini oluşturmasına olanak tanır.

ATL nesneleri normalde CComCoClass'tan türetilerek bir sınıf fabrikası alır. Bu sınıf, CComClassFactory'yi varsayılan sınıf fabrikası olarak bildiren makro DECLARE_CLASSFACTORY içerir. kullanmak CComClassFactory2için nesnenizin sınıf tanımında DECLARE_CLASSFACTORY2 makroyu belirtin. Örneğin:

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, için şablon parametresinin CComClassFactory2, GetLicenseKeyve IsLicenseValidstatik işlevlerini VerifyLicenseKeyuygulaması gerekir. Aşağıda basit bir lisans sınıfı örneği verilmiştir:

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; }
};

CComClassFactory2hem hem de CComClassFactory2Base lisanstan türetilir. CComClassFactory2Base, ve CComObjectRootEx CComGlobalsThreadModel'den IClassFactory2 türetilir>.<

DECLARE_CLASSFACTORY_AUTO_THREAD

CComClassFactoryAutoThread öğesini sınıf fabrikası olarak bildirir.

DECLARE_CLASSFACTORY_AUTO_THREAD()

Açıklamalar

CComCoClass, CComClassFactory'yi varsayılan sınıf fabrikası olarak belirten DECLARE_CLASSFACTORY makroyu içerir. Ancak, nesnenizin sınıf tanımına DECLARE_CLASSFACTORY_AUTO_THREAD makro ekleyerek bu varsayılanı geçersiz kılarsınız.

Birden çok dairede nesne oluşturduğunuzda (proc dışı bir sunucuda), sınıfınıza DECLARE_CLASSFACTORY_AUTO_THREAD ekleyin.

Örnek

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 Sınıfı

Bu sınıf IClassFactory arabirimini uygular ve nesnelerin birden çok dairede oluşturulmasına izin verir.

Önemli

Bu sınıf ve üyeleri Windows Çalışma Zamanı yürütülen uygulamalarda kullanılamaz.

class CComClassFactoryAutoThread : public IClassFactory,
public CComObjectRootEx<CComGlobalsThreadModel>

Açıklamalar

CComClassFactoryAutoThreadCComClassFactory'ye benzer, ancak nesnelerin birden çok dairede oluşturulmasına izin verir. Bu destekten yararlanmak için EXE modülünüzü CComAutoThreadModule'dan türetin.

ATL nesneleri normalde CComCoClass'tan türetilerek bir sınıf fabrikası alır. Bu sınıf, CComClassFactory'yi varsayılan sınıf fabrikası olarak bildiren makro DECLARE_CLASSFACTORY içerir. kullanmak CComClassFactoryAutoThreadiçin nesnenizin sınıf tanımında DECLARE_CLASSFACTORY_AUTO_THREAD makroyu belirtin. Örneğin:

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

CComClassFactorySingleton'ı sınıf fabrikası olarak bildirir.

DECLARE_CLASSFACTORY_SINGLETON( obj )

Parametreler

Obj
[in] Sınıf nesnenizin adı.

Açıklamalar

CComCoClass, CComClassFactory'yi varsayılan sınıf fabrikası olarak belirten DECLARE_CLASSFACTORY makroyu içerir. Ancak, nesnenizin sınıf tanımına DECLARE_CLASSFACTORY_SINGLETON makroyu ekleyerek bu varsayılanı geçersiz kılarsınız.

Örnek

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 Sınıfı

Bu sınıf CComClassFactory'den türetilir ve tek bir nesne oluşturmak için CComObjectGlobal kullanır.

Önemli

Bu sınıf ve üyeleri Windows Çalışma Zamanı yürütülen uygulamalarda kullanılamaz.

template<class T>
class CComClassFactorySingleton : public CComClassFactory

Parametreler

T
Senin sınıfın.

CComClassFactorySingletonCComClassFactory'den türetilir ve tek bir nesne oluşturmak için CComObjectGlobal kullanır. Yöntemine yapılan CreateInstance her çağrı, bir arabirim işaretçisi için bu nesneyi sorgular.

Açıklamalar

ATL nesneleri normalde CComCoClass'tan türetilerek bir sınıf fabrikası alır. Bu sınıf, varsayılan sınıf fabrikası olarak bildiren CComClassFactory makro DECLARE_CLASSFACTORY içerir. kullanmak CComClassFactorySingletoniçin nesnenizin sınıf tanımında DECLARE_CLASSFACTORY_SINGLETON makroyu belirtin. Örneğin:

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

bir sanal işlevi GetControllingUnknownbildirir.

DECLARE_GET_CONTROLLING_UNKNOWN()

Açıklamalar

Tanımlanmamış derleyici hata iletisini alırsanız nesnenize bu makroyu GetControllingUnknown ekleyin (örneğin, içinde CComAggregateCreator).

DECLARE_NOT_AGGREGATABLE

Nesnenizin toplanamayacağını belirtir.

DECLARE_NOT_AGGREGATABLE( x )

Parametreler

x
[in] Kümelenebilir değil olarak tanımladığınız sınıf nesnesinin adı.

Açıklamalar

DECLARE_NOT_AGGREGATABLE, nesnenize toplama girişiminde bulunulsa hata (CLASS_E_NOAGGREGATION) döndürmesine neden olur CreateInstance .

Varsayılan olarak, CComCoClass nesnenizin toplanabileceğini belirten DECLARE_AGGREGATABLE makroyu içerir. Bu varsayılan davranışı geçersiz kılmak için sınıf tanımınıza DECLARE_NOT_AGGREGATABLE ekleyin.

Örnek

class ATL_NO_VTABLE CNoAggClass :
   public CComObjectRoot,
   public CComCoClass<CNoAggClass, &CLSID_NoAggClass>
{
public:
   CNoAggClass()
   {
   }

   DECLARE_NOT_AGGREGATABLE(CNoAggClass)
};

DECLARE_ONLY_AGGREGATABLE

Nesnenizin toplanması gerektiğini belirtir.

DECLARE_ONLY_AGGREGATABLE( x )

Parametreler

x
[in] Yalnızca toplayıcı olarak tanımladığınız sınıf nesnesinin adı.

Açıklamalar

DECLARE_ONLY_AGGREGATABLE, nesnenize toplanmamış nesne olarak bir girişimde bulunulduysa hataya CoCreate (E_FAIL) neden olur.

Varsayılan olarak, CComCoClass nesnenizin toplanabileceğini belirten DECLARE_AGGREGATABLE makroyu içerir. Bu varsayılan davranışı geçersiz kılmak için sınıf tanımınıza DECLARE_ONLY_AGGREGATABLE ekleyin.

Örnek

class ATL_NO_VTABLE COnlyAggClass :
   public CComObjectRoot,
   public CComCoClass<COnlyAggClass, &CLSID_OnlyAggClass>
{
public:
   COnlyAggClass()
   {
   }

   DECLARE_ONLY_AGGREGATABLE(COnlyAggClass)
};

DECLARE_POLY_AGGREGATABLE

Nesneniz oluşturulduğunda CComPolyObject < x > örneğinin oluşturulduğunu belirtir.

DECLARE_POLY_AGGREGATABLE( x )

Parametreler

x
[in] Toplayıcı olarak tanımladığınız veya toplayıcı olmayan sınıf nesnesinin adı.

Açıklamalar

Oluşturma sırasında, dış bilinmeyenin değeri denetlendi. NULL ise, IUnknown toplama yapılmamış bir nesne için uygulanır. Dış bilinmeyen NULL değilse, IUnknown toplanan nesne için uygulanır.

DECLARE_POLY_AGGREGATABLE kullanmanın avantajı, toplanan ve CComObject toplanmamış durumları işlemek için modülünüzde hem hem de CComAggObject kullanmaktan kaçınmanızdır. Tek CComPolyObject bir nesne her iki durumu da işler. Bu, modülünüzde vtable'ın yalnızca bir kopyası ve işlevlerin bir kopyası olduğu anlamına gelir. Vtable'ınız büyükse bu, modülünüzün boyutunu önemli ölçüde azaltabilir. Ancak, vtable'ınız küçükse ve CComPolyObject gibi toplanmış veya toplanmamış bir nesne için iyileştirilmediğinden kullanarak CComAggObject CComObjectmodül boyutu biraz daha büyük olabilir.

Tam denetim oluşturmak için ATL Denetim Sihirbazı'nı kullanırsanız, nesnenizde DECLARE_POLY_AGGREGATABLE makro otomatik olarak bildirilir.

DECLARE_PROTECT_FINAL_CONSTRUCT

İç toplanmış nesne başvuru sayısını artırırsa (FinalConstruct sırasında) nesnenizin silinmesini engeller ve ardından sayıyı 0'a atar.

DECLARE_PROTECT_FINAL_CONSTRUCT()

DECLARE_VIEW_STATUS

Kapsayıcıya VIEWSTATUS bayraklarını belirtmek için bu makroyu ATL ActiveX denetiminin denetim sınıfına yerleştirin.

DECLARE_VIEW_STATUS( statusFlags )

Parametreler

statusFlags
[in] VIEWSTATUS bayrakları. Bayrak listesi için bkz . VIEWSTATUS .

Örnek

DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)

Ayrıca bkz.

Makrolar