Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Observação
A ferramenta Mktyplib.exe está obsoleta. Em vez disso, use o compilador MIDL.
Existem algumas áreas-chave nas quais o compilador MIDL difere do MkTypLib. A maioria dessas diferenças surge porque o MIDL é orientado mais para a sintaxe C do que o MkTypLib.
Em geral, você vai querer usar a sintaxe MIDL em seus arquivos IDL. No entanto, se você precisar compilar um arquivo ODL existente ou, de outra forma, manter a compatibilidade com MkTypLib, use a opção de compilador /mktyplib203 MIDL para forçar o MIDL a se comportar como Mkktyplib.exe, versão 2.03. (Esta é a última versão da ferramenta MkTypLib.) Especificamente, a opção /mktyplib203 resolve essas diferenças:
Sintaxe typedef para tipos de dados complexos
Em MkTypLib, ambas as definições a seguir geram um TKIND_RECORD para "this_struct" na biblioteca de tipos. A tag "struct_tag" é opcional e, se usada, não aparecerá na biblioteca de tipos.
typedef struct struct_tag { ... } this_struct; typedef struct { ... } that_struct;Se uma tag opcional estiver faltando, o MIDL irá gerá-la, efetivamente adicionando uma tag à definição fornecida pelo usuário. Como a primeira definição tem uma tag, o MIDL gerará um TKIND_RECORD para "this_struct" e um TKIND_ALIAS para "this_struct" (definindo "this_struct" como um alias para "struct_tag"). Como a tag está ausente na segunda definição, o MIDL gerará um TKIND_RECORD para um nome distorcido, interno ao MIDL, que não é significativo para o usuário e um TKIND_ALIAS para "that_struct".
Isso tem implicações potenciais para navegadores de biblioteca de tipos que simplesmente mostram o nome de um registro em sua interface do usuário. Se você espera que um TKIND_RECORD tenha um nome real, nomes irreconhecíveis podem aparecer na interface do usuário. Esse comportamento também se aplica ade união dee definições dede enum, com o compilador MIDL gerando TKIND_UNIONs e TKIND_ENUMs, respectivamente.
O MIDL também permite que estilo C struct, uniãoe enum definições. Por exemplo, a seguinte definição é legal no MIDL:
struct my_struct { ... }; typedef struct my_struct your_struct;Tipos de dados booleanos
Em MkTypLib, o tipo base Boolean e o tipo de dados MkTypLib BOOL equivalem a VT_BOOL, que mapeia para VARIANT_BOOL e que é definido como um curto. Em MIDL, o tipo base Boolean é equivalente a VT_UI1, que é definido como um char não assinado e o tipo de dados BOOL é definido como um longo. Isso leva a dificuldades se você misturar sintaxe IDL e sintaxe ODL no mesmo arquivo enquanto ainda tenta manter a compatibilidade com MkTypLib. Como os tipos de dados são de tamanhos diferentes, o código de empacotamento não corresponderá ao descrito nas informações de tipo. Se você quiser um VT_BOOL em sua biblioteca de tipos, você deve usar o VARIANT_BOOL tipo de dados.
Definições de GUID em arquivos de cabeçalho
Em MkTypLib, GUIDs são definidos no arquivo de cabeçalho com uma macro que pode ser compilada condicionalmente para gerar uma predefinição de GUID ou um GUID instanciado. MIDL normalmente coloca predefinições GUID em seus arquivos de cabeçalho gerados e instanciações GUID somente no arquivo gerado pelo opção /iid.
As seguintes diferenças de comportamento não podem ser resolvidas usando a opção de/mktyplib203:
Sensibilidade a maiúsculas
O MIDL diferencia maiúsculas de minúsculas, a automação OLE não.
Âmbito de aplicação dos símbolos numa declaração enum
Em MkTypLib, o escopo de símbolos em um enum é local. Em MIDL, o escopo de símbolos em um enum é global, como é em C. Por exemplo, o código a seguir será compilado em MkTypLib, mas gerará um erro de nome duplicado no MIDL:
typedef struct { ... } a; enum {a=1, b=2, c=3};Âmbito do atributo público
Se você aplicar o atributo public a um bloco de interface, o MkTypLib tratará cada typedef dentro desse bloco de interface como público. O MIDL requer que você aplique explicitamente o atributo public aos typedefs que deseja publicar.
Ordem de pesquisa Importlib
Se você importar mais de uma biblioteca de tipos e se essas bibliotecas contiverem referências duplicadas, o MkTypLib resolverá isso usando a primeira referência encontrada. O MIDL usará a última referência que encontrar. Por exemplo, dada a seguinte sintaxe ODL, a biblioteca C usará o MOO typedef da biblioteca A se você compilar com MkTypLib e o MOO typedef da biblioteca B se você compilar com 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 }A solução apropriada para isso é qualificar cada referência com o nome correto da biblioteca de importação, da seguinte forma:
typedef struct tagBAA {A.MOO y;}BAATipo de dados VOID não reconhecido
O MIDL reconhece a linguagem C void tipo de dados e não reconhece o tipo de dados VOID da automação OLE. Se você tiver um arquivo ODL que usa VOID, coloque esta definição na parte superior do arquivo:
#define VOID void '''
Notação exponencial
O MIDL exige que os valores expressos em notação exponencial estejam entre aspas. Por exemplo, "-2.5E+3"
Valores e constantes LCID
Normalmente, o MIDL não considera o LCID ao analisar arquivos. Para forçar esse comportamento para um valor, ou se você precisar usar notação específica de localidade ao definir uma constante, coloque o valor ou constante entre aspas.
Para obter mais informações, consulte /mktyplib203, /iide Marshaling OLE Data Types.