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] , GetLicenseKey
ve IsLicenseValid
uygulayan VerifyLicenseKey
bir 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 CComClassFactory2
iç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
, GetLicenseKey
ve IsLicenseValid
statik işlevlerini VerifyLicenseKey
uygulaması 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; }
};
CComClassFactory2
hem 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
CComClassFactoryAutoThread
CComClassFactory'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 CComClassFactoryAutoThread
iç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.
CComClassFactorySingleton
CComClassFactory'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 CComClassFactorySingleton
iç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 GetControllingUnknown
bildirir.
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
CComObject
modü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)