Sdílet prostřednictvím


Rozdíly mezi MIDL a MkTypLib

Poznámka

Nástroj Mktyplib.exe je zastaralý. Místo toho použijte kompilátor MIDL.

 

Existuje několik klíčových oblastí, ve kterých se kompilátor MIDL liší od MkTypLib. Většina těchto rozdílů vzniká, protože MIDL je orientovaný spíše na syntaxi jazyka C než MkTypLib.

Obecně platí, že v souborech IDL budete chtít použít syntaxi MIDL. Pokud ale potřebujete zkompilovat existující soubor ODL nebo jinak zachovat kompatibilitu s MkTypLib, použijte /mktyplib203 možnost kompilátoru MIDL, aby se midL chovala jako Mkktyplib.exe, verze 2.03. (Toto je poslední verze nástroje MkTypLib.) Konkrétně možnost /mktyplib203 řeší tyto rozdíly:

  • Syntaxe typedef pro komplexní datové typy

    V MkTypLib v knihovně typů vygenerují obě následující definice TKIND_RECORD pro "this_struct". Značka "struct_tag" je volitelná a v případě použití se v knihovně typů nezobrazí.

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

    Pokud volitelná značka chybí, MIDL ji vygeneruje a efektivně přidá značku do definice zadané uživatelem. Vzhledem k tomu, že první definice obsahuje značku, MIDL vygeneruje TKIND_RECORD pro "this_struct" a TKIND_ALIAS pro "this_struct" (definuje "this_struct" jako alias pro "struct_tag"). Vzhledem k tomu, že značka v druhé definici chybí, vygeneruje MIDL TKIND_RECORD pro mangled name, internal to MIDL, které není pro uživatele smysluplné a TKIND_ALIAS pro "that_struct".

    To může mít vliv na prohlížeče knihoven typů, které jednoduše zobrazují název záznamu v uživatelském rozhraní. Pokud očekáváte, že TKIND_RECORD bude mít skutečné jméno, mohou se v uživatelském rozhraní objevit nerozpoznaná jména. Toto chování platí také pro sjednocení a definice výčtu s kompilátorem MIDL, který generuje TKIND_UNIONs a TKIND_ENUMs.

    MIDL také umožňujestrukturystylu jazyka C , sjednocenía definice výčtu. Například následující definice je v MIDL legální:

    struct my_struct { ... };
    typedef struct my_struct your_struct;
    
  • Logické datové typy

    V mkTypLib, Boolean základní typ a datový typ MkTypLib boOL se rovná VT_BOOL, který se mapuje na VARIANT_BOOL a který je definován jako krátké. V MIDL je logický základní typ ekvivalentní VT_UI1, který je definován jako bez znaménka a datový typ BOOL je definován jako dlouhý. To vede k potížím, pokud směšujete syntaxi IDL a syntaxi ODL ve stejném souboru a snažíte se zachovat kompatibilitu s MkTypLib. Vzhledem k tomu, že datové typy jsou různé velikosti, kód zařazování neodpovídá tomu, co je popsáno v informacích o typu. Pokud chcete VT_BOOL v knihovně typů, měli byste použít datový typ VARIANT_BOOL.

  • Definice GUID v souborech hlaviček

    V MkTypLib jsou identifikátory GUID definovány v souboru hlavičky pomocí makra, které lze podmíněně zkompilovat tak, aby vygenerovaly předdefinování guid nebo vytvoření instance GUID. MIDL obvykle umístí předdefinace GUID do vygenerovaných souborů hlaviček a instancí GUID pouze v souboru vygenerovaném přepínačem /iid.

Následující rozdíly v chování nelze vyřešit pomocí přepínače/mktyplib203:

  • Citlivost malých a velkých písmen

    V MIDL se rozlišují malá a velká písmena, automatizace OLE není.

  • Rozsah symbolů v deklaraci výčtu

    V MkTypLib rozsah symbolů v výčtu je místní. V MIDL je rozsah symbolů v výčtu globální, protože je v jazyce C. Například následující kód se zkompiluje v MkTypLib, ale vygeneruje chybu duplicitního názvu v MIDL:

    typedef struct { ... } a;
    enum {a=1, b=2, c=3};
    
  • Rozsah veřejného atributu

    Pokud použijete atribut public na blok rozhraní, MkTypLib zachází s každým typedef uvnitř daného bloku rozhraní jako veřejným. MIDL vyžaduje, abyste explicitně použili atribut veřejné u těch typedef, které chcete použít jako veřejný.

  • Pořadí hledání v importu

    Pokud importujete více než jednu knihovnu typů a pokud tyto knihovny obsahují duplicitní odkazy, MkTypLib to vyřeší pomocí prvního odkazu, který najde. Funkce MIDL použije poslední nalezený odkaz. Například s ohledem na následující syntaxi ODL knihovna C použije moo typedef z knihovny A, pokud kompilujete s MkTypLib a MOO typedef z knihovny B, pokud zkompilujete s 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
    }
    

    Vhodným alternativním řešením je kvalifikovat každý takový odkaz správným názvem knihovny importu, například takto:

    typedef struct tagBAA
        {A.MOO y;}BAA
    
  • Datový typ VOID nebyl rozpoznán.

    MIDL rozpozná jazyk C jazyk void datového typu a nerozpozná datový typ OLE Automation VOID. Pokud máte soubor ODL, který používá VOID, umístěte tuto definici na začátek souboru:

#define VOID void '''

  • Exponenciální zápis

    FUNKCE MIDL vyžaduje, aby hodnoty vyjádřené exponenciální notací byly obsaženy v uvozovkách. Například -2.5E+3

  • Hodnoty a konstanty LCID

    Při analýze souborů obvykle MIDL nebere v úvahu LCID. Chcete-li toto chování vynutit pro hodnotu, nebo pokud při definování konstanty potřebujete použít notaci specifickou pro národní prostředí, uzavřete hodnotu nebo konstantu do uvozovek.

Další informace naleznete v tématu /mktyplib203, /iida zařazování datových typů OLE.