Agregacja. Wykorzystanie innego komponentu bez użycia agregacji. Simple calculator. Extended calculator

Podobne dokumenty
Droga do DCOM DCOM (1996) Windows clipboard (1987) OLE 1 DDE (1992) OLE 2 (1993) COM (1995) Distributed computing (1980s)

//////////////////////////////////////////////////////////// // Kalkulator (prosty) - wersja agregowalna import "unknwn.idl";

Henryk Budzisz. materiały przygotowane w ramach projektu ZPORR nr POKL /08-00

Zdarzenia (events, connection points)

// LISTING #2 DRUGIE PODEJŚCIE

4 bity zarezerwowane dla przyszłych zastosowań 11 bitów określających źródło błędu 16 bitów określających rodzaj błędu.

// LISTING #2 DRUGIE PODEJŚCIE

Obiekty w plikach wykonywalnych, marshaling

1.1 Szkielet aplikacji

Structured storage, Monikers, Running Object Table

Lista dwukierunkowa - przykład implementacji destruktorów

Component Object Model laboratorium 2013 K.M. Ocetkiewicz, T. Goluch

Interfejs IUnknown. Każdy obiekt COM musi implementować interfejs IUnknown, który zawiera trzy metody:

Technologie COM i ActiveX COM - Component Object Model

Component Object Model laboratorium 2017 K.M. Ocetkiewicz, T. Goluch

Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.

Konstruktor kopiujacy

Funkcje przeciążone, konstruktory kopiujące, argumenty domyślne

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

wykład V uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ - klasy

Aplikacja webowa w Javie szybkie programowanie biznesowych aplikacji Spring Boot + Vaadin

Aplikacje internetowe i rozproszone - laboratorium

Wykład 4: Klasy i Metody

1.1. Kontrolki ActiveX. Kontrolki ActiveX. Technologia ActiveX. Technologia ActiveX. Technologia ActiveX. Technologia ActiveX.

Zdalne uruchamianie obiektów COM

Polimorfizm, metody wirtualne i klasy abstrakcyjne

PARADYGMATY PROGRAMOWANIA Wykład 3

Diagram stanów Laboratorium 9

Programowanie obiektowe

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Builder (budowniczy) Cel: Przykład:

Programowanie obiektowe

Zarządzanie pamięcią

Zastosowanie słuchaczy zdarzeń wg

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

PARADYGMATY PROGRAMOWANIA Wykład 4

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Bezstanowe komponenty sesyjne i zdarzenia zwrotne

Laboratorium 8 Diagramy aktywności

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Aplikacje RMI

DYNAMICZNE PRZYDZIELANIE PAMIECI

Kompilacja javac prog.java powoduje wyprodukowanie kilku plików o rozszerzeniu.class, m.in. Main.class wykonanie: java Main

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Technologia Programowania 2016/2017 Wykład 5

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

dr Artur Bartoszewski dr Artur Bartoszewski - Aplikacje mobilne - Wykład

Usługa TimerService

Dzisiejszy wykład. Klasa string. wersja prosta wersja ze zliczaniem odwołań. Wyjątki Specyfikator volatile Semafory

Obliczenia równoległe i rozproszone w JAVIE. Michał Kozłowski 30 listopada 2003

Kurs WWW. Paweł Rajba.

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Listy powiązane zorientowane obiektowo

Programowanie komponentowe

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

1 Atrybuty i metody klasowe

Technologia Programowania 2016/2017 Wykład 4

Kurs rozszerzony języka Python

Ćwiczenie 7 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Programowanie w języku C++

Analiza i projektowanie obiektowe 2016/2017. Wykład 11: Zaawansowane wzorce projektowe (1)

akademia androida Service, BroadcastReceiver, ContentProvider część IV

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Podstawy programowania obiektowego

11.6 Klasa do obsługi liczb wymiernych

Budowa aplikacji wielowarstwowych. Obsługa zdarzeń

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Wykład 5: Więcej o Klasach i Metodach

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Fragmenty są wspierane od Androida 1.6

Podstawy programowania w języku C++

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Współbieżność w środowisku Java

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

Przypomnienie o klasach i obiektach

Programowanie obiektowe i zdarzeniowe

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Programowanie składnikowe. Programowanie składnikowe w modelu COM. COM - Component Object Model. wprowadzenie. Programowanie składnikowe

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Diagramy maszyn stanowych, wzorce projektowe Wykład 5 część 1

Definiowanie własnych klas

Wywoływanie metod zdalnych

Plik klasy. h deklaracje klas

PHP 5 język obiektowy

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

Wykład 7: Pakiety i Interfejsy

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Programowanie komponentowe 5

Wstęp do Programowania 2

Diagramy stanów tworzenie modeli analizy i projektowania Na podstawie UML 2.0 Tutorial

Serwery Statefull i Stateless

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Podstawy programowania obiektowego

Laboratorium 1. Wzorce oprogramowania lab1, Zofia Kruczkiewicz

Diagramy maszyn stanowych, wzorce projektowe Wykład 5 część 1

Transkrypt:

Agregacja

Agregacja Agregacja jest to wykorzystywanie przez komponent nadrzędny innego komponentu w taki sposób, że udostępnia jego interfejs jako własny. Aby komponent mógł być użyty jako agregat, metody interfejsów IUnknown i IClassFactory muszą zostać tak skonstruowane, aby spełnione zostały zasady symetrii, zwrotności i przechodniości.

Agregacja Wykorzystanie innego komponentu bez użycia agregacji. ICalc Pwr() Sqrt() Log()... Add() Sub() Mul() Div() ISimpleCalc Add() Sub() Mul() Div() Extended calculator Simple calculator

Agregacja Wykorzystanie innego komponentu bez użycia agregacji (kontener). ICalc ISimpleCalc Pwr() Sqrt()... Log() Add() Sub() Mul() Div() ISimpleCalc Add() Sub() Mul() Div() Extended calculator Simple calculator

Agregacja Wykorzystanie interfejsu innego komponentu przez agregację. IExtCalc ISimpleCalc Pwr() Sqrt()... Log() ISimpleCalc Add() Sub() Mul() Div() Extended calculator Simple calculator Obiekt zewnętrzny Obiekt wewnętrzny

Agregacja Aby obiekt wewnętrzny mógł poprawnie współpracować jako agregat z obiektem zewnętrznym, należy zwrócić uwagę na następujące kwestie: 1. QueryInterface() dla dowolnego interfejsu (ISimpleCalc, IExtCalc) powinno umożliwiać dostęp wszystkich interfejsów (przechodniość) 2. Niezależnie dla jakiego interfejsu wywołuje się QueryInterface(), metoda ta powinna zawsze zwrócić taki sam wskaźnik dla danego interfejsu. 3. Licznik odwołań powinien być wspólnie zarządzany dla obu komponentów.

Agregacja - obiekt wewnętrzny CreateInstance() Informacja o tym czy obiekt wewnętrzny uruchomiony został jako zwykły obiekt, czy jako agregat dostarczana jest w trakcie wywołania CreateInstance() obiektu class factory. HRESULT CreateInstance( LPUNKNOWN punkouter, REFIID riid, void** ppvobj ); Gdy komponent uruchomiono jako agregat innego komponentu, to parametr punkouter powinien zawierać wskaźnik do interfejsu IUnknown obiektu zewnętrznego (innym przypadku wskaźnik ten ma wartość NULL). Powinien on być zapamiętany przez klasę realizującą obiekt wewnętrzny, aby odpowiednio obsłużyć swoje metodę QueryInterface().

Agregacja - obiekt wewnętrzny CreateInstance() HRESULT stdcall CSimpleCalcClassFactory::CreateInstance( IUnknown *punkouter, REFIID riid, void **ppvobject ) { HRESULT hr; // if (punkouter!=null) // return E_NOAGREGATION; CSimpleCalc* psimplecalc = new CSimpleCalc(pUnkOuter); hr = psimplecalc->queryinterface(riid, ppvobject); if (FAILED(hr)) delete psimplecalc; return hr; CSimpleCalc:: CSimpleCalc(IUnknown* punknownouter) { m_punknownouter=punknownouter;

Agregacja - obiekt wewnętrzny QueryInterface() HRESULT stdcall CSimpleCalc::QueryInterface( REFIID riid, void **ppvobject) { HRESULT hr = S_OK; if (riid == IID_IUnknown) *ppvobject = (IUnknown*)(this); else if (riid == IID_ISimpleCalc) *ppvobject = (ISimpleCalc*)(this); else if (m_punkouter) hr= m_punkouter->queryinterface(riid,ppvobject); if (SUCCEEDED(hr)) ((IUnknown*)(*ppvObject))->AddRef(); return hr;

Agregacja - obiekt zewnętrzny AddRef(), Release() unsigned long stdcall CExtCalc::AddRef() { return punkinter->addref();; unsigned long stdcall CExtCalc::Release() { UINT refcount=punkinter->release(); if (refcount==0){ delete this; InterlockedDecrement( &g_nserverlockcount ); return 0; return refcount;

Agregacja - obiekt zewnętrzny CreateInstance() HRESULT stdcall CExtCalcClassFactory::CreateInstance( IUnknown *punkouter, REFIID riid, void **ppvobject ) { HRESULT hr; if (punkouter!=null) return E_NOAGREGATION; CExtCalc* pextcalc = new CExtCalc(); hr = pextcalc->init(); if (FAILED(hr)){ delete pextcalc; return hr; hr = pextcalc->queryinterface(riid, ppvobject); if (FAILED(hr)) delete pextcalc; return hr; HRESULT CExtCalc::Init() { return CoCreateInstance(CLSID_SimpleCalc, (IUnknown*)this, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&m_punknowninner);

Agregacja - obiekt zewnętrzny QueryInterface() HRESULT CAggregator::QueryInterface(REFIID riid, void** ppv) { if(riid == IID_IUnknown) { *ppv = (IUnknown*)this; else if(riid == IID_IExtCalc) { *ppv = (IExtCalc*)this; else if(riid == IID_ISimpleCalc) { return m_punknowninner->queryinterface(riid, ppv); else { *ppv = NULL; return E_NOINTERFACE; AddRef(); return S_OK;