Technologie COM i ActiveX COM - Component Object Model COM
Transkrypt
Technologie COM i ActiveX COM - Component Object Model COM
Technologie COM i ActiveX Jarosław Francik COM - Component Object Model Programowanie składnikowe Programowanie składnikowe COM - Common Object Model ❂ Program - monolit ❂ Program składnikowy Programowanie składnikowe Składnik A Składnik B Składnik C Architektura składnikowa a architektura klient serwer ❂ Architektura klient-serwer Serwer ❂ Program składnikowy Składnik D Składnik E Programowanie obiektowe a programowanie składnikowe ❂ Interfejs: Grupa właściwości i metod implementowanych przez klasę. Składnik A C++: Dziedziczenie COM: Interfejsy i ich implementacja ❂ Java: Jedno i drugie ❂ Składnik B Klient A Klient B Składnik C ❂ 1 Programowanie składnikowe podejście firmy Microsoft ❂ Programowanie składnikowe podejście firmy Microsoft COM - Common Object Model • OLE - Object Linking and Embedding • Automatyzacja - Automation (dawniej: Automatyzacja OLE) • ActiveX • DirectX • DAO - Data Access Objects • DCOM - Distributed COM ❂ podejście firmy Microsoft ❂ Obiekt COM COM+ - technologia dla XXI wieku Programowanie składnikowe ❂ Klient Obiekt: kombinacja danych i metod Klasy i interfejsy COM pozwala stosować wiele interfejsów dla jednej klasy Hermetyzacja Polimorfizm ❂ Dziedziczenie ❂ Programowanie składnikowe podejście firmy Microsoft Obiektowość ❂ Spójność ❂ Niezależność od języka ❂ Kontrola wersji ❂ ❂ COM zapewnia tylko dziedziczenie interfejsów Interfejsy ❂ Nazwa czytelna: ISpellChecker ❂ Nazwa nieczytelna: Globally Unique IDentifier GUID IID CLSID Interfejsy [ object, uuid(E7CD0D00-1827-11CF-9946-444553540000) ] Interface ISpellChecker : IUnknown { import "unknwn.idl"; HRESULT LookUpWord([in] OLECHAR word[31], [out] boolean *found); HRESULT AddToDictionary([in] OLECHAR word[31]); HRESULT RemoveFromDictionary([in] OLECHAR[31]); } 2 Interfejs IUnknown Interfejsy Klient Składnik COM ptr #1 ptr #2 ptr #3 ptr #4 ptr #5 ptr #6 vtable QueryInterface() {...} AddRef() {...} ❂ ❂ ❂ IUnknown::QueryInterface IUnknown::AddRef IUnknown::Release Release() {...} LookUpWord() {...} AddToDictionary() {...} RemoveFromD...() {...} IUnknown::QueryInterface Klient 1. Klient wywołuje QueryInterface(IID) a wrac ejs rf iekt z 2. Ob nik na inte ź a wsk Interfejsy są niezmienne Serwer Dodanie nowej funkcjonalności wymaga zdefiniowania nowego interfejsu Składnik COM 3. Klient może wywoływać metody Klasy i interfejsy Typy składników COM Klasa – CLSID ❂ Interfejs – IID ❂ ❂ Dwie różne klasy (o różnych CLSID) mogą implementować te same interfejsy Składniki wewnątrzprocesowe - DLL ❂ Składniki zewnątrzprocesowe, lokalne - EXE ❂ Składniki zewnątrzprocesowe, zdalne ❂ Formanty OLE (wewnątrzprocesowe) - OCX Przykład: implementacje interfejsu ISpellChecker pochodzące od różnych producentów 3 Składniki wewnątrzprocesowe Działają w obrębie procesu klienta ❂ Korzystają z przestrzeni adresowej klienta ❂ Mniejsza stabilność ❂ Wysoka wydajność ❂ Składniki zewnątrzprocesowe ❂ ❂ ❂ ❂ ❂ ❂ Przetwarzanie rozproszone w relacji klient - serwer ❂ ❂ KLIENT COM PROXY STUB STUB PROXY SERWER STUB Znalezienie serwera (poprzez CLSID i rejestr systemowy) ❂ Stworzenie instancji ❂ Udostępnienie wskaźnika do interfejsu ❂ Korzystanie ze zdalnego składnika PROXY Wysoka stabilność Niższa wydajność (przekazywanie danych poprzez granice procesów) Możliwość uruchomienia jako niezależnej aplikacji Przydatne przy automatyzacji i w DCOM Tworzenie obiektów Korzystanie z lokalnego składnika KLIENT Przetwarzanie żądań klienta w osobnym procesie i wątku Osobna przestrzeń adresowa CoCreateInstance SERWER DCOM (RPC) Klient Class Factory 4. Klient może wywoływać metody 3. Serwer udostępnia wskaźnik do interfejsu Serwer Składnik COM 4. Klient może wywoływać metody 3. Fabryka udostępnia wskaźnik interfejsu 2. COM API lokalizuje serwer 1. Klient wywołuje CoCreateInstance (CLSID, IID) Klient 1. Klient wywołuje IClassFactory::CreateInstance(IID) Serwer Składnik COM Class factory 2. Fabryka tworzy obiekt i pobiera wskaźnik CoCreateInstance registry COM API 4 Automatyzacja Interfejsy (przypomnienie) Programowalność Udostepnianie interfejsów ❂ Użytkowanie za pomocą Visual Basic ❂ „Uproszczone interfejsy”: ❂ Klient ❂ Składnik COM ptr #1 ptr #2 ptr #3 ptr #4 ptr #5 ptr #6 • IDispatch • dispatch interfaces (dispinterfaces) vtable dispinterface IDispatch::Invoke Klient AddRef() {...} Release() {...} LookUpWord() {...} AddToDictionary() {...} RemoveFromD...() {...} vtable vs. IDispatch Visual Basic – IDispatch ❂ C++ – vtable ❂ Automatyzacja – na ogół IDispatch ❂ dual interfaces ❂ Składnik COM 1: Metoda1( ) 2: Metoda2( ) 3: Metoda3( ) } dispinterface Invoke() { switch(DISPID) IDispatch vtable QueryInterface() {...} Interfejsy (przypomnienie) ActiveX Klient Składnik COM ptr #1 ptr #2 ptr #3 ptr #4 ptr #5 ptr #6 vtable QueryInterface() {...} AddRef() {...} Release() {...} LookUpWord() {...} AddToDictionary() {...} RemoveFromD...() {...} 5 dispinterface IDispatch::Invoke (przypomnienie) Klient Formanty ActiveX ❂ Składnik COM • VBX – Visual Basic Extension • OLE Controls • ActiveX Controls 2: Metoda2( ) 3: Metoda3( ) IDispatch vtable } Formanty ActiveX ❂ Cechy: • Składniki oparte na COM (IUnknown) • Możliwość samorejestracji (np. przy pobieraniu z Internetu) Formanty ActiveX interfejs użytkownika Kontener dispinterface Invoke() { switch(DISPID) 1: Metoda1( ) Ewolucja: Formant ActiveX metody Implementacja obejmuje wiele interfejsów COM (typu vtable) ❂ Z punktu widzenia użytkownika widoczne są przede wszystkim dispinterfaces ❂ zdarzenia właściwości SERWER KLIENT SERWER KLIENT Formanty ActiveX IOlePlaceActiveObject IOleInPlaceObject IOleObject IDataObject IViewObject2 IRunnableObject IOleCache2 IPersistStorage IPersistStreamInit ISpecifyPropertyPages IConnectionPointContainer IConnectionPoint IProvideClassInfo2 IDispatch IOleControl Formant ActiveX Formanty ActiveX Kontener IOleInPlaceFrame IOleInPlaceUIWindow IOleInPlaceSite IOleClientSite IAdviseSink IOleControlSite IDispatch IPropertyNotifySink IDispatch (events) 6 Formanty ActiveX Kontener IOleInPlaceFrame IOleInPlaceUIWindow IOleInPlaceSite IOlePlaceActiveObject IOleClientSite IOleInPlaceObject IAdviseSink IOleObject IOleControlSite IDataObject IDispatch IViewObject2 IPropertyNotifySink IRunnableObject IDispatch (events) IOleCache2 IPersistStorage IPersistStreamInit ISpecifyPropertyPages IConnectionPointContainer IConnectionPoint IProvideClassInfo2 IDispatch IOleControl ActiveX – interfejs użytkownika Kontener Formant ActiveX ActiveX – metody Kontener IOleInPlaceFrame IOleInPlaceUIWindow IOleInPlaceSite IOlePlaceActiveObject IOleClientSite IOleInPlaceObject IAdviseSink IOleObject IOleControlSite IDataObject IDispatch IViewObject2 IPropertyNotifySink IRunnableObject IDispatch (events) IOleCache2 IPersistStorage IPersistStreamInit ISpecifyPropertyPages IConnectionPointContainer IConnectionPoint IProvideClassInfo2 IDispatch IOleControl IOleInPlaceFrame IOleInPlaceUIWindow IOleInPlaceSite IOlePlaceActiveObject IOleClientSite IOleInPlaceObject IAdviseSink IOleObject IOleControlSite IDataObject IDispatch IViewObject2 IPropertyNotifySink IRunnableObject IDispatch (events) IOleCache2 IPersistStorage IPersistStreamInit ISpecifyPropertyPages IConnectionPointContainer IConnectionPoint IProvideClassInfo2 IDispatch IOleControl Formant ActiveX ActiveX – zdarzenia Kontener Formant ActiveX ActiveX – właściwości Kontener IOleInPlaceFrame IOleInPlaceUIWindow IOleInPlaceSite IOlePlaceActiveObject IOleClientSite IOleInPlaceObject IAdviseSink IOleObject IOleControlSite IDataObject IDispatch IViewObject2 IPropertyNotifySink IRunnableObject IDispatch (events) IOleCache2 IPersistStorage IPersistStreamInit ISpecifyPropertyPages IConnectionPointContainer IConnectionPoint IProvideClassInfo2 IDispatch IOleControl IOleInPlaceFrame IOleInPlaceUIWindow IOleInPlaceSite IOlePlaceActiveObject IOleClientSite IOleInPlaceObject IAdviseSink IOleObject IOleControlSite IDataObject IDispatch IViewObject2 IPropertyNotifySink IRunnableObject IDispatch (events) IOleCache2 IPersistStorage IPersistStreamInit ISpecifyPropertyPages IConnectionPointContainer IConnectionPoint IProvideClassInfo2 IDispatch IOleControl Formant ActiveX ActiveX – inne interfejsy Kontener Formant ActiveX IOleInPlaceFrame IOleInPlaceUIWindow IOleInPlaceSite IOlePlaceActiveObject IOleClientSite IOleInPlaceObject IAdviseSink IOleObject IOleControlSite IDataObject IDispatch IViewObject2 IPropertyNotifySink IRunnableObject IDispatch (events) IOleCache2 IPersistStorage IPersistStreamInit ISpecifyPropertyPages IConnectionPointContainer IConnectionPoint IProvideClassInfo2 IDispatch IOleControl Formant ActiveX 7 VB – implementacja COM. Podsumowanie Automatyzacja – użycie interfejsu IDispatch Metody – zdefiniowane w dispinterface i dostępne poprzez IDispatch::Invoke ❂ Właściwości – metody specjalnego typu dostępne w dispinterface ❂ Zdarzenia – wywoływanie metod dispinterface kontenera (odwrócenie sytuacji: kontener jest serwerem) VB – implementacja COM. Podsumowanie ❂ ❂ Przy implementacji wszystkich typów składników COM Visual Basic korzysta z elementów technologii ActiveX Implementacja COM i ActiveX w C++ ❂ Czas na demonstrację... Dziękuję za uwagę 8