Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Megjegyzés:
Az aktív sablontár (ATL) továbbra is támogatott. A továbbiakban azonban nem adunk hozzá funkciókat, és nem frissítjük a dokumentációt.
Ez az osztály metódusokat biztosít a nem összesített és összesített objektumok objektumhivatkozás-számának kezelésére.
Szemantika
template<class ThreadModel>
class CComObjectRootEx : public CComObjectRootBase
Paraméterek
ThreadModel
Az osztály, amelynek metódusai implementálják a kívánt szálmodellt. A szálmodellt explicit módon úgy választhatja ki, hogy a ThreadModeltCComSingleThreadModel, CComMultiThreadModel vagy CComMultiThreadModelNoCS értékre állítja. A kiszolgáló alapértelmezett szálmodelljét a ThreadModelCComObjectThreadModel vagy CComGlobalsThreadModel értékre állításával fogadhatja el.
Tagok
Metódusok
| Funkció | Description |
|---|---|
| CComObjectRootEx | Konstruktor. |
| InternalAddRef | Növeli a nem összesített objektumok hivatkozásainak számát. |
| InternalRelease | A nem összesített objektumok hivatkozásainak száma csökken. |
| Zár | Ha a szálmodell többszálas, szerezze be egy kritikus szakaszobjektum tulajdonjogát. |
| Kinyit | Ha a szálmodell többszálas, kiadja egy kritikus szakaszobjektum tulajdonjogát. |
CComObjectRootBase metódusok
| Funkció | Description |
|---|---|
| FinalConstruct | Felülbírálás az osztályban az objektum által igényelt inicializálás végrehajtásához. |
| FinalRelease | Felülbírálás az osztályban az objektum által igényelt törlés végrehajtásához. |
| OuterAddRef | Növeli az összesített objektumok referenciaszámát. |
| OuterQueryInterface | Delegáltak egy összesített objektum külső IUnknown részére. |
| OuterRelease | Egy összesített objektum hivatkozásainak száma csökken. |
Statikus függvények
| Funkció | Description |
|---|---|
| InternalQueryInterface | Delegáltak IUnknown egy nem összesített objektumhoz. |
| ObjectMain | Az objektumtérképen felsorolt származtatott osztályok modul inicializálása és leállítása során hívható meg. |
Adattagok
| Adattag | Description |
|---|---|
| m_dwRef | Egy m_pOuterUnknownszakszervezettel. Akkor használatos, ha az objektum nincs összesítve az és Releasea hivatkozási szám AddRef tárolására. |
| m_pOuterUnknown | Egy m_dwRefszakszervezettel. Az objektum összesítésekor a külső ismeretlenre mutató mutató tárolására szolgál. |
Megjegyzések
CComObjectRootEx kezeli a nem összesített és összesített objektumok objektumhivatkozásainak számát. Megtartja az objektumhivatkozások számát, ha az objektum nincs összesítve, és az objektum összesítésekor a külső ismeretlenre mutató mutatót tartja. Az összesített objektumok esetében metódusok CComObjectRootEx használhatók a belső objektum szerkezethibájának kezelésére, valamint a külső objektum törlésének védelmére a belső felületek felszabadításakor vagy a belső objektum törlésekor.
A COM-kiszolgálót megvalósító osztálynak a CComObjectRoottól vagy a CComObjectRoottólCComObjectRootEx kell örökölnie.
Ha az osztálydefiníció megadja a DECLARE_POLY_AGGREGATABLE makrót, az ATL létrehoz egy példányt CComPolyObject<CYourClass> , amelynek IClassFactory::CreateInstance a neve meghívva van. A létrehozás során a rendszer ellenőrzi a külső ismeretlen értékét. Ha null értékű, IUnknown akkor egy nem összesített objektumhoz van implementálva. Ha a külső ismeretlen nem NULL értékű, IUnknown akkor egy összesített objektumhoz lesz implementálva.
Ha az osztály nem adja meg a DECLARE_POLY_AGGREGATABLE makrót, az ATL létrehoz egy példányt CAggComObject<CYourClass> az összesített objektumokhoz vagy a nem összesített objektumok példányához CComObject<CYourClass> .
A használat CComPolyObject előnye, hogy elkerülheti, hogy mind a modulban, mind CComAggObjectCComObject a modulban kezelje az összesített és a nem összesített eseteket. Egyetlen CComPolyObject objektum mindkét esetet kezeli. Ezért a modulban csak a virtuális tábla egy példánya és a függvények egy példánya létezik. Ha a virtuális tábla nagy, ez jelentősen csökkentheti a modul méretét. Ha azonban a virtuális tábla kicsi, a használat CComPolyObject valamivel nagyobb modulméretet eredményezhet, mivel nem összesített vagy nem összesített objektumhoz van optimalizálva, ahogyan az is és CComAggObjectCComObject.
Ha az objektum összesítve van, az IUnknown implementálása CComAggObject vagy CComPolyObjecta . Ezek az osztályok delegálnak QueryInterface, AddRefés Release meghívják őketCComObjectRootExOuterQueryInterface, OuterAddRefés OuterRelease továbbítják a külső ismeretlennek. Az osztályban általában felülbírálhatja CComObjectRootEx::FinalConstruct az összes összesített objektum létrehozását, és felülbírálhatja CComObjectRootEx::FinalRelease az összes összesített objektum felszabadításához.
Ha az objektum nincs összesítve, IUnknown akkor azt a program implementálja vagy CComPolyObjectvégrehajtjaCComObject. Ebben az esetben a rendszer meghívja QueryInterfaceReleaseAddRefés delegálja az CComObjectRootEx"sInternalQueryInterface" parancsot, InternalAddRefés InternalRelease végrehajtja a tényleges műveleteket.
Requirements
Fejléc: atlcom.h
CComObjectRootEx::CComObjectRootEx
A konstruktor 0-ra inicializálja a referenciaszámot.
CComObjectRootEx();
CComObjectRootEx::FinalConstruct
Ezt a metódust felülbírálhatja a származtatott osztályban az objektumhoz szükséges inicializálás végrehajtásához.
HRESULT FinalConstruct();
Visszaadott érték
A sikeres S_OK vagy a HRESULT standard hibaértékek egyikét adja vissza.
Megjegyzések
Alapértelmezés szerint CComObjectRootEx::FinalConstruct egyszerűen S_OK ad vissza.
Az inicializálás FinalConstruct az osztály konstruktorának helyett a következő előnyökkel jár:
Konstruktorból nem tud állapotkódot visszaadni, de a HRESULT értékét a visszatérési
FinalConstructérték alapján is visszaadhatja. Ha az osztály objektumai az ATL által biztosított standard osztály-előállítóval jönnek létre, a rendszer ezt a visszatérési értéket a COM-ügyfélre propagálja, így részletes hibainformációkat adhat meg nekik.A virtuális függvényeket nem hívhatja meg a virtuális függvény mechanizmusán keresztül egy osztály konstruktorától. Ha egy virtuális függvényt egy osztály konstruktorától hív meg, az a függvény statikusan feloldott hívását eredményezi, mivel az az öröklési hierarchia ezen pontján van definiálva. A tiszta virtuális függvényekre irányuló hívások hivatkozási hibákat eredményeznek.
Az osztály nem a leg származtatottabb osztály az öröklési hierarchiában – az ATL által biztosított származtatott osztályra támaszkodik, amely biztosítja bizonyos funkcióit. Jó esély van arra, hogy az inicializálásnak az adott osztály által biztosított funkciókat kell használnia (ez minden bizonnyal igaz, ha az osztály objektumainak más objektumokat kell összesíteniük), de az osztály konstruktorának nincs módja ezeknek a funkcióknak a elérésére. Az osztály építési kódja a legelfejezettebb osztály teljes létrehozása előtt lesz végrehajtva.
A rendszer azonban közvetlenül a levezetett osztály teljes felépítése után hívja meg,
FinalConstructígy virtuális függvényeket hívhat meg, és használhatja az ATL által biztosított hivatkozásszámláló implementációt.
Example
Ezt a metódust általában felülbírálhatja a származtatott osztályban CComObjectRootEx az összes összesített objektum létrehozásához. Például:
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.
Ha az építés sikertelen, hibát adhat vissza. A makróval DECLARE_PROTECT_FINAL_CONSTRUCT is megvédheti a külső objektumot a törléstől, ha a belső összesített objektum a létrehozás során növeli a hivatkozás számát, majd 0-ra csökken.
Az aggregátumok létrehozásának tipikus módja az alábbiak:
Adjon hozzá egy mutatót
IUnknownaz osztályobjektumhoz, és inicializálja NULL értékre a konstruktorban.Felülbírálás
FinalConstructaz összesítés létrehozásához.Használja a
IUnknownparaméterként definiált mutatót a COM_INTERFACE_ENTRY_AGGREGATE makróhoz.Felülbírálás
FinalReleasea mutató felengedéséhezIUnknown.
CComObjectRootEx::FinalRelease
Ezt a metódust felülbírálhatja a származtatott osztályban az objektumhoz szükséges összes törlés végrehajtásához.
void FinalRelease();
Megjegyzések
Alapértelmezés szerint CComObjectRootEx::FinalRelease semmit sem tesz.
A törlést FinalRelease célszerűebb kódot hozzáadni az osztály destruktorához, mivel az objektum még mindig teljesen ki van építve a meghívási FinalRelease ponton. Ez lehetővé teszi, hogy biztonságosan hozzáférjen a legelvezetettebb osztály által biztosított módszerekhez. Ez különösen fontos az összesítő objektumok törlés előtti felszabadításához.
CComObjectRootEx::InternalAddRef
Egy nem összesített objektum hivatkozási számát 1-zel növeli.
ULONG InternalAddRef();
Visszaadott érték
A diagnosztikához és teszteléshez hasznos érték.
Megjegyzések
Ha a szálmodell többszálas, akkor a rendszer megakadályozza, InterlockedIncrement hogy egynél több szál egyszerre módosítsa a referenciaszámot.
CComObjectRootEx::InternalQueryInterface
A kért felületre mutató mutatót kér le.
static HRESULT InternalQueryInterface(
void* pThis,
const _ATL_INTMAP_ENTRY* pEntries,
REFIID iid,
void** ppvObject);
Paraméterek
pThis
[in] Mutató arra az objektumra, amely tartalmazza a COM-térképet, amelyen a felületek láthatók QueryInterface.
PEntries
[in] Az elérhető felületek térképéhez hozzáférő struktúra mutatója _ATL_INTMAP_ENTRY .
iid
[in] A kért felület GUID azonosítója.
ppvObject
[kifelé] Az iid-ben megadott illesztőmutatóra mutató mutató, vagy null értékű, ha az illesztő nem található.
Visszaadott érték
Az egyik standard HRESULT érték.
Megjegyzések
InternalQueryInterface csak a COM-térképtáblában lévő felületeket kezeli. Ha az objektum összesítve van, InternalQueryInterface nem delegálható a külső ismeretlenbe. A COM-térképtáblába a makróval COM_INTERFACE_ENTRY vagy annak egyik változatával illesztőket adhat meg.
CComObjectRootEx::InternalRelease
A nem összesített objektumok hivatkozási számát 1-gyel csökkenti.
ULONG InternalRelease();
Visszaadott érték
A nem hibakeresési és hibakeresési buildekben ez a függvény egy olyan értéket ad vissza, amely hasznos lehet a diagnosztika vagy a tesztelés során. A visszaadott pontos érték számos tényezőtől függ, például a használt operációs rendszertől, és lehet, hogy nem a hivatkozási szám.
Megjegyzések
Ha a szálmodell többszálas, akkor a rendszer megakadályozza, InterlockedDecrement hogy egynél több szál egyszerre módosítsa a referenciaszámot.
CComObjectRootEx::Lock
Ha a szálmodell többszálas, ez a metódus meghívja a Win32 API EnterCriticalSection függvényt, amely megvárja, amíg a szál átveszi a privát adattagon keresztül beszerzett kritikus szakaszobjektum tulajdonjogát.
void Lock();
Megjegyzések
Amikor a védett kód befejeződik, a szálnak meg kell hívnia Unlock a kritikus szakasz tulajdonjogának kiadását.
Ha a szálmodell egyszálas, ez a metódus nem tesz semmit.
CComObjectRootEx::m_dwRef
Egy egyesítés része, amely négy bájtnyi memóriát ér el.
long m_dwRef;
Megjegyzések
A m_pOuterUnknownegyesítés részeként:
union {
long m_dwRef;
IUnknown* m_pOuterUnknown;
};
Ha az objektum nincs összesítve, a hivatkozási számot a rendszer a AddRefRelease következő helyen m_dwReftárolja: . Ha az objektum összesítve van, a külső ismeretlenre mutató mutatót a rendszer m_pOuterUnknown tárolja.
CComObjectRootEx::m_pOuterUnknown
Egy egyesítés része, amely négy bájtnyi memóriát ér el.
IUnknown*
m_pOuterUnknown;
Megjegyzések
A m_dwRefegyesítés részeként:
union {
long m_dwRef;
IUnknown* m_pOuterUnknown;
};
Ha az objektum összesítve van, a külső ismeretlenre mutató mutatót a rendszer a következő helyen m_pOuterUnknowntárolja: . Ha az objektum nincs összesítve, a hivatkozási számot a rendszer m_dwRefAddRefRelease tárolja.
CComObjectRootEx::ObjectMain
Az objektumtérképen felsorolt összes osztály esetében ezt a függvényt a rendszer egyszer hívja meg a modul inicializálásakor, majd a modul leállásakor.
static void WINAPI ObjectMain(bool bStarting);
Paraméterek
bStarting
[kifelé] Az érték IGAZ, ha az osztály inicializálva van; egyéb esetben HAMIS.
Megjegyzések
A bStarting paraméter értéke azt jelzi, hogy a modul inicializálása vagy leállása folyamatban van-e. Az alapértelmezett implementáció ObjectMain nem tesz semmit, de felülbírálhatja ezt a függvényt az osztályban az osztályhoz lefoglalni kívánt erőforrások inicializálásához vagy törléséhez. Vegye figyelembe, hogy ObjectMain az osztály bármely példányának kérése előtt van meghívva.
ObjectMain meghívása a DLL belépési pontjáról történik, így a belépési pont függvény által végrehajtható művelet típusa korlátozott. Ezekről a korlátozásokról további információt a DLL-ek és a Visual C++ futásidejű kódtár viselkedése és a DllMain című témakörben talál.
Example
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
Növeli az összesítés külső ismeretlen részének hivatkozási számát.
ULONG OuterAddRef();
Visszaadott érték
A diagnosztikához és teszteléshez hasznos érték.
CComObjectRootEx::OuterQueryInterface
Indirekt mutatót kér le a kért felületre.
HRESULT OuterQueryInterface(REFIID iid, void** ppvObject);
Paraméterek
iid
[in] A kért felület GUID azonosítója.
ppvObject
[kifelé] Ha az összesítés nem támogatja a felületet, az iid-ben megadott illesztőmutatóra mutató mutató vagy NULL.
Visszaadott érték
Az egyik standard HRESULT érték.
CComObjectRootEx::OuterRelease
Az összesítés külső ismeretlen részének hivatkozási számát mérsékeli.
ULONG OuterRelease();
Visszaadott érték
A nem hibakeresési buildekben mindig 0 értéket ad vissza. A hibakeresési buildekben olyan értéket ad vissza, amely hasznos lehet a diagnosztika vagy a tesztelés során.
CComObjectRootEx::Unlock
Ha a szálmodell többszálas, ez a metódus meghívja a Win32 API-függvényt, a LeaveCriticalSection függvényt, amely felszabadítja a privát adattagon keresztül beszerzett kritikus szakaszobjektum tulajdonjogát.
void Unlock();
Megjegyzések
A tulajdonjog megszerzéséhez a szálnak meg kell hívnia Lock. Minden híváshoz Lock szükség van egy megfelelő hívásra a Unlock kritikus szakasz tulajdonjogának felszabadításához.
Ha a szálmodell egyszálas, ez a metódus nem tesz semmit.
Lásd még
CComAggObject osztály
CComObject osztály
CComPolyObject osztály
osztály áttekintése