Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Overwiew COM. Factory CLSID DLL Interface Query Interface Factory Pattern HA: 10 Fragen – Was ist eine COM-Komponente? Aggregation Inner class 1.) Static.

Ähnliche Präsentationen


Präsentation zum Thema: "Overwiew COM. Factory CLSID DLL Interface Query Interface Factory Pattern HA: 10 Fragen – Was ist eine COM-Komponente? Aggregation Inner class 1.) Static."—  Präsentation transkript:

1 Overwiew COM

2 Factory CLSID DLL Interface Query Interface Factory Pattern HA: 10 Fragen – Was ist eine COM-Komponente? Aggregation Inner class 1.) Static View – Classical (h-File in C++) 2.) Dynamic View – Communication OO-Server mit Events EVENT 3.) Event-Data-System DATA (werden im Blackboard Pattern angelegt)

3 (D)COM = Distributed Component Object Model Inhalte: Basisinterface, Extension Interface Pattern, Reference Counting, Broker Pattern, Factory Pattern COMponent: - box mit Inteface (Design by contract) Interfaces können hinzugefügt werden box-spoon-plot - abgeschlossene Funkionalität - Modul - entspricht einer Klasse, Reuseability (= Wiederverwendbarkeit) - Implementierung austauschbar, loading on demand - wie Klassenbibliothek nutzbar - remote nutzbar - load balancing - Design for Integration - unabhängig von Programmiersprache - Interface Description Language (idl) CORBA, DCOM Softwarebus: CORBA = Common Request Broker Architecture COM = Objectoriented Middleware + Synchrone Communication (+ Asynchrone Communication) Softwarebus

4 BasisInterface IUnknown: interface IUnknown { virtual HRESULT __stdcall QueryInterface (const IID iid, void **ppr) = 0; virtual ULONG__stdcall AddRef () = 0; virtual ULONG__stdcall Release () = 0; } Bemerkung: a.) #define interface struct (class mit public members) b.) __stdcall (Pascal Aufrufkonvention, Methode räumt Stack vor Return auf; normalerweise räumt der Caller den Stack auf) c.) #define STD Method CALL TYPE __stdcall d.) HRESULT 32-Bit-Wert (Bit 1= Severity, Bit 2-16=Facility, Bit 17-32= Return Code Interface-Implementierung in C++: interface IX { public: virtual void Fx1()=0; virtual void Fx2()=0; } interface IY { public: virtual void Fy1()=0; virtual void Fy2()=0; } class CA : public IX, IY { virtual void Fx1() {...}Implementierung (h, cpp).... } Inheritance – Implementierungsdetail ATL nested class (Aggregation, MFC) Trennung Interface und Implementierung Schnittstellenvererbung, keine Implementierungsvererbung Vererbung vtable wird vom Compiler generiert

5 Virtual virtual function table: pIX vtbl pointer Zweistufiger Mechanismus: 1.) look up in vtable (Funktionszeiger) 2.) function call mit Funktionszeiger IDispatch vtable ausimplementieren für z.B. VBasic &Fx1 &Fx2 Fx1 Fx2 IX Enthält Zeiger auf Memberfunktionen Broker-Pattern (Sequenzdiagramm): Client ClientProxy Broker Stub(ServerProxy)Server Call Server Send Request Find Server Channel Call Service Pack Data UnPack Data Run_Service Pack Data Return UnPack Data Result

6 Marshaling (PackData): Datenstruktur Bytewurst Unmarshaling (UnpackData): Daten werden wieder entpackt Parameter-Classification: in out inout sind Bestandteil von idl Query Interface: Query Interface AddRef Release Fx pIx Vtbl- Pointer Query Interface AddRef Release Fx Client vtable Server CA fachliche Klasse HRESULT QueryInterface (const IID &iid, void ** ppv) IUnknown IY IX IY CXCY Componente IUnknown IXIY CXCY Componente IUnknown

7 HRESULT QueryInterface (IID, IDPtr) - 32 Bit - S_OK - E_NOINTERFACE - Makro: SUCEEDED, FAILED Bsp.: void foo(IUnknown *pI) { Ix * pIx=NULL; HRESULT hr=pI QueryInterface(IID_IX, (void**)&pIX); if(SUCEEDED(hr)) { pIx Fx(); } } hr S_OK *ppv != 0 hr E_NOINTERFACE *ppv = 0 janein Unterstützt Interface ein Interface IX? Implementierung für QueryInterface, Add Ref, Release Class Factory Implementierung für QueryInterface, Add Ref, Release Class Factory Implementierung für fachliche Klasse IUnknown IX

8 IUnknown Ix Implementierung von Query Interface: ULONG IUnknown Iy CA a.) Query Interface b.) vTable-Mechanismus IUnknown IX IY Interface IX : IUnknown { /*...*/ } Interface IY : IUnknown { /*...*/ } class CA: public IX, public IY { /*...*/ } :public: private private protected public public public Bemerkung: Cast über nächste Nachbarn *ppv = static_cast (static_cast (this)) (nicht eindeutig als Mehrfachvererbung) Query Interface AddRef Release

9 HRESULT __stdcall CA::QueryInterface (const IID &iid, (void **) ppv); { if(iid == IID_IUnknown) { *ppv = static_cast (this); } else if(iid == IID_IX) { *ppv = static_cast (this); } else if(iid == IID_IY) { *ppv = static_cast (this); } else { *ppv = NULL; return E_NOINTERFACE; } static_cast (*ppv) AddRef(); return S_OK; } a.) if-cascades substitution by hash tables b.) Code: - Client wünscht Interface Ix, Iy, IUnknown - Client wünscht anderes Interface - Reference Counting - Casting ändert Wert des ppv-Zeigers IX vtblpointer IY vtblpointer Instance Data CA:this QueryInterface AddRef Release Fx Virtual Function Table (IX*)CA:this (IY*)CA:this

10 1.) QueryInterface ist symmetrisch pIx QI(IID_Y,...) pIy : QI(IX) IY pIy QI(IID_X,...) pIx : QI(QI(IX) IX) IX 2.) QueryInterface ist transitiv pIx QI(IID_Y,...) pIy pIy QI(IID_Z,...) pIz 3.) QueryInterface ist reflexiv pIx QI(IID_X,...) pIx ÜA: Identität des Interface-Zeigers Frage: Wann gehören pIx und pIy zur gleichen Komponente? Wie kann man rausfinden, ob zwei Interface-Zeiger zur gleichen Komponente gehören? Eigenschaften von Query Interface: IUnknown IX IY IZ

11 Lifetime Control Regeln: 1.) Call AddRef before Return Bsp.: QI, CreateInstance 2.) Call Release when you are done 3.) Call AddRef after assignment Garbage Collection delete this mit Bedingung m_mRef=0 Reference Counting:

12 1.) Nicht-modale Klassen Klassen besitzen keine Beschränkung hinsichtlich der Aufrufreihenfolge ihrer Methoden. Bsp.: class DateTime set(), get(), compareEqual(),... 2.) Unimodale Klassen Beschränkung der Aufrufreihenfolge (Design by Contract) ihrer Methoden, aber unabhängig vom Zustand (Attributinhalt). Bsp.: class Ampel rotesLichtEin(), gelbesLichtEin(),... 3.) Quasimodale Klassen Beschränkung der Aufrufreihenfolge ihrer Methoden ausschließlich basierend auf den aktuellen (State Change in der State Chart) Zustand. Bsp.: class Stapel push() wenn der Stapel gefüllt kann nichts mehr draufgelegt werden 4.) Modale Klassen Beschränkung der Aufrufreihenfolge (State Change in der State Chart) hinsichtlich ihrer Methode und ihrer Zustände (Attributbelegung). Klassifikation von Klassen: Attribute Methode Stateless Objects und State Objects Unimodal call sequence of methods from design by contract Quasimodal State Chart Bind Recovery Find Recovery


Herunterladen ppt "Overwiew COM. Factory CLSID DLL Interface Query Interface Factory Pattern HA: 10 Fragen – Was ist eine COM-Komponente? Aggregation Inner class 1.) Static."

Ähnliche Präsentationen


Google-Anzeigen