Aracılığıyla paylaş


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 Releasebaş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 CComObjectRootExdevralması 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 CComObjectmodül boyutu biraz daha büyük olabilir.

Nesneniz toplanmışsa, IUnknown veya CComPolyObjecttarafından CComAggObject uygulanır. Bu sınıflar, dış AddRefRelease bilinmeyene iletmek için CComObjectRootEx, ve çağrılarını ' s OuterQueryInterface, OuterAddRefve OuterRelease ' ye temsilci QueryInterfaceolarak 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 CComPolyObjecttarafından CComObject uygulanır. Bu durumda, QueryInterface, çağrısı AddRefyapar ve Release gerçek işlemleri gerçekleştirmek için CComObjectRootEx's , InternalAddRefve's InternalQueryInterfaceInternalRelease 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 FinalConstructHRESULT 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 QueryInterfaceyö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_dwRefdepolanı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_pOuterUnknowndepolanı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ı Lockyapması 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ış