Nel post precedente (Componenti COM: Le interfacce - parte 2 di 6) abbiamo introdotte la type library: qui dettaglieremo meglio come essa è costituita e i suoi utilizzi.
Interface Definition Language - IDL
Per descrivere quanto contenuto in una type library, e quindi tutte le informazioni descrittive legate ai componenti COM contenuti in un COM server, si usa il linguaggio IDL. In altri termini IDL è il "disassemblato" della type library, che normalmente è compilata insieme al COM Server o anche in un file separato, con estensione tlb.
Occorre dare uno sguardo, seppur sommario, a IDL, poichè non solo è un parte molto importante del mondo COM, ma anche perchè risulta essere interessante e poco oneroso carpirne la funzionalità generale.
Grazie all'utilizzo del programma OLE View (scaricabile dal sito M$ e facente parte dei vari ambienti di sviluppo) è possibile ottenere il codice IDL di quanto contenuto in un file tlb o anche di una dll/exe COM.
Per chiarezza espositiva introduco un esempio pratico che sarà usato anche nel seguito: un semplice COM component contenuto in un COM server di tipo dll, che serve per implementare una calcolatrice in grado di eseguire le operazioni fondamentali.
Codice VB6
Nome classe: InfPressapochista
Option Explicit Private Param01 As Integer Private Param02 As Integer
Public Sub Init(aParametro01 As Integer, aParametro02 As Integer)
Param01 = aParametro01 Param02 = aParametro02 End Sub Public Function Somma() As Integer
Somma = Param01 + Param02
End Function
Questa classe sarà la base di partenza per una calcolatrice, che sarà costituita da un progetto eseguibile che conterrà la UI (quindi una form) e utilizzerà come logica di funzionamento proprio questa classe. Una volta compilata la classe si otterrà la relativa dll, e, tramite il citato OLE View, è possibile ottenere il relativo listato IDL.
// Generated .IDL file (by the OLE/COM Object Viewer) // // typelib filename: InfPressapochista.dll [ uuid(FC2AF343-0C59-44BE-971B-DCDBC8D1D315), version(2.0) ] library ComServer { // TLib : // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046} importlib("stdole2.tlb"); // Forward declare all types defined in this typelib interface _InfPressapochista; [ odl, uuid(0D0D1CEC-5FBE-4326-9603-082D7593D0EC), version(1.0), hidden, dual, nonextensible, oleautomation ] interface _InfPressapochista : IDispatch { [id(0x60030002)] HRESULT Init( [in, out] short* aParametro01, [in, out] short* aParametro02); [id(0x60030003)] HRESULT Somma([out, retval] short* ); }; [ uuid(859E9833-D804-4EAD-962A-E8ED438BDA79), version(1.0) ] coclass InfPressapochista { [default] interface _InfPressapochista; }; };
Si può verifica dal listato che non c'è nulla di particolarmente strano o esotico.
L'interfaccia di default dell'unico COM component contenuto è _InfPressapochista, e in pratica è il nome assegnato dalla classe preceduto da un underscore: in pratica è l'insieme di tutti i metodi pubblici scritti dal programmatore.
L'interfaccia deriva da IDispatch: ogni interfaccia relativa a ogni eventuale classe ivi contenuta avrà la stessa caratteristica. Come è possibile vedere ad ogni metodo dell'interfaccia è inoltre assegnato un ID.
Grazie a questa due caratteristiche sarà possibile riferire una libreria usando il late binding o l'early binding, di cui accennerò nei prossimi post.
Vi aspetto alla prossima puntata !