CComObjectRootEx Sınıfı
Bu sınıf, hem toplanmamış hem de toplanmış nesneler için nesne başvuru sayısı yönetimini işlemek için yöntemler sağlar.
Sözdizimi
template<class ThreadModel>
class CComObjectRootEx : public CComObjectRootBase
Parametreler
ThreadModel
Yöntemleri istenen iş parçacığı modelini uygulayan sınıf. ThreadModel'i CComSingleThreadModel, CComMultiThreadModel veya CComMultiThreadModelNoCS olarak ayarlayarak iş parçacığı modelini açıkça seçebilirsiniz. ThreadModel değerini CComObjectThreadModel veya CComGlobalsThreadModel olarak ayarlayarak sunucunun varsayılan iş parçacığı modelini kabul edebilirsiniz.
Üyeler
Yöntemler
İşlev | Açıklama |
---|---|
CComObjectRootEx | Oluşturucu. |
InternalAddRef | Toplanmamış bir nesne için başvuru sayısını artırır. |
InternalRelease | Toplanmamış bir nesne için başvuru sayısını azaltma. |
Kilitle | İş parçacığı modeli çok iş parçacıklıysa, kritik bir bölüm nesnesinin sahipliğini alır. |
Kilidi açmak | İş parçacığı modeli çok iş parçacıklıysa, kritik bir bölüm nesnesinin sahipliğini serbest bırakır. |
CComObjectRootBase Yöntemleri
İşlev | Açıklama |
---|---|
FinalConstruct | Nesneniz için gerekli başlatmaları gerçekleştirmek için sınıfınızda geçersiz kılın. |
FinalRelease | Nesnenizin gerektirdiği temizleme işlemlerini gerçekleştirmek için sınıfınızda geçersiz kılın. |
OuterAddRef | Toplanan nesne için başvuru sayısını artırır. |
OuterQueryInterface | Toplanan nesnenin dış IUnknown temsilcilerini verir. |
OuterRelease | Toplanan nesnenin başvuru sayısını azaltma. |
Statik işlevler
İşlev | Açıklama |
---|---|
InternalQueryInterface | IUnknown Toplanmamış bir nesnenin temsilcisi. |
ObjectMain | Nesne eşlemesinde listelenen türetilmiş sınıflar için modül başlatma ve sonlandırma sırasında çağrılır. |
Veri Üyeleri
Veri üyesi | Açıklama |
---|---|
m_dwRef | ile m_pOuterUnknown , bir birleşimin parçası. nesnesi ve Release başvuru sayısını AddRef tutmak için toplanmadığında kullanılır. |
m_pOuterUnknown | ile m_dwRef , bir birleşimin parçası. Nesne dış bilinmeyene bir işaretçi tutmak için toplandığında kullanılır. |
Açıklamalar
CComObjectRootEx
hem toplanmış hem de toplanmış nesneler için nesne başvuru sayısı yönetimini işler. Nesneniz toplanmadıysa nesne başvuru sayısını tutar ve nesneniz toplanıyorsa işaretçiyi dış bilinmeyene tutar. Toplanan nesneler için, CComObjectRootEx
iç nesnenin oluşturulamamasıyla başa çıkabilmek ve iç arabirimler serbest bırakıldığında veya iç nesne silindiğinde dış nesneyi silinmeye karşı korumak için yöntemler kullanılabilir.
COM sunucusu uygulayan bir sınıfın veya CComObjectRoot'tan CComObjectRootEx
devralması gerekir.
Sınıf tanımınız DECLARE_POLY_AGGREGATABLE makroyu belirtiyorsa, ATL çağrıldığında IClassFactory::CreateInstance
örneğini CComPolyObject<CYourClass>
oluşturur. 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.
Sınıfınız DECLARE_POLY_AGGREGATABLE makroyu belirtmezse, ATL toplanan nesneler için bir örneğini CAggComObject<CYourClass>
veya toplanmamış nesneler için örneğini CComObject<CYourClass>
oluşturur.
Kullanmanın CComPolyObject
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 nedenle, modülünüzde vtable'ın yalnızca bir kopyası ve işlevlerin bir kopyası bulunur. 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.
Nesneniz toplanmışsa, IUnknown veya CComPolyObject
tarafından CComAggObject
uygulanır. Bu sınıflar, dış AddRef
Release
bilinmeyene iletmek için CComObjectRootEx
, ve çağrılarını ' s OuterQueryInterface
, OuterAddRef
ve OuterRelease
' ye temsilci QueryInterface
olarak verir. Genellikle, sınıfınızda herhangi CComObjectRootEx::FinalConstruct
bir toplanmış nesne oluşturmak için geçersiz kılarsınız ve toplanmış nesneleri serbest bırakabilmek için geçersiz kılarsınız CComObjectRootEx::FinalRelease
.
Nesneniz toplanmamışsa veya IUnknown
CComPolyObject
tarafından CComObject
uygulanır. Bu durumda, QueryInterface
, çağrısı AddRef
yapar ve Release
gerçek işlemleri gerçekleştirmek için CComObjectRootEx
's , InternalAddRef
ve's InternalQueryInterface
InternalRelease
için temsilci olarak kullanılır.
Gereksinimler
Üst bilgi: atlcom.h
CComObjectRootEx::CComObjectRootEx
Oluşturucu, başvuru sayısını 0 olarak başlatır.
CComObjectRootEx();
CComObjectRootEx::FinalConstruct
Türetilmiş sınıfınızda bu yöntemi geçersiz kılarak nesneniz için gerekli başlatma işlemlerini gerçekleştirebilirsiniz.
HRESULT FinalConstruct();
Dönüş Değeri
Başarı S_OK veya standart hata HRESULT değerlerinden birini döndürür.
Açıklamalar
Varsayılan olarak, CComObjectRootEx::FinalConstruct
yalnızca S_OK döndürür.
sınıfınızın oluşturucusunun yerine içinde FinalConstruct
başlatma gerçekleştirmenin avantajları vardır:
Bir oluşturucudan durum kodu döndüremezsiniz, ancak 'nin dönüş değeriyle
FinalConstruct
HRESULT döndürebilirsiniz. Sınıfınızın nesneleri ATL tarafından sağlanan standart sınıf fabrikası kullanılarak oluşturulduğunda, bu dönüş değeri COM istemcisine geri yayılır ve onlara ayrıntılı hata bilgileri sağlamanıza olanak sağlar.Bir sınıfın oluşturucusundan sanal işlev mekanizması aracılığıyla sanal işlevleri çağıramazsınız. Bir sınıfın oluşturucusundan bir sanal işlevi çağırmak, devralma hiyerarşisinde o noktada tanımlandığı için işleve statik olarak çözümlenmiş bir çağrıyla sonuçlanır. Saf sanal işlevlere yapılan çağrılar bağlayıcı hatalarıyla sonuçlanır.
Sınıfınız devralma hiyerarşisindeki en türetilmiş sınıf değildir; işlevselliğinin bir kısmını sağlamak için ATL tarafından sağlanan türetilmiş bir sınıfa dayanır. Başlatmanızın bu sınıf tarafından sağlanan özellikleri kullanması gerekmesi olasılığı yüksektir (sınıfınızdaki nesnelerin diğer nesneleri toplaması gerektiğinde bu kesinlikle doğrudur), ancak sınıfınızdaki oluşturucunun bu özelliklere erişmesinin hiçbir yolu yoktur. Sınıfınızın yapı kodu, en türetilmiş sınıf tam olarak oluşturmadan önce yürütülür.
Ancak,
FinalConstruct
sanal işlevleri çağırmanıza ve ATL tarafından sağlanan başvuru sayma uygulamasını kullanmanıza olanak sağlayan, en türetilmiş sınıf tam olarak oluşturulduğunda hemen çağrılır.
Örnek
Genellikle, toplu nesneleri oluşturmak için öğesinden CComObjectRootEx
türetilen sınıfta bu yöntemi geçersiz kılın. Örneğin:
class ATL_NO_VTABLE CMyAggObject :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMyAggObject, &CLSID_MyAggObject>,
public IDispatchImpl<IMyAggObject, &IID_IMyAggObject, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
DECLARE_GET_CONTROLLING_UNKNOWN()
HRESULT FinalConstruct()
{
return CoCreateInstance(CLSID_MyCustomClass, GetControllingUnknown(),
CLSCTX_ALL, IID_IUnknown, (void**)&m_pMyCustomClass);
}
IMyCustomClass* m_pMyCustomClass;
// Remainder of class declaration omitted.
Yapı başarısız olursa bir hata döndürebilirsiniz. Makro DECLARE_PROTECT_FINAL_CONSTRUCT kullanarak, oluşturma sırasında iç toplanmış nesne başvuru sayısını artırır ve ardından sayıyı 0'a gerilerse dış nesnenizin silinmesini önleyebilirsiniz.
Toplama oluşturmanın tipik bir yolu aşağıda verilmiştir:
Sınıf nesnenize bir
IUnknown
işaretçi ekleyin ve oluşturucuda NULL olarak başlatın.Toplamayı oluşturmak için geçersiz kılın
FinalConstruct
.IUnknown
COM_INTERFACE_ENTRY_AGGREGATE makrosunun parametresi olarak tanımladığınız işaretçiyi kullanın.İşaretçiyi
IUnknown
serbest bırakmak için geçersiz kılınFinalRelease
.
CComObjectRootEx::FinalRelease
Bu yöntemi türetilmiş sınıfınızda geçersiz kılarak nesneniz için gereken temizleme işlemlerini gerçekleştirebilirsiniz.
void FinalRelease();
Açıklamalar
Varsayılan olarak hiçbir CComObjectRootEx::FinalRelease
şey yapmaz.
içinde temizleme FinalRelease
gerçekleştirmek, sınıfınızın yıkıcısına kod eklemek için tercih edilir çünkü nesne hala çağrılan FinalRelease
noktada tam olarak oluşturulur. Bu, en çok türetilen sınıf tarafından sağlanan yöntemlere güvenli bir şekilde erişmenizi sağlar. Bu, silinmeden önce toplanan nesneleri boşaltmak için özellikle önemlidir.
CComObjectRootEx::InternalAddRef
Toplanmamış bir nesnenin başvuru sayısını 1 artırır.
ULONG InternalAddRef();
Dönüş Değeri
Tanılama ve test için yararlı olabilecek bir değer.
Açıklamalar
İş parçacığı modeli çok iş parçacıklıysa, InterlockedIncrement
birden fazla iş parçacığının başvuru sayısını aynı anda değiştirmesini önlemek için kullanılır.
CComObjectRootEx::InternalQueryInterface
İstenen arabirim için bir işaretçi alır.
static HRESULT InternalQueryInterface(
void* pThis,
const _ATL_INTMAP_ENTRY* pEntries,
REFIID iid,
void** ppvObject);
Parametreler
pThis
[in] öğesine sunulan arabirimlerin COM eşlemesini içeren nesneye QueryInterface
yönelik bir işaretçi.
pEntries
[in] Kullanılabilir arabirimlerin _ATL_INTMAP_ENTRY
haritasına erişen yapıya yönelik bir işaretçi.
iid
[in] İstenen arabirimin GUID'i.
ppvObject
[out] iid içinde belirtilen arabirim işaretçisi işaretçisi veya arabirim bulunamazsa NULL.
Dönüş Değeri
Standart HRESULT değerlerinden biri.
Açıklamalar
InternalQueryInterface
yalnızca COM eşleme tablosundaki arabirimleri işler. Nesneniz toplanmışsa, InternalQueryInterface
dış bilinmeyene temsilci seçmez. COM eşleme tablosuna makro COM_INTERFACE_ENTRY veya değişkenlerinden biriyle arabirimler girebilirsiniz.
CComObjectRootEx::InternalRelease
Toplanmamış bir nesnenin başvuru sayısını 1'e kadar azaltma.
ULONG InternalRelease();
Dönüş Değeri
Hem hata ayıklama olmayan hem de hata ayıklama derlemelerinde, bu işlev tanılama veya test için yararlı olabilecek bir değer döndürür. Döndürülen tam değer, kullanılan işletim sistemi gibi birçok faktöre bağlıdır ve başvuru sayısı olabilir veya olmayabilir.
Açıklamalar
İş parçacığı modeli çok iş parçacıklıysa, InterlockedDecrement
birden fazla iş parçacığının başvuru sayısını aynı anda değiştirmesini önlemek için kullanılır.
CComObjectRootEx::Lock
İş parçacığı modeli çok iş parçacıklıysa, bu yöntem Win32 API işlevi EnterCriticalSection'ı çağırır ve iş parçacığının özel veri üyesi aracılığıyla alınan kritik bölüm nesnesinin sahipliğini almasını bekler.
void Lock();
Açıklamalar
Korumalı kodun yürütülmesi tamamlandığında iş parçacığının kritik bölümün yayın sahipliğini çağırması gerekir Unlock
.
İş parçacığı modeli tek iş parçacıklıysa, bu yöntem hiçbir şey yapmaz.
CComObjectRootEx::m_dwRef
Dört bayt belleğe erişen bir birleşimin parçası.
long m_dwRef;
Açıklamalar
ile m_pOuterUnknown
, bir birleşimin parçası:
union {
long m_dwRef;
IUnknown* m_pOuterUnknown;
};
Nesne toplanmamışsa ve tarafından AddRef
Release
erişilen başvuru sayısı içinde m_dwRef
depolanır. Nesne toplanırsa, dıştaki bilinmeyen işaretçi m_pOuterUnknown depolanır.
CComObjectRootEx::m_pOuterUnknown
Dört bayt belleğe erişen bir birleşimin parçası.
IUnknown*
m_pOuterUnknown;
Açıklamalar
ile m_dwRef
, bir birleşimin parçası:
union {
long m_dwRef;
IUnknown* m_pOuterUnknown;
};
Nesne toplanırsa, dış bilinmeyenin işaretçisi içinde m_pOuterUnknown
depolanır. Nesne toplanmazsa ve tarafından AddRef
Release
erişilen başvuru sayısı m_dwRef depolanır.
CComObjectRootEx::ObjectMain
Nesne eşlemesinde listelenen her sınıf için bu işlev, modül başlatıldığında bir kez ve sonlandırıldığında yeniden çağrılır.
static void WINAPI ObjectMain(bool bStarting);
Parametreler
bBaşlam
[out] Sınıf başlatılıyorsa değer TRUE olur; aksi takdirde YANLIŞ.
Açıklamalar
bStarting parametresinin değeri modülün başlatıldığını veya sonlandırıldığını gösterir. varsayılan uygulaması ObjectMain
hiçbir şey yapmaz, ancak sınıfınız için ayırmak istediğiniz kaynakları başlatmak veya temizlemek için sınıfınızda bu işlevi geçersiz kılabilirsiniz. Sınıfın ObjectMain
herhangi bir örneği istenmeden önce çağrıldığını unutmayın.
ObjectMain
DLL'nin giriş noktasından çağrılır, bu nedenle giriş noktası işlevinin gerçekleştirebileceği işlem türü kısıtlanır. Bu kısıtlamalar hakkında daha fazla bilgi için bkz . DLL'ler ve Visual C++ çalışma zamanı kitaplığı davranışı ve DllMain.
Örnek
class ATL_NO_VTABLE CMyApp :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMyApp, &CLSID_MyApp>,
public IMyApp
{
public:
CMyApp()
{
}
static void WINAPI ObjectMain(bool bStarting)
{
if (bStarting)
;// Perform custom initialization routines
else
;// Perform custom termination routines
}
// Remainder of class declaration omitted.
CComObjectRootEx::OuterAddRef
Toplamanın dış bilinmeyen başvuru sayısını artırır.
ULONG OuterAddRef();
Dönüş Değeri
Tanılama ve test için yararlı olabilecek bir değer.
CComObjectRootEx::OuterQueryInterface
İstenen arabirim için dolaylı bir işaretçi alır.
HRESULT OuterQueryInterface(REFIID iid, void** ppvObject);
Parametreler
iid
[in] İstenen arabirimin GUID'i.
ppvObject
[out] iid içinde belirtilen arabirim işaretçisi işaretçisi veya toplama arabirimi desteklemiyorsa NULL.
Dönüş Değeri
Standart HRESULT değerlerinden biri.
CComObjectRootEx::OuterRelease
Bir toplamanın dış bilinmeyen başvuru sayısını azaltma.
ULONG OuterRelease();
Dönüş Değeri
Hata ayıklama olmayan derlemelerde her zaman 0 döndürür. Hata ayıklama derlemelerinde, tanılama veya test için yararlı olabilecek bir değer döndürür.
CComObjectRootEx::Unlock
İş parçacığı modeli çok iş parçacıklıysa bu yöntem, özel veri üyesi aracılığıyla alınan kritik bölüm nesnesinin sahipliğini serbest bırakan Win32 API işlevini LeaveCriticalSection olarak çağırır.
void Unlock();
Açıklamalar
Sahipliği elde etmek için iş parçacığının çağrısı Lock
yapması gerekir. için yapılan her çağrı Lock
, kritik bölümün sahipliğini serbest bırakmak için Unlock
karşılık gelen bir çağrı gerektirir.
İş parçacığı modeli tek iş parçacıklıysa, bu yöntem hiçbir şey yapmaz.
Ayrıca bkz.
CComAggObject Sınıfı
CComObject Sınıfı
CComPolyObject Sınıfı
Sınıfa Genel Bakış