COM Maciej Głowacki mglowa@softsystem.pl
Aplikacja monolityczna Kod źródłowy Kompilacja Linkowanie Wywołanie Funkcji Aplikacja Biblioteka statyczna Biblioteka dll System operacyjny
Aplikacja + biblioteka statyczna duży rozmiar kodu wynikowego każda aplikacja korzystająca z biblioteki posiada ją w sobie duże kłopoty przy zmianie kodu biblioteki Wywołanie Funkcji Aplikacja Biblioteka statyczna
Aplikacja + biblioteka dll kłopoty przy zmianie kodu biblioteki Wywołanie Funkcji Aplikacja Biblioteka dll
Co robi COM ? Aplikacja Aplikacja Wywołanie Funkcji Biblioteka dll Biblioteka statyczna Wywołanie Funkcji System operacyjny Biblioteka Wywołanie Funkcji Aplikacja System operacyjny
Ewolucja oprogramowania Zintegrowane środowisko obiektów zgodnych z COM Zestawy programów ? 1985 1996 2000 2003 Pojedyncze aplikacje
Co to jest COM ? COM (Component Object Model) specyfikacja jak tworzyć komponenty binarne komponenty gotowe do użycia niezależne od języka programowania ułatwia wersjowanie Interfejsy Komponent
Biblioteka komponentów Zalety COM Szybkie tworzenie aplikacji RAD (Rapid Apllication Developer) A B A B Aplikacja 1 C D D A Aplikacja 2 Biblioteka komponentów
Zalety COM Niezależność od języka programowania Smalltalk, Java, Python, Power Builder Działa tam gdzie jest zaimplementowany Windows, Macintosh, UNIX A Komponent napisany w C++ A B B Komponent napisany w Javie Aplikacja
Zalety COM Łatwość wersjowania komponentów Łatwa rozszerzalność A Aplikacja 1 A Add Word Delete Word Aplikacja 2 Nowy interfejs Get Synonim
Ponowne użycie
Postacie COM Komputer A Klient proces Obiekt Klient „In-process server”
Postacie COM Komputer A Klient Proxy Obiekt Stub Klient proces Server proces Interprocess
Postacie COM Klient Proxy Obiekt Stub Klient proces Server proces RPC komputer B komputer A
HRESULT, GUID i Rejestr HRESULT 32-bitowa liczba S_... sukces , E_ ... porażka błąd S_OK definiowane jako 0 E_FALSE definiowane jako 1 31 30 16 15 15 bitów 16 bitów Wartość zwracana Dodatkowa informacja Status
HRESULT, GUID i Rejestr S_OK - sukces NOERROR - takie same znaczenie jak S_OK S_FALSE - sukces zwraca false E_NOINTERFACE - nie wspiera interfejsu E_NOTIMPL - funkcja składowa nie istnieje E_FAIL - nieokreślony błąd
{D01C25A2-6BF9-11d2-B3E7-CA99FFF43F40} HRESULT, GUID i Rejestr GUID (Globally Unique Identifier) niepowtarzalny identyfikator każdy interfejs posiada GUID GUIDGEN.EXE + kod źródłowy powtórzy się ok. 3400 roku Przykład GUID: {D01C25A2-6BF9-11d2-B3E7-CA99FFF43F40}
HRESULT, GUID i Rejestr Komputer HKEY_CLASSES_ROOT Rozszerzenia plików CLSID Przyjazna nazwa komponentu {D01C25A2-6BF9-11d2-B3E7-CA99FFF43F40} Ala GUID InprocServer32 C:\WINDOWS\ARHIVE.DLL Lokalizacja komponentu
HRESULT, GUID i Rejestr STDAPI DllRegisterServer() STDAPI DllUnregisterServer() RegSvr32.exe
Interfejs IUnknown Podstawowy interfejs komponentów Podstawowa funkcja QueryInterface Pytanie o interfejs class IUnknown { public: virtual HRESULT QueryInterface(REFIID iid,void** ppvObj)=0; virtual ULONG AddRef() = 0; virtual ULONG Release() = 0; };
Tworzenie komponentu 4 Klient Komponent Wywołanie funkcji z interfejsu A A wskaźnik do interfejsu A 3 Wywołanie CoCreateIntance (CLSID_X, IID_A) 2 CLSID_X C:\WINDOWS\ALA.DLL CLSID_Y C:\TMP\AS.DLL Rejestr 1 CoCreateInstance Biblioteka COM
Fabryka klas CoCreateInstance tworzy komponent Nie mamy możliwości kontrolowania IClassFactory interfejs tworzący komponenty IClassFactory2 wsparcie dla licencji interface IClassFactory : IUnknown { HRESULT CreateInstance(IUnknown* pUnknownOuther, const IID& iid, void** ppv); };
Tworzenie fabryki klas Fabryka klas Klient CoGetClassObject Biblioteka COM DLL 1 2 DllGetClassObject CoGetClassObject 3 Tworzenie fabryki klas 4 zwraca IClassFactory 5 CreateInstance IClassFactory pIClassFactory 6 7 zwraca IArhive IArhive pIArhive 8 wywołanie funkcji
Automatyzacja Chart Wykres Baza danych Arkusz kalkulacyjny Acess Excel Edytor tekstu Wykres weź dane z bazy obrób je w arkuszu Word zrób wykres wklej do edytora wyślij do szefa Email Outlok
IDispatch DISPID 1 2 3 „ala” „azor” „PrintLabel” ... GetTypeInfo GetTypeInfoCount GetIDsOfNames 1 2 3 &ala Invoke &azor &PrintLabel DISPID
Tworzenie zdalnego komponentu Klient Komponent 5 A 4 Wywołanie CoCreateIntance (CLSID_X, IID_A) 1 Rejestr CLSID_X C:\ALA.DLL 3 CoCreateInstance Biblioteka COM Rejestr CLSID_X softsystem.pl 2 CLSID_Y C:\TMP\AS.DLL
Tworzenie zdalnego komponentu Klient Komponent 4 A 3 1 Wywołanie CoCreateIntanceExt (CLSID_X,IID_A,softsystem.p) Rejestr CLSID_X C:\ALA.DLL CoCreateInstance Biblioteka COM 2
Jak stworzyć COMa Klasyczne C++ Klasy MFC Biblioteka ATL inne ?