7.13.3. Lifecycle

Sprava pameti je podobna jako v CORBE, tedy reference counting na objektech, in parametry musi alokovat a uvolnovat volajici, out parametry alokuje volany, inout parametry alokuje volajici a realokuje volany. Pamet musi byt alokovana pomoci COM alokatoru, pristupneho skrze interface IMalloc s metodami void *Alloc (ULONG), void *Realloc (void *, ULONG), void Free (void *), ULONG GetSize (void *), int DidAlloc (void *), void HeapMinimize (void).

Reference counting se lisi v local a remote pripadech. Protoze prenaseni kazdeho AddRef a Release na server by bylo pomale, zpristupni se k objektu jeste IRemUnknown s metodami RemAddRef a RemRelease. Klient pak vicenasobna volani na svem IUnknown prevadi na mene volani na IRemUnknown. Aby se resily situace, kdy klienti neudelaji RemRelease, je povinnosti kazdeho klienta jednou za cas pingnout server. Server pak uvolnuje objekty, na ktere nechodi pingy. Momentalne se pinga jednou za 2 minuty a uvolnuje po 3 chybejicich pingach, k dispozici je take architektura sdruzujici pingy pro objekty se stejnym OXID kvuli network loadu.

Objekty bezi bud v in process nebo v out of process serverech. Misto object adapteru ma COM apartments, rozdelene na single a multi threaded. In process servery registruji svuj threading model v registry pod svym class ID, out of process servery volaji CoInitializeEx a jako parametr uvedou ve flazich threading model. I v jednom procesu se pro komunikaci mezi apartments pouziva marshalling, kazdy apartment ma svou vlastni message loop.

Reference na objekty se ziskavaji opet podobne jako v CORBE, tedy bud volanim class factory s prislusnym class ID, nebo volanim jine metody, ktera vrati referenci. Class factory vyzaduje, aby server implementoval rozhrani IClassFactory s metodou HRESULT CreateInstance (iUnknown *pUnkOuter, REFIID iid, void **ppvObject), server poskytujici tuto factory se pak registruje v registry tak, aby ho Windows umely spustit z CoCreateInstance a pri vytvoreni factory zavola CoRegisterClassObject. Factory muze bezet i na vzdalenem stroji, to se bud zada v registry jako soucast registrace tridy, nebo uvede jako parametr CoCreateInstanceEx.

Obdobou klasickych externalized object references jsou monikers. Moniker ma interface IMoniker s dulezitou metodou BindToObject na ziskani pointeru na referovany objekt. Monikeru je vice druhu (File Moniker na referovani objektu, ktere jsou ulozene v souboru, Pointer Moniker na referovani objektu, ktere jsou pouze v pameti, URL Moniker na referovani objektu dostupnych pres URL, atd.). Vytvorene objekty se registruji v running object table pomoci volani Register rozhrani IRunningObjectTable, aby je moniker nevytvarel pri opakovanem volani BindToObject vicekrat.

Monikery je mozne take externalizovat do human readable form a zase prevest zpatky. Pouziti je celkem zrejme, vysledek vypada jako URL.

Pri marshalling a unmarshalling se object reference prenaseji jako ctverice IID (interface ID), OXID (object exporter ID), OID (object identifier ID) a IPID (interface pointer ID). Z IID se pozna, jakou proxy vytvorit, OXID identifikuje server, OID a IPID nevim (nejspis konkretni instanci a konkretni interface).