Solução de problemas da linguagem IDL da Microsoft 3.0

A tabela de sintomas de solução de problemas e soluções a seguir pode ser útil se você estiver recortando um novo código ou fazendo a portabilidade de um aplicativo existente.

Observação

a finalidade do linguagem IDL da Microsoft (MIDL) 3,0 é definir Windows Runtime tipos dentro de arquivos IDL (Interface Definition Language) ( .idl arquivos). O MIDL 3,0 é uma maneira particularmente conveniente para definir classes de tempo de execução C++/WinRT . Para obter mais informações e o plano de fundo, consulte introdução ao linguagem IDL da Microsoft 3,0.

Os arquivos IDL tradicionalmente foram usados para definir tipos COM; Portanto, o MIDL 3,0 representa uma maneira nova e diferente de usar arquivos IDL, com uma sintaxe expandida para eles. para obter mais informações sobre como usar arquivos IDL para definir tipos não Windows Runtime (tipos COM), consulte linguagem IDL da Microsoft.

Sintomas e soluções

Sintoma Medida
a compilação em Visual Studio resulta em "error MIDL2003: [msg] redefinição [context]: IUnknown" e muitos outros erros semelhantes. Seu ferramentas está configurado para fazer referência automaticamente a todos os tipos que estão nos namespaces do sistema. em seus arquivos IDL, remova todas as import diretivas para Windows namespaces; você só precisa de import qualquer tipo que tenha definido em seu projeto.
erro MIDL2009: [msg] símbolo indefinido [contexto]: IInspectable. Seu ferramentas não está configurado para importar automaticamente os tipos nos namespaces do sistema. Se você estiver usando midl.exe a partir da linha de comando, consulte estrutura de definição e chamando midl.exe da linha de comando para a sintaxe de linha de comando correta; especificamente, o uso da /reference opção. como alternativa, compile os arquivos IDL usando Visual Studio com o vsix (c++/WinRT Visual Studio Extension) (consulte Visual Studio suporte para C++/WinRT e o vsix). Se você fizer qualquer uma dessas coisas, não será necessário adicionar uma import diretiva para Windows.Foundation.idl ao seu arquivo IDL. Mas você precisará da diretiva para importar IDL adicional se você estiver fazendo referência a import tipos que você definiu em seu projeto.
erro MIDL2011: [msg] Declaração de tipo não resolvida [Context]:, seguido por um nome de tipo. Em seu arquivo IDL, adicione uma import diretiva para os arquivos IDL que contêm as definições de qualquer tipo que você referenciar que você definiu em seu projeto.
erro MIDL2025: [msg] erro de sintaxe [Context]: esperando > ou, próximo a " >> " Insira um espaço entre os dois > caracteres para que o par de caracteres de fechamento de modelo não seja interpretado erroneamente como um operador de deslocamento à direita.
erro MIDL2025: [msg] erro de sintaxe [Context]: esperando > ou, perto de "[" Esse erro pode ocorrer se você usar uma matriz como um argumento de tipo de parâmetro para uma interface com parâmetros. Isso não é válido. Mas para obter mais detalhes e uma possível solução, consulte tipos com parâmetros.
Os testes do Kit de Certificação de Aplicativos Windows produzem um erro informando que uma das suas classes de tempo de execução "não deriva de uma classe base do Windows. Todas as classes combináveis precisam derivar, em última instância, de um tipo no namespace do Windows". Qualquer classe de tempo de execução (que você define em seu aplicativo) derivada de uma classe base é conhecida como classe combinável . A classe base definitiva de uma classe combinável deve ser um tipo de origem em um namespace do Windows.*; por exemplo, Windows.UI.Xaml.DependencyObject. Para obter mais detalhes, confira Controles XAML; associar a uma propriedade C++/WinRT.
a compilação em Visual Studio resulta em "error MIDL5148: [msg] construções de idl clássicas winrt não podem ser usadas em tipos de idl do winrt modernos". Você está usando a sintaxe MIDL 1,0 ou 2,0 no arquivo MIDL 3,0. Para obter informações em segundo plano, consulte MIDL 1,0, 2,0 e 3,0.
MIDL4035 [msg] o parâmetro [in] tem um tipo de ponteiro que não é válido. Algum parâmetro de entrada é passado por ponteiro, mas o tipo do ponteiro é inválido. Isso geralmente é um sinal que ref const foi usado com um tipo não struct ou ref foi usado com um tipo de valor. Observe que o [in] atributo mencionado na mensagem de erro realmente significa que o erro se refere a um parâmetro de entrada, que é qualquer parâmetro sem a out palavra-chave. O [in] próprio atributo não é um atributo válido no MIDL 3,0 e, portanto, não aparecerá no código.