Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Notitie
Het hulpprogramma Mktyplib.exe is verouderd. Gebruik in plaats daarvan de MIDL-compiler.
Er zijn enkele belangrijke gebieden waarin de MIDL-compiler verschilt van MkTypLib. De meeste van deze verschillen ontstaan omdat MIDL meer gericht is op C-syntaxis dan MkTypLib.
Over het algemeen wilt u de MIDL-syntaxis in uw IDL-bestanden gebruiken. Als u echter een bestaand ODL-bestand moet compileren of de compatibiliteit met MkTypLib op een andere manier moet onderhouden, gebruikt u de optie /mktyplib203 MIDL-compiler om ERVOOR te zorgen dat MIDL zich gedraagt als Mkktyplib.exe, versie 2.03. (Dit is de laatste release van het MkTypLib-hulpprogramma.) Met name de optie /mktyplib203 lost deze verschillen op:
typedef-syntaxis voor complexe gegevenstypen
In MkTypLib genereren beide definities een TKIND_RECORD voor 'this_struct' in de typebibliotheek. De tag 'struct_tag' is optioneel en, indien gebruikt, wordt niet weergegeven in de typebibliotheek.
typedef struct struct_tag { ... } this_struct; typedef struct { ... } that_struct;Als een optionele tag ontbreekt, genereert MIDL deze, zodat er effectief een tag wordt toegevoegd aan de definitie die door de gebruiker is opgegeven. Omdat de eerste definitie een tag heeft, genereert MIDL een TKIND_RECORD voor 'this_struct' en een TKIND_ALIAS voor 'this_struct' (het definiëren van 'this_struct' als een alias voor 'struct_tag'). Omdat de tag ontbreekt in de tweede definitie, genereert MIDL een TKIND_RECORD voor een beheerde naam, intern voor MIDL, die niet zinvol is voor de gebruiker en een TKIND_ALIAS voor 'that_struct'.
Dit heeft mogelijke gevolgen voor typen bibliotheekbrowsers die simpelweg de naam van een record in hun gebruikersinterface weergeven. Als u verwacht dat een TKIND_RECORD een echte naam heeft, kunnen onherkenbare namen worden weergegeven in de gebruikersinterface. Dit gedrag is ook van toepassing op samenvoeging en definities, waarbij de MIDL-compiler respectievelijk TKIND_UNIONs en TKIND_ENUMs genereert.
MET MIDL kunt u ook struct, samenvoegingen definities opsommen. De volgende definitie is bijvoorbeeld legaal in MIDL:
struct my_struct { ... }; typedef struct my_struct your_struct;Booleaanse gegevenstypen
In MkTypLib zijn het Booleaanse basistype en het gegevenstype MkTypLib gelijk aan VT_BOOL, die is toegewezen aan VARIANT_BOOL en die is gedefinieerd als een korte. In MIDL is het Booleaanse basistype gelijk aan VT_UI1, die is gedefinieerd als een niet-ondertekende tekensen het BOOL-gegevenstype wordt gedefinieerd als een lange. Dit leidt tot problemen als u IDL-syntaxis en ODL-syntaxis in hetzelfde bestand combineert terwijl u nog steeds de compatibiliteit met MkTypLib probeert te behouden. Omdat de gegevenstypen verschillende grootten hebben, komt de marshaling-code niet overeen met wat wordt beschreven in de typegegevens. Als u een VT_BOOL in uw typebibliotheek wilt, moet u het VARIANT_BOOL gegevenstype gebruiken.
GUID-definities in headerbestanden
In MkTypLib worden GUID's gedefinieerd in het headerbestand met een macro die voorwaardelijk kan worden gecompileerd om een GUID-predefinition of een geïnstantieerde GUID te genereren. NORMAAL GESPROKEN plaatst MIDL GUID-predefinitions in de gegenereerde headerbestanden en GUID-instantiëringen alleen in het bestand dat is gegenereerd door de /iid switch.
De volgende verschillen in gedrag kunnen niet worden opgelost met behulp van de /mktyplib203 switch:
Hoofdlettergevoeligheid
MIDL is hoofdlettergevoelig, OLE Automation niet.
Bereik van symbolen in een opsommingsdeclaratie
In MkTypLib is het bereik van symbolen in een enum lokaal. In MIDL is het bereik van symbolen in een enum globaal, net als in C. De volgende code wordt bijvoorbeeld gecompileerd in MkTypLib, maar genereert een dubbele naamfout in MIDL:
typedef struct { ... } a; enum {a=1, b=2, c=3};Bereik van openbaar kenmerk
Als u het kenmerk openbare toepast op een interfaceblok, behandelt MkTypLib elke typedef in dat interfaceblok als openbaar. MIDL vereist dat u het kenmerk openbare expliciet toepast op de typedefs die u openbaar wilt maken.
Importlib-zoekvolgorde
Als u meer dan één typebibliotheek importeert en deze bibliotheken dubbele verwijzingen bevatten, lost MkTypLib dit op met behulp van de eerste verwijzing die wordt gevonden. MIDL gebruikt de laatste verwijzing die wordt gevonden. Op basis van de volgende ODL-syntaxis gebruikt bibliotheek C bijvoorbeeld de MOO-typedef uit bibliotheek A als u compileert met MkTypLib en de MOO-typedef uit bibliotheek B als u compileert met 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 }De juiste tijdelijke oplossing hiervoor is om elk van deze verwijzingen te kwalificeren met de juiste naam van de importbibliotheek, zoals deze:
typedef struct tagBAA {A.MOO y;}BAAONGELDIG gegevenstype niet herkend
MIDL herkent de C-taal ongeldig gegevenstype en herkent het gegevenstype OLE Automation VOID niet. Als u een ODL-bestand hebt dat GEBRUIKMAAKT van VOID, plaatst u deze definitie boven aan het bestand:
#define VOID void '''
Exponentiële notatie
MIDL vereist dat waarden die in exponentiële notatie worden uitgedrukt, tussen aanhalingstekens worden opgenomen. Bijvoorbeeld '-2.5E+3'
LCID-waarden en -constanten
Normaal gesproken beschouwt MIDL de LCID niet bij het parseren van bestanden. Als u dit gedrag voor een waarde wilt afdwingen of als u landinstellingenspecifieke notatie moet gebruiken bij het definiëren van een constante, plaatst u de waarde of constante tussen aanhalingstekens.
Zie voor meer informatie /mktyplib203, /iiden Marshaling OLE-gegevenstypen.