Architektura COM doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Obsah přednášky Historie Component Object Model (COM) Komunikace s komponentami Rozhraní komponent COM komponenty v.net.net komponenty Architektura COM 2 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 1
Historie 1990 OLE 1.0 (Object Linking and Embedding) strukturované dokumenty Příklad: vložení grafu z Excelu do Wordu 1991 Visual Basic 1.0 - VBX 1993 OLE 2.0, COM (Component Object Model) Využito ve Windows 3.1, základ pro Windows 95 1994 OLE controls (OCX) 1996 ActiveX, DCOM (Distributed COM) Architektura COM 3 Historie 2000 COM+ (Windows 2000) Distribuované komponenty Farmy komponent MTS (MS Transaction Server) 2002.NET Framework Zachována návaznost na COM Architektura COM 4 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 2
Component Object Model (COM) Globální identifikace komponent a jejich rozhraní (GUID) 16 byte 10 19 kombinací {3F2504E0-4F89-11D3-9A0C-0305E82C3301 Algoritmus již nezahrnuje MAC adresu (bylo možné vystopovat autora dokumentu červ Melissa) Binární kompatibilita + vazby na jazyky Počítání referencí jednoduchá správa paměti Komponenta implementuje více rozhraní Architektura COM 5 Typy komponent in-process běží ve stejném adresovém prostoru a na stejném procesoru jako aplikace (.DLL) out-of-process běží v samostatném adresovém prostoru nebo na samostatném serveru (.EXE) vyžadují zajištění přenosu požadavků a výsledků (marshalling, serializace) komunikace s komponentou prostřednictvím zástupce (proxy, stub) Architektura COM 6 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 3
Komunikace s komponentami in-process component Architektura COM 7 Komunikace s komponentami out-of-process component Architektura COM 8 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 4
Rozhraní komponenty C++ tabulka virtuálních metod Architektura COM 9 Rozhraní komponenty v C struct Komponenta { void** _vmt; // ukazatel na VMT int var_1; // další instanční proměnné int var_2;... ; // implementace metod void Komponenta_metoda1( struct Komponenta* _this, int arg) {... int Komponenta_metoda2( struct Komponenta* _this) {... // tabulka virtuálních metod void* Komponenta vmt[] = { Komponenta_metoda1, Komponenta_metoda2 ; Architektura COM 10 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 5
Rozhraní IUnknown Jak získat přístup ke konkrétnímu rozhraní? Každá COM komponenta implementuje rozhraní IUnknown Metody: QueryInterface vrátí adresu VMT pro rozhraní se zadaným GUID AddRef zvýší počitadlo odkazů na komponentu Release sníží počitadlo a příp. uvolní z paměti Architektura COM 11 Příklad generátor náh. čísel // Soubor IRandom.h #pragma once #include "unknwn.h" // {CB8DF8CB-3F6C-4c02-A587-18566C28487B DEFINE_GUID(IID_IRandom, 0xcb8df8cb, 0x3f6c,0x4c02,0xa5,0x87,0x18,0x56,0x6c,0x28,0x48,0x7b); interface IRandom : IUnknown { virtual HRESULT STDMETHODCALLTYPE Start( int seed) = 0; virtual HRESULT STDMETHODCALLTYPE Next( int *val) =0; ; Architektura COM 12 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 6
Příklad generátor náh. čísel #pragma once #include "IRandom.h class CRandomImpl : public IRandom { public: // IUnknown STDMETHODIMP QueryInterface(REFIID, void **); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // IRandom STDMETHODIMP Start(int seed); STDMETHODIMP Next(int* result); private: ULONG m_refcnt; ULONG m_seed; ; Architektura COM 13 Příklad generátor náh. čísel #define INITGUID #include "IRandom.h" #include <iostream> using namespace std; void main(int argc, char** argv) { // inicializace COM HRESULT hr = CoInitialize(NULL); if (FAILED(hr)) {... // vytvoření instance komponenty IRandom *prnd = NULL; hr = CoCreateInstance(CLSID_RandomImpl, NULL, CLSCTX_ALL, IID_IRandom, (void **)&prnd); if (FAILED(hr)) {... // použití komponenty prnd->start(1234); // uvolnění komponenty prnd->release(); // finalizace COM CoUninitialize(); Architektura COM 14 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 7
Příklad generátor náh. čísel Option Explicit On Module RandomTest VB.NET Sub Main() Dim rnd As RandomLib.IRandom Dim val As Integer rnd = New RandomLib.RandomImpl rnd.start(1234) For i As Integer = 0 To 9 rnd.next(val) Console.WriteLine("{0: {1", i, val) Next End Sub End Module Architektura COM 15 COM komponenty v.net K dispozici jsou metadata nepotřebujeme IUnknown Implementace komponent jsou odvozeny od System.EnterpriseServices.ServicedComponent namespace RandomCs { public interface IRandom { void Start(int seed); int Next(); Architektura COM 16 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 8
COM komponenty v.net using System; using System.EnterpriseServices; namespace RandomCs { public class Random: ServicedComponent, IRandom { private int m_seed = 0; public void Start(int seed) { m_seed = seed; public int Next() { m_seed = m_seed * 3925 + 28347; return m_seed & 0xffff; Architektura COM 17 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 9