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.