Condividi tramite


Differenze tra MIDL e MkTypLib

Nota

Lo strumento Mktyplib.exe è obsoleto. Usare invece il compilatore MIDL.

 

Esistono alcune aree chiave in cui il compilatore MIDL differisce da MkTypLib. La maggior parte di queste differenze si presenta perché MIDL è orientato più verso la sintassi C rispetto a MkTypLib.

In generale, è consigliabile usare la sintassi MIDL nei file IDL. Tuttavia, se è necessario compilare un file ODL esistente o mantenere la compatibilità con MkTypLib, usare l'opzione del compilatore /mktyplib203 MIDL per forzare il comportamento di MIDL come Mkktyplib.exe, versione 2.03. Questa è l'ultima versione dello strumento MkTypLib. In particolare, l'opzione /mktyplib203 risolve queste differenze:

  • Sintassi typedef per tipi di dati complessi

    In MkTypLib entrambe le definizioni seguenti generano un TKIND_RECORD per "this_struct" nella libreria dei tipi. Il tag "struct_tag" è facoltativo e, se usato, non verrà visualizzato nella libreria dei tipi.

    typedef struct struct_tag { ... } this_struct;
    typedef struct { ... } that_struct;
    

    Se manca un tag facoltativo, MIDL lo genererà, aggiungendo in modo efficace un tag alla definizione fornita dall'utente. Poiché la prima definizione ha un tag, MIDL genererà un TKIND_RECORD per "this_struct" e un TKIND_ALIAS per "this_struct" (definendo "this_struct" come alias per "struct_tag"). Poiché il tag manca nella seconda definizione, MIDL genererà un TKIND_RECORD per un nome mangled, interno a MIDL, che non è significativo per l'utente e un TKIND_ALIAS per "that_struct".

    Ciò ha potenziali implicazioni per i browser della libreria dei tipi che mostrano semplicemente il nome di un record nell'interfaccia utente. Se si prevede che un TKIND_RECORD abbia un nome reale, i nomi non riconoscibili potrebbero essere visualizzati nell'interfaccia utente. Questo comportamento si applica anche alle definizioni di unione ed enumerazione , con il compilatore MIDL che genera rispettivamente TKIND_UNIONs e TKIND_ENUMs.

    MIDL consente anche definizioni di struct, unione ed enumerazione di tipo C. Ad esempio, la definizione seguente è valida in MIDL:

    struct my_struct { ... };
    typedef struct my_struct your_struct;
    
  • tipi di dati Boolean

    In MkTypLib, il tipo di base booleano e il tipo di dati MkTypLib BOOL equivalgono a VT_BOOL, che esegue il mapping a VARIANT_BOOL e che è definito come breve. In MIDL, il tipo di base booleano equivale a VT_UI1, definito come carattere senza segno e il tipo di dati BOOL è definito come long. Ciò comporta difficoltà se si combina la sintassi IDL e la sintassi ODL nello stesso file mentre si tenta di mantenere la compatibilità con MkTypLib. Poiché i tipi di dati sono di dimensioni diverse, il codice di marshalling non corrisponde a quello descritto nelle informazioni sul tipo. Se si desidera un VT_BOOL nella libreria dei tipi, è consigliabile usare il tipo di dati VARIANT_BOOL.

  • Definizioni GUID nei file di intestazione

    In MkTypLib i GUID vengono definiti nel file di intestazione con una macro che può essere compilata in modo condizionale per generare una predefinita GUID o un GUID di cui è stata creata un'istanza. MIDL in genere inserisce le predefinite GUID nei file di intestazione generati e nelle istanze GUID solo nel file generato dall'opzione /iid .

Le differenze seguenti nel comportamento non possono essere risolte usando l'opzione /mktyplib203 :

  • Maiuscole/minuscole

    MIDL fa distinzione tra maiuscole e minuscole, l'automazione OLE non è.

  • Ambito dei simboli in una dichiarazione di enumerazione

    In MkTypLib l'ambito dei simboli in un'enumerazione è locale. In MIDL l'ambito dei simboli in un'enumerazione è globale, come in C. Ad esempio, il codice seguente verrà compilato in MkTypLib, ma genererà un errore di nome duplicato in MIDL:

    typedef struct { ... } a;
    enum {a=1, b=2, c=3};
    
  • Ambito dell'attributo pubblico

    Se si applica l'attributo pubblico a un blocco di interfaccia, MkTypLib considera ogni typedef all'interno di tale blocco di interfaccia come pubblico. MIDL richiede che l'attributo pubblico sia applicato in modo esplicito a tali typedef che si desidera pubblici.

  • Ordine di ricerca importlib

    Se si importano più librerie dei tipi e se queste librerie contengono riferimenti duplicati, MkTypLib lo risolve usando il primo riferimento trovato. MIDL userà l'ultimo riferimento trovato. Ad esempio, data la sintassi ODL seguente, la libreria C userà il typedef MOO dalla libreria A se si esegue la compilazione con MkTypLib e il typedef MOO dalla libreria B se si esegue la compilazione con MIDL:

    [...]library A
    {
        typedef struct tagMOO
        {...}MOO
    }
    
    [...]library B
    {
        typedef struct tagMOO
        {...} MOO
    }
    
    [...]library C
    {
        importlib (A.TLB)
        importlib (B.TLB)
        typedef struct tagBAA
        {MOO y;}BAA
    }
    

    La soluzione alternativa appropriata consiste nel qualificare ogni riferimento di questo tipo con il nome corretto della libreria di importazione, come illustrato di seguito:

    typedef struct tagBAA
        {A.MOO y;}BAA
    
  • Tipo di dati VOID non riconosciuto

    MIDL riconosce il tipo di dati void del linguaggio C e non riconosce il tipo di dati OLE Automation VOID. Se si dispone di un file ODL che usa VOID, inserire questa definizione all'inizio del file:

#define VOID void '''

  • Notazione esponenziale

    MIDL richiede che i valori espressi nella notazione esponenziale siano contenuti tra virgolette. Ad esempio, "-2.5E+3"

  • Valori e costanti LCID

    In genere MIDL non considera l'LCID durante l'analisi dei file. Per forzare questo comportamento per un valore o se è necessario usare la notazione specifica delle impostazioni locali quando si definisce una costante, racchiudere il valore o la costante tra virgolette.

Per altre informazioni, vedere /mktyplib203, /iid e Marshalling dei tipi di dati OLE.