Structured storage, Monikers, Running Object Table

Podobne dokumenty
Obiekty w plikach wykonywalnych, marshaling

Zdarzenia (events, connection points)

4 bity zarezerwowane dla przyszłych zastosowań 11 bitów określających źródło błędu 16 bitów określających rodzaj błędu.

Technologie COM i ActiveX COM - Component Object Model

Agregacja. Wykorzystanie innego komponentu bez użycia agregacji. Simple calculator. Extended calculator

//////////////////////////////////////////////////////////// // Kalkulator (prosty) - wersja agregowalna import "unknwn.idl";

Zdalne uruchamianie obiektów COM

Henryk Budzisz. materiały przygotowane w ramach projektu ZPORR nr POKL /08-00

Droga do DCOM DCOM (1996) Windows clipboard (1987) OLE 1 DDE (1992) OLE 2 (1993) COM (1995) Distributed computing (1980s)

Zarządzanie pamięcią

OLE: Pojęcia podstawowe

TRX API opis funkcji interfejsu

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

1.1 Szkielet aplikacji

Lab 9 Podstawy Programowania

Projekt Hurtownia, realizacja rejestracji dostaw produktów

Lekcja 10. Uprawnienia. Dołączanie plików przy pomocy funkcji include() Sprawdzanie, czy plik istnieje przy pmocy funkcji file_exists()

Podstawowe kontrolki graficzne. Obsługa plików poprzez kontrolki

Programowanie w językach

Wywoływanie metod zdalnych

Projekt Hurtownia, realizacja rejestracji dostaw produktów

Specyfikacja API Runtime BAS 3.0

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Smarty PHP. Leksykon kieszonkowy

Podstawy Programowania Obiektowego

System plików Linuksa

Tabela wewnętrzna - definicja

akademia androida Składowanie danych część VI

ang. file) Pojęcie pliku (ang( Typy plików Atrybuty pliku Fragmentacja wewnętrzna w systemie plików Struktura pliku

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

4. Pliki Informacje ogólne o dostępie do plików w PHP Sprawdzanie istnienia pliku file_exists()

Dostrzeżenie ograniczeń schowka [koniec lat 80-tych] OLE 1.0 [1991]

16) Wprowadzenie do raportowania Rave

Zasady programowania Dokumentacja

Pliki. Informacje ogólne. Obsługa plików w języku C

Serwery Statefull i Stateless

Microsoft Interface Definition Language

Zadania z podstaw programowania obiektowego

JAVA. Strumienie wejścia i wyjścia. Pliki - zapis i odczyt

Krzysztof Kadowski. PL-E3579, PL-EA0312,

Tablice, funkcje - wprowadzenie

Wykład 8: klasy cz. 4

Metody dostępu do danych

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Wprowadzenie do projektu QualitySpy

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

1. Opis. 2. Wymagania sprzętowe:

Programowanie na poziomie sprzętu. Programowanie w Windows API

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Ćwiczenie: JavaScript Cookies (3x45 minut)

Pliki. Funkcje tworzące pliki i operujące na nich opisane są w części 2 pomocy systemowej. Tworzenie i otwieranie plików:

Na komputerach z systemem Windows XP zdarzenia są rejestrowane w trzech następujących dziennikach: Dziennik aplikacji

MATERIAŁY DO ZAJĘĆ II

Biblioteka standardowa - operacje wejścia/wyjścia

Podstawy programowania. Podstawy C# Tablice

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04

Programowanie obiektowe. Dr hab. Inż. Marta Gładysiewicz-Kudrawiec Pokój 229 A1 Operatory new delete pliki-odczyt

OBIEKTY TECHNICZNE OBIEKTY TECHNICZNE

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 20 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32

Budowa aplikacji z graficznym interfejsem użytkownika - GUI (Graphic User Interface)

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Wywoływanie metod zdalnych

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Dlaczego GML? Gdańsk r. Karol Stachura

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

STRUMIENIE TEKSTOWE WEJŚCIOWE WPROWADZANIE DANYCH STRUMIENIE BAJTOWE, STRUMIENIE TEKSTOWE

Wprowadzenie db4o - podstawy db4o - technikalia Przydatne wiadomości. Wprowadzenie. db4o. Norbert Potocki. 1 czerwca Norbert Potocki db4o

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

Instrukcja laboratoryjna cz.3

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Bezpieczeństwo systemów informatycznych

Podstawy i języki programowania

Języki i techniki programowania Ćwiczenia 2

Argumenty wywołania programu, operacje na plikach

Laboratorium 7 Blog: dodawanie i edycja wpisów

Podstawy obiektowości

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

Przykład. Podaj nazwę domenową hosta a odczytaj jego adres IP, lub odwrotnie:

Dokumentacja do API Javy.

Wersja dokumentacji1.01. TeleToken API

Programowanie w Sieci Internet Blok 2 - PHP. Kraków, 09 listopada 2012 mgr Piotr Rytko Wydział Matematyki i Informatyki

RPC. Zdalne wywoływanie procedur (ang. Remote Procedure Calls )

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Aplikacje RMI Lab4

Rozdział 4 KLASY, OBIEKTY, METODY

Języki programowania imperatywnego

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

RMI-2. Java Remote Method Invocation (RMI) na podstawie m.in. podręcznika firmy Sun Microsystems SYSTEMY ROZPROSZONE

Metody zawarte w klasie File: boolean createnewfile() tworzy nowy, pusty plik, ale tylko jeśli on wcześniej nie istniał. boolean delete() usuwa dany

Podstawy Programowania

NIEZAWODNE ROZWIĄZANIA SYSTEMÓW AUTOMATYKI

Kurs WWW. Paweł Rajba.

Microsoft Visual C++

Transkrypt:

Structured storage, Monikers, Running Object Table

Structured storage Structured storage jest sposobem zorganizowanego zapisywania danych w pliku. Struktura danych ma postać drzewa i obiektów danych podobną do systemu plików i katalogów. Podejście takie pozwala na zapisanie wewnątrz jednego pliku informacji pochodzących od różnych obiektów. Do zapisu i organizacji danych opracowano dwa standardowe interfejsy IStorage i IStream. IStorage jest odpowiednikiem katalogów i pozwala na konstruowanie struktury pliku. IStream pozwala na dostęp do wybranych danych umieszczonych w dowolnym miejscu struktury pliku.

Structured storage IStorage interface IStorage:IUnknown { HRESULT CreateStream([in] OLECHAR *pwcsname, [in] DWORD grfmode, [in] DWORD reserved1, [in] DWORD reserved2, [out] IStream **ppstm); HRESULT OpenStream([in] OLECHAR *pwcsname, [in] void *reserved1, [in] DWORD grfmode, [in] DWORD reserved2, [out] IStream **ppstm); HRESULT CreateStorage([in] OLECHAR *pwcsname, [in] DWORD grfmode, [in] DWORD reserved1, [in] DWORD reserved2, [out] IStorage **ppstg); HRESULT OpenStorage([in] OLECHAR *pwcsname, [in] IStorage *pstgpriority, [in] DWORD grfmode, [in] SNB snbexclude, [in] DWORD reserved, [out] IStorage **ppstg); HRESULT CopyTo([in] DWORD ciidexclude, [in, size_is(ciidexclude)] IID *rgiidexclude, [in] SNB snbexclude, [in] IStorage *pstgdest); HRESULT MoveElementTo([in] OLECHAR * pwcsname, [in] IStorage *pstgdest, [in] OLECHAR *pwcsnewname, [in] DWORD grfflags); HRESULT Commit([in] DWORD grfcommitflags); HRESULT Revert(); HRESULT EnumElements([in] DWORD reserved1, [in, size_is(1)] void *reserved2, [in] DWORD reserved3, [out] IEnumSTATSTG **ppenum); HRESULT DestroyElement([in] OLECHAR *pwcsname); HRESULT RenameElement([in] OLECHAR *pwcsoldname, [in] OLECHAR *pwcsnewname); HRESULT SetElementTimes([in] OLECHAR *pwcsname, [in] FILETIME *pctime, [in] FILETIME *patime, [in] FILETIME *pmtime); HRESULT SetClass([in] REFCLSID clsid); HRESULT SetStateBits([in] DWORD grfstatebits, [in] DWORD grfmask); HRESULT Stat([out] STATSTG *pstatstg, [in] DWORD grfstatflag); }

Structured storage IStream interface IStream : ISequentialStream { HRESULT Seek([in] LARGE_INTEGER dlibmove, [in] DWORD dworigin, [out] ULARGE_INTEGER *plibnewposition); HRESULT SetSize([in] ULARGE_INTEGER libnewsize); HRESULT CopyTo([in] IStream *pstm, [in] ULARGE_INTEGER cb, [out] ULARGE_INTEGER *pcbread, [out] ULARGE_INTEGER *pcbwritten); HRESULT Commit([in] DWORD grfcommitflags); HRESULT Revert(); HRESULT LockRegion([in] ULARGE_INTEGER liboffset, [in] ULARGE_INTEGER cb, [in] DWORD dwlocktype); HRESULT UnlockRegion([in] ULARGE_INTEGER liboffset, [in] ULARGE_INTEGER cb, [in] DWORD dwlocktype); HRESULT Stat([out] STATSTG *pstatstg, [in] DWORD grfstatflag); HRESULT Clone([out] IStream **ppstm); } interface ISequentialStream : IUnknown { HRESULT Read([out, size_is(cb), length_is(*pcbread)] void *pv, [in] ULONG cb, [out] ULONG *pcbread); HRESULT Write([in, size_is(cb)] void const *pv, [in] ULONG cb, [out] ULONG *pcbwritten); }

Structured storage IStorage Do tworzenia obiektu IStorage skojarzonego z plikiem służą funkcje: StgCreateStorageEx() StgOpenStorageEx() StgCreateDocfileOnILockBytes() Przykład: IStorage *pstorage; hr = StgCreateStorageEx( L C:\Plik.stg", STGM_CREATE STGM_SHARE_EXCLUSIVE STGM_READWRITE, STGFMT_DOCFILE, 0, NULL, NULL, IID_IStorage, (void**)&pstorage);... pstorage->release();

Structured storage IPropertySetStorage, IPropertyStorage Zawartość poszczególnych strumieni danych IStream może mieć dowolny format i jest najczęściej zrozumiała jedynie dla obiektu, który go zapisał. Aby system operacyjny mógł odczytać pewne podstawowe informacje o pliku, opracowano dwa standardowe interfejsy zapisujące informacje w formie zrozumiałej dla systemu. Przedstawiane są one jako kolejne zakładki podczas wyświetlania właściwości pliku. Do zarządzania informacjami o właściwościach pliku opracowano dwa interfejsy IPropertyStorage i IPropertySetStorage.

Structured storage IPropertySetStorage, IPropertyStorage IPropertySetStorage : IUnknown { HRESULT Create([in] REFFMTID rfmtid, [in] CLSID *pclsid, [in] DWORD grfflags, [in] DWORD grfmode, [out] IPropertyStorage **ppprstg); HRESULT Open([in] REFFMTID rfmtid, [in] DWORD grfmode, [out] IPropertyStorage **ppprstg); HRESULT Delete([in] REFFMTID rfmtid); HRESULT Enum([out] IEnumSTATPROPSETSTG **ppenum); } interface IPropertyStorage : IUnknown { HRESULT ReadMultiple([in] ULONG cpsp,[in,size_is(cpsp)] PROPSPEC rgpsp[], [out,size_is(cpspec)] PROPVARIANT rgpropvar[]); HRESULT WriteMultiple([in] ULONG cpsp, [in,size_is(cpsp)] PROPSPEC rgpsp[], [in,size_is(cpsp)] PROPVARIANT rgpropvar[], [in] PROPID propidnamefirst); HRESULT DeleteMultiple([in] ULONG cpsp, [in,size_is(cpsp)] PROPSPEC rgpsp[]); HRESULT ReadPropertyNames([in] ULONG cpid, [in,size_is(cpid)] PROPID rgpid[], [out,size_is(cpid)] LPOLESTR rglpwstrname[]); HRESULT WritePropertyNames([in] ULONG cpid, [in,size_is(cpid)] PROPID rgpid[], [in, size_is(cpid)] LPOLESTR rglpwstrname[]); HRESULT DeletePropertyNames([in] ULONG cpid, [in,size_is(cpid)] PROPID rgpid[]); HRESULT Commit([in] DWORD grfcommitflags); HRESULT Revert(); HRESULT Enum([out] IEnumSTATPROPSTG **ppenum); HRESULT SetTimes([in] FILETIME *pct, [in] FILETIME *pat, [in] FILETIME *pmt); HRESULT SetClass([in] REFCLSID clsid); HRESULT Stat([out] STATPROPSETSTG *pstatpsstg); }

Structured storage IPropertySetStorage, IPropertyStorage Z obiektem IStorage może być skojarzonych wiele obiektów IPropertySetStorage. Każdy z nich identyfikowany jest przez GUID, który określa obiekt, który wizualizuje zestaw. Powszechnie stosowanymi rodzajami zestawów właściwości są: FMTID_SummaryInformation FMTID_DocSummaryInformation Możliwe jest zdefiniowanie własnych typów zestawów i opracowanie obiektów, które będą je we właściwy sposób wizualizowały. IProperySetStorage* ppss; IProperyStorage* pps; pstorage->queryinterface(iid_ IProperySetStorage, (void**)ppss); ppss->create(fmtid_summaryinformation, NULL, PROPSETFLAG_ANSI, STGM_CREATE STGM_READWRITE STGM_SHARE_EXCLUSIVE,&pPS));... pps-_release(); ppss->release();

Moniker jest komponentem typu IMoniker służącym do aktywacji lub dostępu do zarejestrowanych obiektów poprzez jego nazwę. Moniker może obsługiwać różnego typu obiekty w systemie, takie jak pliki, wskaźniki, URL, a także obiekty COM. Dziedziczy on od interfejsu IPersistStream, który z kolei dziedziczy od IPersist. Interfejsy te pozwalają na aktywację obiektów i odtworzenie ich stanu. interface IPersist : IUnknown { HRESULT GetClassID([out] CLSID *pclassid); } interface IPersistStream : IPersist { HRESULT IsDirty(void); HRESULT Load([in] IStream *pstm); HRESULT Save([in] IStream *pstm,[in] BOOL fcleardirty); HRESULT GetSizeMax([out] ULARGE_INTEGER *pcbsize); }

IPersist, IPersistStream IPersist::GetClasID() zwraca CLSID komponentu. Podczas zapisywania stanu obiektu, zapamiętywany jest również CLSID w celu uniknięcia konfliktów typu podczas odczytu. IPersistStream::IsDirty() informuje czy obiekt został zmieniony o ostatniego zapisu. IPersistStream::Load() odczytuje stan obiektu ze strumienia. IPersistStream::Save() zapisuje stan obiektu do strumienia. IPersistStream::GetSizeMax() identyfikuje rozmiar w bajtach potrzebny do zapisania obiektu.

IMoniker interface IMoniker:IPersistStream { HRESULT BindToObject([in] IBindCtx *pbc, [in] IMoniker *pmktoleft, [in] REFIID riidresult, [out] void **ppvresult); HRESULT BindToStorage([in] IBindCtx *pbc, [in] IMoniker *pmktoleft, [in] REFIID riid, [out] void **ppvobj); HRESULT Reduce([in] IBindCtx *pbc, [in] DWORD dwreducehowfar, [in, out] IMoniker **ppmktoleft, [out] IMoniker **ppmkreduced); HRESULT ComposeWith([in] IMoniker *pmkright, [in] BOOL fonlyifnotgeneric, [out] IMoniker **ppmkcomposite); HRESULT Enum([in] BOOL fforward, [out] IEnumMoniker **ppenmoniker); HRESULT IsEqual([in] IMoniker *pmkothermoniker); HRESULT Hash([out] DWORD *pdwhash); HRESULT IsRunning([in] IBindCtx *pbc, [in] IMoniker *pmktoleft, [in] IMoniker *pmknewlyrunning); HRESULT GetTimeOfLastChange([in] IBindCtx *pbc, [in] IMoniker *pmktoleft, [out] FILETIME *pfiletime); HRESULT Inverse([out] IMoniker **ppmk); HRESULT CommonPrefixWith([in] IMoniker *pmkother, [out] IMoniker **ppmkprefix); HRESULT RelativePathTo([in] IMoniker *pmkother, [out] IMoniker **ppmkrelpath); HRESULT GetDisplayName([in] IBindCtx *pbc, [in] IMoniker *pmktoleft, [out] LPOLESTR *ppszdisplayname); HRESULT ParseDisplayName([in] IBindCtx *pbc, [in] IMoniker *pmktoleft, [in] LPOLESTR pszdisplayname, [out] ULONG *pcheaten, [out] IMoniker **ppmkout); HRESULT IsSystemMoniker([out] DWORD *pdwms); }

IMoniker ParseDisplayName() analizuje łańcuch tekstowy i przypisuje monikerowi nazwę obiektu. Dla złożonych nazw analizowany jest początek łańcucha do pierwszego niezrozumiałego wyrażenia. Pozostała część łańcucha pozostawiana jest do analizy przez inny moniker, który zostanie zgrupowany z bieżącym. Metoda ta najczęściej nie jest wywoływana bezpośrednio ale przez funkcję systemową MkParseDisplayName, która wywołuje kolejne monikery, interpretując kolejne fragmenty, a następnie zwraca moniker całej grupy. ULONG eaten; IBindCtx *pbc; IMoniker* pmoniker; OLECHAR str[] = L"clsid:10000013-0000-0000-0000-000000000001"; CreateBindCtx( 0, &pbc ); MkParseDisplayName(pbc, str, &eaten, pmoniker);

IMoniker BindToObject() łączy moniker z obiektem o zdefiniowanej nazwie i określonym IID (znajduje istniejący lub aktywuje nowy). Przekazywany parametr IBindCtx informuje min. czy przy aktywacji obiektu należy załadować z pliku stan obiektu (obiekt typu persistent) i czy też maksymalny czas przeznaczony na łączenie się z obiektem. IStopwatch *pstopwatch; pmoniker->bindtoobject( pbc, NULL, IID_IStopwatch, &pstopwatch ); pbc->release(); // pstopwatch now points to the object // do some job with pstopwatch pstopwatch->release(); IsRunning() informuje, czy obiekt identyfikowany przez moniker jest załadowany i uruchomiony.

IMoniker GetDisplayName() zwraca łańcuch znakowy reprezentujący nazwę obiektu lub grupy. ComposeWith() łączy monikery w grupy (composition) zwracając jeden wspólny moniker. Funkcja ta może być używana do tworzenia pełnej ścieżki do pliku na bazie niekompletnej i relatywnej ścieżki. Enum() pozwala na przeglądanie składowych grupy monikerów utworzonych przez ComposeWith(). IsEqual() porównuje moniker z innym i zwraca informację czy wskazują ten sam obiekt. GetTimeOfLastChange() zwraca czas ostatniej modyfikacji obiektu.

Running Object Table (ROT) ROT jest tablicą przechowującą zarejestrowane obiekty. Pozwala ona na dostęp do jednej instancji obiektu z różnych procesów. Komponent lub aplikacja go aktywująca może zarejestrować informację o nim, dzięki czemu inny proces może się do tego odwołać. Ponieważ sam obiekt nie przechowuje informacji o swoim CLSID i IID, musi być on zarejestrowany wraz z monikerem go opisującym. Dostęp do ROT odbywa się poprzez obiekt IRunningObjectTable. IMoniker podczas wywołania BindToObject() najpierw przeszukuje ROT czy żądany obiekt już jest zarejestrowany i zwraca jego referencję. Dostęp do ROT uzyskuje się przez funkcję GetRunningObjectTable(): IRunningObjectTable* prot; GetRunningObjectTable(NULL, &prot);

Running Object Table (ROT) interface IRunningObjectTable : IUnknown { } HRESULT Register ( [in] DWORD grfflags, [in] IUnknown *punkobject, [in] IMoniker *pmkobjectname, [out] DWORD *pdwregister ); HRESULT Revoke ( [in] DWORD dwregister ); HRESULT IsRunning ( [in] IMoniker *pmkobjectname ); HRESULT GetObject ( [in, unique] IMoniker *pmkobjectname, [out] IUnknown **ppunkobject ); HRESULT NoteChangeTime ( [in] DWORD dwregister, [in] FILETIME *pfiletime ); HRESULT GetTimeOfLastChange ( [in] IMoniker *pmkobjectname, [out] FILETIME *pfiletime ); HRESULT EnumRunning ( [out] IEnumMoniker **ppenummoniker );

Running Object Table (ROT) HRESULT Register( DWORD grfflags, IUnknown *punkobject, IMoniker *pmkobjectname, DWORD *pdwregister ); Register() rejestruje moniker wraz z obiektem w ROT: grfflags: ROTFLAGS_REGISTRATIONKEEPSALIVE - ROT wywołuje metodę AddRef() przy rejestracji obiektu. Gdy flaga ta nie jest ustawiona wywoływane jest Release() i obiekt jest usuwany z ROT gdy ostatnie połączenie z obiektem jest zwolnione. W przeciwnym wypadku Release() jest wywoływane dopiero przy jawnym wywołaniu Revoke(). ROTFLAGS_ALLOWANYCLIENT - gdy ustawiona pozwala na dostęp do obiektu każdemu użytkownikowi. Gdy flaga ta nie jest ustawiona, dostęp do obiektu ma jedynie użytkownik rejestrujący obiekt.

Running Object Table (ROT) HRESULT Revoke( DWORD dwregister ); Revoke() usuwa zarejestrowany obiekt z ROT. HRESULT IsRunning( IMoniker *pmkobjectname); IsRunning() sprawdza czy obiekt identyfikowany przez moniker zarejestrowany jest w ROT. HRESULT GetObject( IMoniker *pmkobjectname, IUnknown **ppunkobject); GetObject() pobiera interfejs obiektu zarejestrowanego w ROT identyfikowanego przez moniker.

Running Object Table (ROT) HRESULT NoteChangeTime( DWORD dwregister, FILETIME *pfiletime ); NoteChangeTime() aktualizuje czas ostatniej modyfikacji obiektu. HRESULT GetTimeOfLastChange( IMoniker *pmkobjectname, FILETIME *pfiletime ); GetTimeOfLastChange() odczytuje czas ostatniej modyfikacji obiektu identyfikowanego przez moniker. HRESULT EnumRunning( IEnumMoniker **ppenmmoniker ); EnumRunning() pozwala na przegląd obiektów zarejestrowanych w ROT.