Componenti COM. Componenti COM (COM server) Un Componente COM implementa ed esporta un insieme di Interfacce (oltre a IUnknown) Limplementazione delle.

Slides:



Advertisements
Presentazioni simili
Introduzione al linguaggio C++
Advertisements

Progettazione dei Sistemi Interattivi (A.A. 2004/05) - Lezione 2 1 Progettazione e Sviluppo di Software ad Oggetti 4 OBJECT-ORIENTED ANALYSIS Processo.
Costruttori e Distruttori
Recupero debito quarto anno Primo incontro
Consumare Web Service Andrea Saltarello
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Classi ed Oggetti in Java (Cenni). Richiami Ruolo delle Classi in Java Oggetti.
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
Metodologie di Programmazione = decomposizione basata su astrazioni
Liste Ordinate 3 Maggio Ultima Lezione Abbiamo visto i tipi di dato astratti IntList e StringList Realizzano liste di interi e di stringhe Realizzati.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Java2 Esercitazioni del corso di Sistemi Informativi Marina Mongiello
GLUT & OpenGL Ing. Tommaso Coviello Politecnico di Bari
DLL: Dynamic Linking Library
Component Object Model (COM) & Distributed COM (DCOM) Appunti di Windows & Dynamic Data Exchange (DDE) (1987) Object Linking and Embedding 1 (OLE 1) &
Fondamenti di Informatica
XmlBlackBox La presentazione Alexander Crea 7 Giugno 2010 La presentazione Alexander Crea 7 Giugno 2010.
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
Distributed Object Computing
1 Basi di dati e Web Prof. Stefano Paraboschi Prof. Barbara Pernici.
1 Programmazione ad oggetti in Java E.Mumolo, DEEI
Specifiche senza JML: uso delle asserzioni. 2 Asserzioni in Java Dal jdk 1.4 (da Febbraio 2002) cè meccanismo per gestire asserzioni Asserzione: espressione.
Derivazione tra classi
Perché.Net e non più COM/DCOM ? Superamento dei problemi di COM: Richiede una infrastruttura "non semplice" da ogni applicazione (ad esempio Class Factory.
Gestione dei Progetti Software 2 (a.a. 2004/05) - Lezione 3 1 JAVA e Internet: il World Wide Web Internet: milioni di computer collegati fra di loro attraverso.
Ingegneria del software I
Programmazione Corso di laurea in Informatica
Approfondimento delle classi
Le classi Definizione di classe Attributi e metodi di una classe Costruttori e distruttori Private e public Funzioni friend Il puntatore this.
Introduzione ad ASP.net
LA DOCUMENTAZIONE È noto che un buon programma dovrebbe essere ben documentato.. ma lesperienza insegna che quasi mai ciò viene fatto! –non cè tempo, ci.
OGGETTI COMPOSTI Una classe può contenere riferimenti a altre classi (o anche a se stessa): public class Orologio { Counter ore, minuti; } Loggetto Orologio.
GESTIONE DEGLI ERRORI Spesso vi sono istruzioni critiche, che in certi casi possono produrre errori. Lapproccio classico consiste nellinse- rire controlli.
IL TEMA DELLA RIUSABILITÀ Si vuole riusare tutto ciò che può essere riusato (componenti, codice, astrazioni) Non è utile né opportuno modificare codice.
C# LE BASI 2007 Prima lezione - Introduzione.
Concorrenza e Sincronizzazione di Thread e Processi
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
1 Programmazione = decomposizione basata su astrazioni (con riferimento a Java)
Introduzione a C#.
Introduzione alla programmazione Object Oriented
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti dispense prof. G. Levi.
BIOINFO3 - Lezione 331 SUBROUTINE IN PERL Una subroutine (funzione, metodo, procedura o sottoprogramma), e` una prozione di codice all`interno di un programma.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 5 (Deitel) Le funzioni Indice degli argomenti Introduzione Moduli nei programmi C 5.3.
ASP – Active Server Pages - 1 -Giuseppe De Pietro Introduzione ASP, acronimo di Active Server Pages, sta ad indicare una tecnologia per lo sviluppo di.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Programmazione in linguaggio C
Programmazione ad oggetti
Introduzione a Javascript
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 7 Tipi di dato e strutture dati Specifica e realizzazione di strutture informative come classi.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
1 Eccezioni in Java. 2 Ricordiamo che 4 una procedura può terminare –normalmente, ritornando un risultato –in modo eccezionale ci possono essere diverse.
TW Asp - Active Server Pages Nicola Gessa. TW Nicola Gessa Introduzione n Con l’acronimo ASP (Active Server Pages) si identifica NON un linguaggio di.
Ripasso su Java. Introduzione Per risolvere problemi complessi, i linguaggi di programmazione forniscono costrutti per realizzare nuove funzioni che trasformino.
Operatori di incremento e decremento
Liste Concatenate 11 Aprile E’ una delle strutture dati fondamentali in tutti i linguaggi di programmazione di alto livello Una Lista Concatenata.
Component Object Model (COM). Cos’è COM? Tecnologia specifica della famiglia di sistemi operativi Windows che abilita la comunicazione fra i componenti.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
Progettare una classe 21 Febbraio La classe BankAccount Vogliamo realizzare una classe i cui oggetti sono dei semplici conti bancari. * Identifichiamo.
1 Remote Procedure Call Corso di Sistemi di Elaborazione delle Informazioni a.a 2007/2008 Autori: Alberto Colombo Fulvio Frati.
LIP: 11 Maggio 2007 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Esercitazione del 9 marzo 2007 Ereditarieta’. Richiami Definire sottoclassi (ereditarieta’) Overriding Specificatori di accesso (private, protected) Principio.
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
LIP: 15 Marzo 2005 Vettori di interi. Esercizio proposto Definire una classe VectorInt i cui oggetti sono vettori omogenei di interi ordinati in modo.
1 Java secondo contatto Nel tunnel una luce…. 2 Esercizio - Contatore Definire la classe Contatore con le seguenti caratteristiche:  Il metodo getValore.
Fondamenti di informatica T-A Esercitazione 3 : Classi, metodi, visibilità, metodi statici AA 2012/2013 Tutor : Domenico Di Carlo.
Corso di Algoritmi e Strutture Dati con Laboratorio Richiami di Java – parte II.
Introduzione alle Classi e agli Oggetti in Java 1.
Transcript della presentazione:

Componenti COM

Componenti COM (COM server) Un Componente COM implementa ed esporta un insieme di Interfacce (oltre a IUnknown) Limplementazione delle interfacce è fornita da un insieme di CoClass Ogni CoClass è univocamente identificata da un CLSID Le CoClass di un componente sono contenute nel file eseguibile del componente (per esempio Dll o Exe) In Windows i CLSID delle CoClass dei componenti disponibili sono registrate nel Registry di sistema

Creazione di un server COM locale (server in un file.exe) Passi necessari 1.Definire le interfacce specifiche del componente 2.Definire i parametri delle CoClass del componente 3.Fornire limplementazione delle interfacce esportate dal componente 4.Fornire una class factory per creare le istanze del componente quando richieste dai client 5.Implementare lentry point (main) del server 6.Impostare il registry per lattivazione del componente

Passo 1 Interfaccia del componente IDL è un linguaggio che permette di definire interfacce e librerie di tipi (contenenti CoClass) Attributi IDL –Identificano le caratteristiche delle interfacce/CoClass –Attributo [uuid]: definisce gli IID o CLSID –Attributo [oleautomation]: definisce che linterfaccia sarà usata per comunicazione inter-processi –Attributo [version]: definisce il numero di versione –Attributo [helpstring]: descrizione testuale –(per altri attributi vedere US/library/8tesw2eh(VS.80).aspx) US/library/8tesw2eh(VS.80).aspx MIDL (Microsoft IDL compiler) permette di compilare linterfaccia. Genera 3 file – _h.h: Contiene le definizioni delle interfacce (da usare come header file) – _i.c: Contiene gli IID e CLSID (usare in tutti I server e client) – _p.c: Contiene il codice di proxy/stub per client-server distribuiti

Interfaccia IDL (esempio) [uuid(5C6CD72C-8FDE BE-B2BB2D4110CB), version(1.0), oleautomation, helpstring("Interfaccia IMyCounter")] interface IMyCounter : IUnknown { HRESULT Reset( [in] int val); HRESULT Inc( ); HRESULT GetVal( [out,retval] int* val); }; Le specifiche sui parametri di input/output sono necessarie per la corretta implementazione della comunicazione fra i processi (eventualmente in rete)

Passo 2. Type Library Una TypeLibrary contiene informazioni sulle CoClass incluse nel componente e le interfacce da esse implementate [uuid(2EBFC E-41f5-B80B-98BDCDD8AD96), version(1.0), helpstring("TypeLib contenente il server locale (coclass) dei componenti MyCounter")] library CounterLocalServerLib { importlib("stdole32.tlb"); [uuid(34898D9A-B306-42ee C2B151)] coclass MyCounter { [default]interface IMyCounter; };

Passo 3 (i/iii) Implementazione del componente Implementazione di tutte le funzionalità esportate dalle interfacce del componente Può essere realizzata in un qualsiasi linguaggio facendo riferimento agli IID e CLSID definiti in IDL Limplementazione può consistere di uno o più moduli indipendentemente dal numero delle interfacce implementate Va sempre implementata anche linterfaccia IUnknown

Passo 3 (ii/iii): Esempio in C++ class MyCounter : public IMyCounter { public: MyCounter(); virtual ~MyCounter(); // Metodi per implementare IUnknown STDMETHODIMP QueryInterface(REFIID riid, void** pIFace); STDMETHODIMP_(DWORD)AddRef(); STDMETHODIMP_(DWORD)Release(); // Metodi per implmentare IMyCounter STDMETHODIMP Reset(int val); STDMETHODIMP Inc(); STDMETHODIMP GetVal(int* val); private: DWORD m_refCount; int val; };

Passo 3 (iii/iii) Implementazione di QueryInterface STDMETHODIMP MyCounter::QueryInterface(REFIID riid, void** pIFace){ if (riid == IID_IUnknown) *pIFace = this ; else if (riid == IID_IMyCounter) *pIFace = this ; else { *pIFace = NULL; return E_NOINTERFACE ; } ( (IUnknown*) (*pIFace) )->AddRef(); return S_OK ; }

Passo 4. Class Factory La class factory è necessarie per poter creare più istanze dello stesso componente per richieste provenienti da client diversi Le class factory implementano linterfaccia standard IClassFactory class MyCounterClassFactory : public IClassFactory { public: MyCounterClassFactory(); virtual ~MyCounterClassFactory(); // IUnknown …… // IClassFactory STDMETHODIMP LockServer(BOOL fLock); STDMETHODIMP CreateInstance(LPUNKNOWN pUnkOuter,REFIID riid,void** ppv); private: ULONG m_refCount; };

Passo 5. Server Entry Point Main che viene eseguito quando viene lanciato leseguibile del server –Registra tutti i tipi del componente (CLSID e IID) nel registry di sistema (LoadTypeLibEx) –Crea gli oggetti ClassFactory per ogni componente gestito dal server e li registra nel sistema (CoRegisterClassObject) in modo che possano essere trovato attraverso CoGetClassObject –Rimane in attesa che il client smetta di usarlo client

Server object counting Il server viene attivato da COM quando un client fa richiesta Il server deve rimanere attivo fino a quando almeno un client sta usando almeno un oggetto residente sul server, poi terminare Per questo motivo, il server conta gli oggetti attivi (usati dai client), e quando il contatore va a 0 termina –La terminazione può per esempio avvenire attraverso un messaggio che interrompe il ciclo di attesa (o attraverso altre primitive di sincronizzazione)

Object counting e reference counting Lobject counting è di solito associato alla costruzione/distruzione degli oggetti –Per ogni nuovo oggetto creato, si incrementa il contatore di 1 –Per ogni oggetto distrutto lo si decrementa di 1 A sua volta, la distruzione degli oggetti è regolata dal meccanismo di reference counting (AddRef-Release) –Quando viene rilasciato lultimo reference, loggetto viene distrutto

Class Factory e Reference Counting Per le class factory lincremento del contatote di reference (AddRef) effettuato in fase di registrazione (CoRegisterClassObject) non sarebbe mai controbilanciato, rendendo così impossibile terminare il server quando non è più usato da nessun client Soluzione –Non uso reference counting per le class factory (annullando così leffetto problematico di CoRegisterClassObject) –Quando una class factory viene richiesta per la prima volta con CoGetClassObject, COM invoca IClassFactory::LockServer(TRUE) –Com gestisce il reference counting relativo al client, attraverso un oggetto proxy, e quando viene rilasciato lultimo riferimento invoca ICLassFactory::LockServer(FALSE) Quindi –Non cè bisogno di usare reference counting, perché viene gestito automaticamente da COM –Il contatore degli oggetti sul server può essere gestito opportunamente attraverso IClassFactory::LockServer

Passo 6. Impostazioni per lattivazione del componente Nel Registry di sistema va registrata lassociazione fra CLSID principale del server e file eseguibile che va lanciato per attivare il server Bisogna creare opportune chiavi sotto HKEY_CLASSES_ROOT per registrare –Lassociazione fra CLSID del server, e il per percorso del file eseguibile –Lassociazione fra LIBID della TypeLib e il percorso del file contenente la typeLib –Lassociazione fra gli IID delle interfacce e le proprietà delle stesse

Meccanismi di riuso in COM In COM esistono due principali forme di riuso di componenti (e delle loro interfacce) per implementare nuovi componenti –Delega (delegation) –Aggregazione (aggregation)

Riuso attraverso delega Si riusano i servizi di un componente esistente per implementare alcune funzionalità di un nuovo componente

Delega: cenni allimplementazione e alluso Il componente esterno (outer object) è client del componente interno (inner object) Generalmente, il componente interno non è visibile allesterno Limplementazione del componente esterno controlla il ciclo di vita del componente interno –definisce un puntatore al componente interno –crea il componente interno quando opportuno (per esempio in fase di creazione del componente esterno) –usa il componente interno attraverso le opportune interfacce –Rilascia il componente interno quando opportuno (per esempio quando viene rilasciato il componente esterno) In questo modo è inoltre possibile –usare le interfacce del componente esistente come base per implementare le medesime interfacce nel nuovo componente –aggiungere (se necessario) codice prima e/o dopo linvocazione dei metodi del componente esistente

Riuso attraverso aggregazione Si espongono le interfacce di un componente esistente come parte di un nuovo componente senza modificarne il comportamento

Aggregazione: cenni allimplementazione e alluso Il componente interno viene creato in modo da delegare le chiamate a IUnknown allinterfaccia IUnknown del componente esterno Il metodo QueryInterface del componente esterno restituisce (per le opportune interfacce) un puntatore al componente interno In questo modo è possibile –usare lo stesso esatto comportamento di un componente esistente senza conoscerne i dettagli comportamentali –evitare il codice di delega dei servizi –aumentare le prestazioni evitando troppe chiamate di procedura annidate

Aggregazione: creazione del componente interno (cenni) Attraverso i metodi di creazione della COM library (CoCreateInstance, CoGetClassObject, IClassFactory::CreateInstance) –Tali metodi ricevono un puntatore (pUnkOuter) allinterfaccia IUnknown cui delegare le chiamate –Lidea è di usare tale parametro in modo che, se il puntatore pUnkOuter è diverso da NULL, le chiamate vengano delegate alloggetto da esso puntato Limplementazione dei componenti deve tenere opportunamente conto del puntatore pUnkOuter affinché il componente sia aggregabile Tenere conto dellaggregabilità costa poche linee di codice (circa 10) quindi è generalmente consigliato nellimplementazione del componente

Alcuni riferimenti utili Principali Interfacce COM – url=/library/en-us/com/html/aa9b11ae ff-afe7-00c34bd235e3.asphttp://msdn.microsoft.com/library/default.asp? url=/library/en-us/com/html/aa9b11ae ff-afe7-00c34bd235e3.asp