Dela via


Skillnader mellan MIDL och MkTypLib

Not

Verktyget Mktyplib.exe är föråldrat. Använd MIDL-kompilatorn i stället.

 

Det finns några viktiga områden där MIDL-kompilatorn skiljer sig från MkTypLib. De flesta av dessa skillnader uppstår eftersom MIDL är mer inriktat på C-syntax än MkTypLib.

I allmänhet vill du använda MIDL-syntaxen i dina IDL-filer. Men om du behöver kompilera en befintlig ODL-fil eller på annat sätt upprätthålla kompatibilitet med MkTypLib använder du alternativet /mktyplib203 MIDL-kompilator för att tvinga MIDL att bete sig som Mkktyplib.exe, version 2.03. (Det här är den sista versionen av verktyget MkTypLib.) Mer specifikt löser alternativet /mktyplib203 dessa skillnader:

  • typedef-syntax för komplexa datatyper

    I MkTypLib genererar båda följande definitioner en TKIND_RECORD för "this_struct" i typbiblioteket. Taggen "struct_tag" är valfri och visas inte i typbiblioteket om den används.

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

    Om en valfri tagg saknas genererar MIDL den, vilket effektivt lägger till en tagg i definitionen som tillhandahålls av användaren. Eftersom den första definitionen har en tagg genererar MIDL en TKIND_RECORD för "this_struct" och en TKIND_ALIAS för "this_struct" (definiera "this_struct" som ett alias för "struct_tag"). Eftersom taggen saknas i den andra definitionen genererar MIDL en TKIND_RECORD för ett manglat namn, internt för MIDL, som inte är meningsfullt för användaren och en TKIND_ALIAS för "that_struct".

    Detta har potentiella konsekvenser för typbibliotekswebbläsare som helt enkelt visar namnet på en post i användargränssnittet. Om du förväntar dig att en TKIND_RECORD ska ha ett verkligt namn kan oigenkännliga namn visas i användargränssnittet. Det här beteendet gäller även för union och uppräkning definitioner, där MIDL-kompilatorn genererar TKIND_UNIONs respektive TKIND_ENUMs.

    MIDL tillåter även struct i C-stil, unionoch uppräkning definitioner. Följande definition är till exempel laglig i MIDL:

    struct my_struct { ... };
    typedef struct my_struct your_struct;
    
  • Booleska datatyper

    I MkTypLib motsvarar boolesk bastyp och MkTypLib-datatypen BOOL VT_BOOL, som mappar till VARIANT_BOOL och som definieras som en kort. I MIDL motsvarar den booleska bastypen VT_UI1, som definieras som ett osignerat teckenoch BOOL-datatypen definieras som en lång. Detta leder till problem om du blandar IDL-syntax och ODL-syntax i samma fil samtidigt som du försöker upprätthålla kompatibiliteten med MkTypLib. Eftersom datatyperna är olika storlekar matchar inte marskalkeringskoden det som beskrivs i typinformationen. Om du vill ha en VT_BOOL i typbiblioteket bör du använda datatypen VARIANT_BOOL.

  • GUID-definitioner i huvudfiler

    I MkTypLib definieras GUID:er i rubrikfilen med ett makro som kan kompileras villkorligt för att generera antingen en GUID-fördefinition eller en instansierad GUID. MIDL placerar normalt GUID-fördefinitioner i sina genererade huvudfiler och GUID-instansieringar endast i filen som genereras av växeln /iid.

Följande skillnader i beteende kan inte lösas med hjälp av växeln /mktyplib203:

  • Skiftlägeskänslighet

    MIDL är skiftlägeskänsligt, det är inte OLE Automation.

  • Omfång för symboler i en uppräkningsdeklaration

    I MkTypLib är omfånget för symboler i ett uppräkning lokalt. I MIDL är omfånget för symboler i ett uppräkning globalt, precis som i C. Följande kod kompileras till exempel i MkTypLib, men genererar ett duplicerat namnfel i MIDL:

    typedef struct { ... } a;
    enum {a=1, b=2, c=3};
    
  • Omfång för offentligt attribut

    Om du använder attributet offentliga på ett gränssnittsblock behandlar MkTypLib varje typedef i gränssnittsblocket som offentligt. MIDL kräver att du uttryckligen tillämpar attributet offentliga på de typedefs som du vill ha offentliga.

  • Importlib-sökordning

    Om du importerar fler än ett typbibliotek, och om dessa bibliotek innehåller dubbletter av referenser, löser MkTypLib detta med hjälp av den första referensen som hittas. MIDL använder den sista referensen som hittas. Med följande ODL-syntax använder till exempel bibliotek C MOO typedef från bibliotek A om du kompilerar med MkTypLib och MOO typedef från bibliotek B om du kompilerar med 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
    }
    

    Den lämpliga lösningen för detta är att kvalificera varje sådan referens med rätt importbiblioteksnamn, så här:

    typedef struct tagBAA
        {A.MOO y;}BAA
    
  • VOID-datatypen känns inte igen

    MIDL identifierar C-språket void datatyp och känner inte igen OLE Automation VOID-datatypen. Om du har en ODL-fil som använder VOID placerar du den här definitionen överst i filen:

#define VOID void '''

  • Exponentiell notation

    MIDL kräver att värden som uttrycks i exponentiell notation finns inom citattecken. Till exempel "-2.5E+3"

  • LCID-värden och konstanter

    Normalt tar MIDL inte hänsyn till LCID vid parsning av filer. Om du vill tvinga fram det här beteendet för ett värde, eller om du behöver använda språkspecifik notation när du definierar en konstant, omsluter du värdet eller konstanten inom citattecken.

Mer information finns i /mktyplib203, /iidoch Marshaling OLE Data Types.