Component Object Model (COM) - PowerPoint PPT Presentation

1 / 25
About This Presentation
Title:

Component Object Model (COM)

Description:

Component Object Model (COM) Cos COM? Tecnologia specifica della famiglia di sistemi operativi Windows che abilita la comunicazione fra i componenti software del ... – PowerPoint PPT presentation

Number of Views:123
Avg rating:3.0/5.0
Slides: 26
Provided by: Giova64
Category:
Tags: com | component | model | object

less

Transcript and Presenter's Notes

Title: Component Object Model (COM)


1
Component Object Model (COM)
2
Cosè COM?
  • Tecnologia specifica della famiglia di sistemi
    operativi Windows che abilita la comunicazione
    fra i componenti software del sistema
  • Teconologia component-based
  • Favorisce lo sviluppo di componenti riusabili
  • Permette di creare applicazioni connettendo fra
    loro inisiemi di componenti
  • Rende possibile luso e lo sviluppo di servizi
  • Si tratta di una famiglia di tecnologie che
    include
  • COM
  • DCOM
  • ActiveX

3
Brevi cenni storici
  • 1991 OLE (Object Linking and Embedding)
  • Basato su DDE (dynamic data exchange)
  • Dedicato principalmente al progetto di
    compound-documents (documenti costituiti di parti
    gestite da diverse applicazioni)
  • 1993 OLE2
  • COM viene introdotta come tecnologia di
    riferimento
  • Dedicato al progetto di componenti applicativi in
    genere
  • 1994 OCX (OLE Control Extension)
  • Estensioni COM per la creazione di componenti
    nella maggior parte dei linguaggi di
    programmazione
  • 1996 ActiveX
  • Estensione dei componenti OCX
  • Possono essere contenuti in pagine Web ed
    eseguiti nel browser
  • 1996 DCOM (distributed COM)
  • Oggi .NET

4
COM Principali caratteristiche
  • Standard binario per linvocazione di funzioni
    fra diversi componenti
  • Indipendenza dal linguaggio di programmazione
  • Interoperabilità fra componenti di diversi
    fornitori
  • Meccanismi di scoperta delle interfacce
    implementate dai componenti
  • Meccanismo per lidentificazione univoca dei
    componenti e delle interfacce
  • Permette trasparentemente la comunicazione fra
    componenti eseguiti nello stesso processo o in
    processi diversi
  • Disponibile su diverse piattaforme
  • Windows, Macintosh, Unix

5
Binary Standard
  • Oggetti COM elementi di codice eseguibile che
    forniscono servizi al resto del sistema
    (terminologia alternativa componenti, component
    object)
  • Il lay-out in memoria delle funzioni eseguibili è
    definito in modo standard per permettere
    linteroperabilità binaria
  • Una virtual table contiene i puntatori
    allimplementazione delle funzioni
  • La doppia indirettezza permette a multiple
    istanze di condividere la stessa virtual table

6
Interfacce
  • I componenti COM forniscono i propri servizi
    attraverso collezioni di funzioni dette
    interfacce
  • Un componente generalmente supporta un insieme di
    interfacce
  • Convenzionalmente il nome delle interfacce
    comincia con una I (i maiuscola) seguita da un
    ulteriore lettera maiuscola
  • IUnknown (supportata da tutti i componenti COM)
  • ILookup
  • IDropTarget
  • IDragSource
  • IUnEsempioDiInterfaccia
  • Un puntatore ad un componente COM è in effetti un
    puntatore ad uninterfaccia supportata dal
    componente
  • Es IUnknown pRef

7
Notazione grafica per i componenti COM
componente
Interfaccia implementata/supportata/esportata
8
Caratteristiche generalidelle interfacce
  • Uninterfaccia non è una classe
  • Solo metodi senza implementazione
  • Le interfacce non sono componenti
  • Piuttosto vengono implementate/supportate/esportat
    e dai componenti
  • Gli utilizzatori di un componente usano puntatori
    a interfacce (supportate dal componente)
  • I componenti COM possono implementare interfacce
    multiple
  • Le interfacce sono fortemente tipizzate
  • Le interfacce sono immutabili

9
GUID
  • COM garantisce lidentificazione univoca di
    interfacce e classi attraverso GUID
  • GUID Globally Unique Identifier
  • Numeri di 128 bit
  • Ogni GUID è garantito come unico nel mondo senza
    limiti di spazio e tempo
  • Lidentificatore GUID di un interfaccia è detto
    IID
  • Lidentificatore GUID di una classe è detto CLSID
  • I nomi simbolici sono usati solo per convenienza,
    ma lidentificazione reale di classi e interfacce
    avviene attraverso GUID
  • Esempio di GUID
  • DEFINE_GUID(IID_ILOOKUP, 0xc4910d71, 0xba7d,
    0x11cd, 0x94, 0xe8, 0x08, 0x00, 0x17, 0x01, 0xa8,
    0xa3)

10
Tool GuidGen
  • Tool distribuito con Windows SDK

11
Component Object Library
  • Parte del sistema operativo con cui si
    interagisce per gestire COM
  • Contiene le API principali per la creazione e la
    gestione dei componenti COM
  • Alcune API della COM library sono
  • HRESULT CoInitialize(LPVOID pvReserved)
  • Inizializzazione dellambiente di esecuzione COM
  • void CoUninitialize(void)
  • Chiusura della COM library e delle connessioni
    COM per il thread corrente

12
CoCreateInstance(COM Library)
  • HRESULT CoCreateInstance(
  • REFCLSID rclsid,
  • LPUNKNOWN pUnkOuter,
  • DWORD dwClsContext,
  • REFIID riid,
  • LPVOID ppv)
  • rclsid
  • CLSID della CoClass che implementa il componente
  • pUnkOuter
  • Serve per laggregazione di componenti. Per
    adesso useremo NULL
  • dwClsContext
  • Tipo di server COM da usare (in-process, local,
    remote) per ora useremo CLSCTX_INPROC_SERVER
  • riid
  • IID dellinterfaccia per usare il componente
  • ppv
  • Puntatore allinterfaccia restituito come
    risultato di CoCreateIntance

13
Un esempio
  • Il componente di sistema ActiveDesktop esporta i
    propri servizi attraverso linterfaccia
    IActiveDesktop
  • IID_IActiveDesktop
  • f490eb00-1240-11d1-9888-006097deacf9
  • CLSID_ActiveDesktop
  • 75048700-ef1f-11d0-9888-006097deacf9

14
IActiveDesktop (shlobj.h)
  • DECLARE_INTERFACE_( IActiveDesktop, IUnknown )
  • // IUnknown methods
  • STDMETHOD (QueryInterface)(THIS_ REFIID riid,
    void ppv) PURE
  • STDMETHOD_(ULONG, AddRef) ( THIS ) PURE
  • STDMETHOD_(ULONG, Release) ( THIS ) PURE
  • // IActiveDesktop methods
  • STDMETHOD (ApplyChanges)(THIS_ DWORD dwFlags)
    PURE
  • STDMETHOD (GetWallpaper)(THIS_ LPWSTR
    pwszWallpaper, UINT cchWallpaper, DWORD
    dwReserved) PURE
  • STDMETHOD (SetWallpaper)(THIS_ LPCWSTR
    pwszWallpaper, DWORD dwReserved) PURE
  • STDMETHOD (GetWallpaperOptions)(THIS_
    LPWALLPAPEROPT pwpo, DWORD dwReserved) PURE
  • STDMETHOD (SetWallpaperOptions)(THIS_
    LPCWALLPAPEROPT pwpo, DWORD dwReserved) PURE
  • STDMETHOD (GetPattern)(THIS_ LPWSTR
    pwszPattern, UINT cchPattern, DWORD dwReserved)
    PURE
  • STDMETHOD (SetPattern)(THIS_ LPCWSTR
    pwszPattern, DWORD dwReserved) PURE
  • STDMETHOD (GetDesktopItemOptions)(THIS_
    LPCOMPONENTSOPT pco, DWORD dwReserved) PURE
  • STDMETHOD (SetDesktopItemOptions)(THIS_
    LPCCOMPONENTSOPT pco, DWORD dwReserved) PURE
  • STDMETHOD (AddDesktopItem)(THIS_ LPCCOMPONENT
    pcomp, DWORD dwReserved) PURE
  • STDMETHOD (AddDesktopItemWithUI)(THIS_ HWND
    hwnd, LPCOMPONENT pcomp, DWORD dwReserved) PURE
  • STDMETHOD (ModifyDesktopItem)(THIS_
    LPCCOMPONENT pcomp, DWORD dwFlags) PURE

15
Uso del componente ActiveDesktop
  • include ltshlobj.hgt
  • HRESULT hr
  • IActiveDesktop pIAD
  • // creazione del componente
  • hr CoCreateInstance(CLSID_ActiveDesktop,
  • NULL,
  • CLSCTX_INPROC_SERVER,
  • IID_IActiveDesktop, (void)pIAD )
  • // uso del componente
  • hr pIAD-gtGetWallpaper(wszPath, MAX_PATH, 0)

16
HRESULT
  • Handle di un risultato in COM
  • Valore di 32 bit che segnala il risultato di un
    operazione
  • Usato dalle API della COM Library
  • Usato dai metodi delle interfacce COM
  • Si interpreta attraverso macro per scoprire il
    successo/fallimento
  • SUCCEEDED(hr)
  • Fa il check che il valore sia gt0
  • FAILED(hr)
  • Fa il check che il valore sia lt0
  • I valori specifici HRESULT danno informazioni
    sugli errori, e sono associati a corrispondenti
    messaggi testuali. Esempi
  • E_NOINTERFACE (0x80004002) No such interface
    supported.
  • CO_E_CREATEPROCESS_FAILURE (0x80004018) The
    server process could not be started. The
    pathname may be incorrect.
  • CO_E_NOTINITIALIZED (0x800401F0) - CoInitialize
    has not been called.

17
Error Lookup Tool
  • Parte di Visual Studio

18
Nota TecnicaUnicode String e Character string
  • COM gestisce le stringhe secondo la codifica
    Unicode
  • In Windows le stringhe Unicode corrispondono ad
    array di WCHAR
  • Per ottenere una stringa di caratteri ASCII
    (TCHAR in Windows), bisogna usare unAPI di
    conversione WideCharToMultiByte

19
WideCharToMultiByte
  • int WideCharToMultiByte(
  • UINT CodePage, //CP_ACP per ASCII
  • DWORD dwFlags, //trattamento dei caratteri
    composti
  • LPCWSTR lpWideCharStr, //la stringa Unicode da
    convertire
  • int cchWideChar, //lungh. stringa Unicode, -1 se
    null terminated
  • LPSTR lpMultiByteStr, //buffer di caratteri per
    il risultato
  • int cbMultiByte, //lungh del buffer di caratteri
    in byte
  • LPCSTR lpDefaultChar, //carattere di default
  • LPBOOL lpUsedDefaultChar) //indica uso del
    caratt. di default
  • Il trattamento dei caratteri composti (parametro
    dwFlags) è indicato dai seguenti possibili flag
  • WC_COMPOSITECHECK controllo sulla presenza di
    caratt. Composti
  • WC_SEPCHARS separa i caratteri composto in 2
    caratteri
  • WC_DISCARDNS scarta la seconda parte dei
    caratteri composti
  • WC_DEFAULTCHAR usa il carattere di default
    (parametro lpDefaultChar)

20
Linterfaccia IUnknown
  • Deve essere supportata da tutti i componenti
  • Tutte le interfacce derivano da IUnknown
  • interface IUnknown
  • virtual HRESULT QueryInterface(IID iid, void
    ppvObj) 0
  • virtual ULONG AddRef() 0
  • virtual ULONG Release() 0
  • Implementa le funzionalità essenziali di un
    componente
  • AddRef e Release per il conteggio dei riferimenti
  • QueryInterface per permettere agli utilizzatori
    di scoprire a runtime se una data interfaccia è
    supportata da un componente, e in caso positivo
    di ottenerne un riferimento

21
Reference Counting
  • Serve ad assicurare che i componenti (non le
    interfacce) rimangano vivi finché ci sono
    utilizzatori che hanno accesso ad una o più
    interfacce
  • I metodi AddRef e Release di IUnknown gestiscono
    il conteggio dei riferimenti
  • AddRef aggiunge un nuovo riferimento, viene
    invocata dalle funzioni che restituiscono
    riferimenti ad interfacce
  • Release deve essere invocata su un riferimento ad
    uninterfaccia quando quel riferimento non è più
    utilizzato
  • Se si fa una copia di un riferimento ad
    interfaccia bisogna invocare AddRef sul
    riferimento
  • Prestare molta attenzione alluso di AddRef e
    Release perché il meccanismo del conteggio dei
    riferimenti è fonte di molti errori con COM

22
QueryInterface
  • HRESULT QueryInterface(IID iid, void ppvObj)
  • iid
  • Interfaccia per la quale si richiede un
    riferimento
  • ppvObj
  • Riferimento allinterfaccia restituito come
    risultato di QueryInterface
  • Se il componente non supporta linterfaccia
    richiesta viene restituito un valore di ritorno
    (HRESULT) che segnala lerrore

23
EsempioComponente ShellLink (estratto)
  • ShellLink
  • Componente per la creazione di link simbolici
    (shortcut)
  • CLSID 0021401-0000-0000-C000-000000000046
  • Interfacce supportate
  • 000214ee-0000-0000-c000-000000000046 IShellLink
  • SetPath
  • 0000010b-0000-0000-c000-000000000046
    IPersistFile
  • Save

24
EsempioUso di ShellLink
  • HRESULT hr
  • IShellLink pISL
  • IPersistFile pIPF
  • hr CoCreateInstance(CLSID_ShellLink,
  • NULL,
  • CLSCTX_INPROC_SERVER,
  • IID_IShellLink,
  • (void)pISL)
  • hr pISL-gtSetPath(wszPath)
  • hr pISL-gtQueryInterface(IID_IPersistFile,
    (void)pIPF)
  • hr pIPF-gtSave(L"C\\wallpaper.lnk",FALSE)
  • pIPF-gtRelease()
  • pISL-gtRelease()

25
Componenti 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
Write a Comment
User Comments (0)
About PowerShow.com