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 !