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 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 e enumerazione, con il compilatore MIDL che genera rispettivamente TKIND_UNIONs e TKIND_ENUMs.
MIDL consente anche struct di tipo C, unione definizioni di enumerazione. Ad esempio, la definizione seguente è valida in MIDL:
struct my_struct { ... }; typedef struct my_struct your_struct;
Tipi di dati booleani
In MkTypLib, il booleano tipo di base e il tipo di dati MkTypLib BOOL equivalgono a VT_BOOL, che esegue il mapping a VARIANT_BOOL e che viene definito come breve. In MIDL, il tipo di base booleano equivale a VT_UI1, definito come char non firmatoe il tipo di dati BOOL è definito come long. Ciò comporta difficoltà se si combina la sintassi IDL e la sintassi ODL nello stesso file, pur cercando di mantenere la compatibilità con MkTypLib. Poiché i tipi di dati sono di dimensioni diverse, il codice di marshalling non corrisponderà a quanto 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:
Distinzione tra maiuscole e 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'attributopubblicoa un blocco di interfaccia, MkTypLib considera ogni typedef all'interno di tale blocco di interfaccia come pubblico. MIDL richiede di applicare in modo esplicito l'attributo pubblico 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 compila con MkTypLib e il typedef MOO dalla libreria B se si compila 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 linguaggio C void tipo di dati 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, /iide il marshalling dei tipi di dati OLE.