Share via


Solución de problemas con el Lenguaje de definición de interfaz de Microsoft 3.0

La siguiente tabla de síntomas y soluciones de problemas puede resultarte útil si vas a cortar nuevo código o portar una aplicación existente.

Nota

El propósito de Lenguaje de definición de interfaz de Microsoft (MIDL) 3.0 es definir tipos de Windows Runtime dentro de archivos del Lenguaje de definición de interfaz (IDL) (.idlarchivos). MIDL 3.0 es una manera especialmente cómoda de definir clases en tiempo de ejecución de C++/WinRT . Para obtener más información y información general, consulte Introducción a Lenguaje de definición de interfaz de Microsoft 3.0.

Los archivos IDL se han usado tradicionalmente para definir tipos COM; por lo tanto, MIDL 3.0 representa una manera nueva y diferente de usar archivos IDL, con una sintaxis expandida para ellos. Para obtener más información sobre el uso de archivos IDL para definir tipos no Windows Runtime (tipos COM), vea Lenguaje de definición de interfaz de Microsoft.

Síntomas y soluciones

Síntoma Solución
La compilación en Visual Studio genera el "error MIDL2003: [msg]redefinition [context]: IUnknown" y muchos otros errores similares. La cadena de herramientas está configurada para hacer referencia automáticamente a cualquier tipo que se encuentra en espacios de nombres del sistema. En los archivos IDL, import quite las directivas para Windows espacios de nombres; import solo necesita los tipos que haya definido en el proyecto.
error MIDL2009: [msg]undefined symbol [context]: IInspectable. La cadena de herramientas no está configurada para importar automáticamente tipos en espacios de nombres del sistema. Si usa midl.exe desde la línea de comandos, vea Estructura de definición y llame a midl.exe desde la línea de comandos para obtener la sintaxis correcta de la línea de comandos; en concreto, el uso del /reference modificador . Como alternativa, compile los archivos IDL mediante Visual Studio con la extensión de Visual Studio (VSIX) de C++/WinRT (consulte compatibilidad de Visual Studio con C++/WinRT y VSIX). Si hace alguna de estas acciones, no import será necesario agregar una directiva para Windows.Foundation.idl al archivo IDL. Pero necesitará la directiva para import importar IDL adicional si hace referencia a los tipos que ha definido en el proyecto.
error MIDL2011: [msg]declaración de tipo sin resolver [contexto]:, seguido de un nombre de tipo. En el archivo IDL, import agregue una directiva para los archivos IDL que contengan las definiciones de cualquier tipo al que haga referencia que haya definido en el proyecto.
error MIDL2025: [msg]syntax error [context]: expecting > or, near ">>" Inserte un espacio entre los dos > caracteres para que el par de caracteres de cierre de plantilla no se interprete erróneamente como un operador de desplazamiento a la derecha.
error MIDL2025: [msg]syntax error [context]: expecting > or, near "[" Este error puede producirse si usa una matriz como argumento de tipo de parámetro para una interfaz parametrizada. Esto no es válido. Pero para obtener más detalles y una posible solución, vea Tipos con parámetros.
Las pruebas del Kit de certificación de aplicaciones de Windows generan un error de que una de las clases en tiempo de ejecución "no se deriva de una clase base de Windows. Todas las clases que admiten composición deben derivar en última instancia de un tipo en el espacio de nombres de Windows". Cualquier clase en tiempo de ejecución (que defina en la aplicación) que se derive de una clase base se conoce como clase que admite composición. La clase base fundamental de una clase que admite composición debe ser un tipo que se origina en un espacio de nombres de Windows.*; por ejemplo, Windows.UI.Xaml.DependencyObject. Consulta Controles XAML; enlazar a una propiedad C++/WinRT para más información.
La compilación en Visual Studio genera el "error MIDL5148: [msg]Las construcciones IDL de WinRT clásicas no se pueden usar en los tipos IDL de WinRT modernos". Usa la sintaxis MIDL 1.0 o 2.0 en el archivo MIDL 3.0. Para obtener información general, consulte MIDL 1.0, 2.0 y 3.0.
MIDL4035 [msg]El parámetro [in] tiene un tipo de puntero que no es válido. El puntero pasa algún parámetro de entrada, pero el tipo del puntero no es válido. Suele ser un signo que se ref const usó con un tipo que no es de estructura o ref que se usó con un tipo de valor. Tenga en cuenta que [in] el atributo mencionado en el mensaje de error realmente significa que el error se refiere a un parámetro de entrada, que es cualquier parámetro sin la palabra out clave . El [in] propio atributo no es un atributo válido en MIDL 3.0 y, por tanto, no aparecerá en el código.