Pravidla referenční inventury

Překlady článku Překlady článku
ID článku: 104138 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

V objektovém modelu součást je řízena doba života rozhraní počítání odkaz. Počet odkazů rozhraní manipulovat prostřednictvím AddRef() a Release() funkce členů, zděděné z IUnknown. Člen AddRef() zvýší počet odkazů rozhraní a metody sníží Release() jej. Jakmile počet odkazů rozhraní přejde na nulu, jsou již všechny platné ukazatele na rozhraní. Pokud počet odkazů na všechna rozhraní objektu je nula, pak objekt může být uvolněno protože již nejsou žádné ukazatele na objekt.

Další informace

Pravidla referenční inventury

Následující seznam je kopie počítání pravidla (převzata ze stránky 83 a 84 specifikaci OLE 2.0) musí být zadán odkaz. Ukázky kódu malé byly přidány v tomto článku pomoci objasnit pravidla.

  1. Každé nové kopie ukazatele rozhraní musí být AddRef 'd () a každé zničení ukazatele rozhraní musí být Release kromě () kde následných pravidla explicitně povolit jinak.

    1. Parametry - out funkcí: the volající musí AddRef() skutečné parametr, protože budou verze () d podle volaný při out-value je uložen v horní části jej.
            LPOLEOBJECT lpObject;
               .
               .  // Get pointer to IOleObject.
               .
            LPVIEWOBJECT lpView = lpObject;
      
            lpObject->AddRef()
      
            // GetViewObject is a theoretical function that takes a
            // pointer to anything derived from IUnknown, and then
            // returns a pointer to IViewObject in the same variable
            // passed as the parameter. The AddRef() above is needed so
            // that the original pointer to IOleObject is not freed.
      
            GetViewObject(lpView);
      								
    2. Načítání globální proměnnou: místní kopii ukazatele rozhraní získána z existující kopie ukazatele v globální proměnné musí být nezávisle počítáno protože volána funkce odkaz může zničit kopie v globální, zatímco místní kopie je stále aktivní.
            void function()
            {
            // Get a pointer to IOleObject from a global variable.
            LPOLEOBJECT lpOleObject = glpObject;
      
            // This AddRef() is needed so that the interface
            // pointed to by the global variable, glpObject,
            // does not get released by a different part of
            // the applications code.
      
            lpOleObject->AddRef();
               .
               . // use lpOleObject;
               .
            lpOleObject->Release();
            }
      								
    3. Nové ukazatele mimo "tenký Letecky" synthesized: funkce, které synthesizes ukazatele rozhraní pomocí speciální znalosti interní, nikoli získání z některé zdroje musí provést počáteční AddRef() na nově n?kterého ukazatel. Důležité příklady takových rutiny patří instance vytváření rutiny implementacích IUnknown::QueryInterface a tak dále.
            STDMETHDOIMP IUnknown::QueryInteface( REFIID iidInterface,
                                               LPVOID FAR *ppvObj)
            {
            *ppvObj = NULL;
            SCODE sc = E_NOINTERFACE;
      
            if (iidInterface == IUnknown)
                {
                *ppvObj = this;
      
                // This AddRef() is needed because a new pointer
                // was just created.
      
                AddRef();
               sc = S_OK;
                }
      
            return ResultFromScode(sc);
            }
      								
    4. Vrácení kopie interně uložená ukazatele: Po vrátil ukazatel má volaný žádné nápad, jak své životnosti se vztahuje k, interně uložené kopii ukazatel. Volaný tedy musí před návratem do ní zkopírujte ukazatel AddRef().
            // m_lpOleObject is a private member variable of a C++ class.
            // GetOleObject is a member function to return access to this
            // pointer.
      
            void GetOleObject (LPVOID FAR *ppObject)
            {
                *ppObject = m_lpOleObject;
      
                // This AddRef() is needed due to this rule.
      
                m_lpOleObject->AddRef();
             }
      								
  2. Speciální znalosti na částečný o část kódu o vztahy beginnings a koncovky životnost dvou nebo více kopií ukazatele rozhraní můžete umožnit AddRef()/Release() dvojice být vynechán.

    1. V parametry funkcí: kopie ukazatel rozhraní, který je jako skutečný parametr předaný funkci má životnost vnořeny v, které slouží k inicializaci hodnota ukazatele. Proto skutečné parametr nemusí být samostatně počítáno odkaz.
            void function (LPOLEOBJECT lpOleObject)
            {
      
            // Can use lpOleObject in this function
            // without doing AddRef() and Release().
      
            }
      								
    2. Parametry out z funkcí, včetně vrácené hodnoty: nastavení parametr out funkce samotný podle pravidlo 1 musí mít kopii stabilní ukazatele rozhraní. Při ukončení odpovědnosti pro uvolnění ukazatele přenesena z volaný volajícímu. Tedy parametr out potřebují být neodkazuje počítáno.
            LPVIEWOBJECT lpView;
      
            HERROR hErr = lpOleObject->QueryInterface(IID_IViewObject,
                                                      (LPVOID FAR *)lpView);
      
            if (hErr = NOERROR)
                {
                // The QueryInterface succeeded. lpView does not have
                // to be AddRef()'d because it has already been done
                // by the QueryInterface method.
                }
      								
    3. Místní proměnné: implementace funkce jasně má omniscient znalostní životnost každé proměnné ukazatel myši na rámeček zásobníku přiděleno. Proto může použít tyto znalosti Pokud chcete vynechat nadbytečné dvojice AddRef()/Release().
            void function()
            {
            LPOLEOBJECT lpTempObject;
               .
               .
               .
            lpTempObject = lpObject;
               .
               .  // lpTempObject can be used
               .  // without reference counting as long as
               .  // it is known that the lifetime of lpObject
               .  // outside of this function call.
               .
            }
      								
    4. Backpointers: jsou některé datové struktury charakteru obsahující součásti A a B, každou s ukazatel na druhý. Pokud doba života jedné součásti (A) je známo, obsahovat životnosti jiné (B), pak ukazatel z druhé součásti zpět na první (z B do A) je třeba být odkaz nepočítají. Předcházení cyklu, který by jinak vytvořen je často důležité zachování uvolňování příslušné chování.

Vlastnosti

ID článku: 104138 - Poslední aktualizace: 3. prosince 2003 - Revize: 3.1
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft OLE 2.0
  • Microsoft OLE 4.0 na těchto platformách
    • Microsoft Windows NT 4.0
    • Microsoft Windows NT 3.51 Service Pack 5
    • Microsoft Windows NT 4.0
    • Microsoft Windows 95
    • the operating system: Microsoft Windows 2000
Klíčová slova: 
kbmt kbprogramming KB104138 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:104138

Dejte nám zpětnou vazbu

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com