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

Podobne dokumenty