Technologie COM i COM - Component Object Model Jarosław Francik COM - Common Object Model Program - monolit Program składnikowy Składnik A Składnik B Składnik C Składnik D Składnik E Architektura składnikowa a architektura klient serwer Programowanie obiektowe a programowanie składnikowe Architektura klient-serwer A Serwer B Program składnikowy Składnik A Składnik B Składnik C Interfejs: Grupa właściwości i metod implementowanych przez klasę. C++: Dziedziczenie COM: Interfejsy i ich implementacja Java: Jedno i drugie 1
podejście firmy Microsoft podejście firmy Microsoft COM - Common Object Model OLE - Object Linking and Embedding Automatyzacja - Automation (dawniej: Automatyzacja OLE) DirectX DAO - Data Access Objects DCOM - Distributed COM COM+ - technologia dla XXI wieku Obiekt COM podejście firmy Microsoft Obiekt: kombinacja danych i metod Klasy i interfejsy COM pozwala stosować wiele interfejsów dla jednej klasy Hermetyzacja Polimorfizm Dziedziczenie COM zapewnia tylko dziedziczenie interfejsów podejście firmy Microsoft Obiektowość Spójność Niezależność od języka Kontrola wersji 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
Interfejsy Interfejs IUnknown QueryInterface() {...} ptr #1 ptr #2 AddRef() {...} ptr #3 Release() {...} ptr #4 ptr #5 LookUpWord() {...} ptr #6 AddToDictionary() {...} RemoveFromD...() {...} IUnknown::QueryInterface IUnknown::AddRef IUnknown::Release IUnknown::QueryInterface 1. wywołuje QueryInterface(IID) 2. Obiekt zwraca wskaźnik na interfejs 3. może wywoływać metody Składnik COM Serwer Interfejsy są niezmienne Dodanie nowej funkcjonalności wymaga zdefiniowania nowego interfejsu Klasy i interfejsy Klasa CLSID Interfejs IID Dwie różne klasy (o różnych CLSID) mogą implementować te same interfejsy Typy składników COM Składniki wewnątrzprocesowe - DLL Składniki zewnątrzprocesowe, lokalne - EXE Składniki zewnątrzprocesowe, zdalne y 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 żądań klienta w osobnym procesie i wątku Osobna przestrzeń adresowa Wysoka stabilność Niższa wydajność (przekazywanie danych poprzez granice procesów) Możliwość uruchomienia jako niezależnej aplikacji Przydatne przy automatyzacji i w DCOM Przetwarzanie rozproszone w relacji klient - serwer Korzystanie z lokalnego składnika KLIENT PROXY COM STUB Korzystanie ze zdalnego składnika SERWER Tworzenie obiektów Znalezienie serwera (poprzez CLSID i rejestr systemowy) Stworzenie instancji Udostępnienie wskaźnika do interfejsu KLIENT PROXY STUB PROXY STUB SERWER CoCreateInstance DCOM (RPC) CoCreateInstance Class Factory 4. może wywoływać metody Serwer 4. może wywoływać metody Serwer 1. wywołuje CoCreateInstance (CLSID, IID) 3. Serwer udostępnia wskaźnik do interfejsu COM API Składnik COM 2. COM API lokalizuje serwer registry 3. Fabryka udostępnia wskaźnik interfejsu 1. wywołuje IClassFactory::CreateInstance(IID) Składnik COM Class factory 2. Fabryka tworzy obiekt i pobiera wskaźnik 4
Automatyzacja Interfejsy (przypomnienie) Programowalność Udostepnianie interfejsów Użytkowanie za pomocą Visual Basic Uproszczone interfejsy : dispatch interfaces (dispinterfaces) QueryInterface() {...} ptr #1 ptr #2 AddRef() {...} ptr #3 Release() {...} ptr #4 ptr #5 LookUpWord() {...} ptr #6 AddToDictionary() {...} RemoveFromD...() {...} dispinterface ::Invoke vs. Invoke() { switch(dispid) } 1: Metoda1( ) 2: Metoda2( ) 3: Metoda3( ) dispinterface Visual Basic C++ Automatyzacja na ogół dual interfaces Interfejsy (przypomnienie) QueryInterface() {...} ptr #1 ptr #2 AddRef() {...} ptr #3 Release() {...} ptr #4 ptr #5 LookUpWord() {...} ptr #6 AddToDictionary() {...} RemoveFromD...() {...} 5
dispinterface ::Invoke (przypomnienie) y Invoke() { switch(dispid) } 1: Metoda1( ) 2: Metoda2( ) 3: Metoda3( ) dispinterface Ewolucja: VBX Visual Basic Extension OLE Controls Controls Cechy: Składniki oparte na COM (IUnknown) Możliwość samorejestracji (np. przy pobieraniu z Internetu) y y interfejs użytkownika metody zdarzenia właściwości Implementacja obejmuje wiele interfejsów COM (typu ) Z punktu widzenia użytkownika widoczne są przede wszystkim dispinterfaces SERWER KLIENT SERWER KLIENT y y Container Site (events) 6
y interfejs użytkownika Site (events) Container Site (events) Container metody zdarzenia Site (events) Container Site (events) Container właściwości inne interfejsy Site (events) Container Site (events) Container 7
VB implementacja COM. Podsumowanie Automatyzacja użycie interfejsu Metody zdefiniowane w dispinterface i dostępne poprzez ::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 Implementacja COM i w C++ Czas na demonstrację... Dziękuję za uwagę 8