Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Note
Para obtener información sobre cómo instalar y usar la extensión de Visual Studio (VSIX) de C++/WinRT (que proporciona compatibilidad con plantillas de proyecto), consulta Visual Studio compatibilidad con C++/WinRT.
Este tema se presenta al principio para que seas consciente de ello desde el primer momento, aunque todavía no lo necesites. La siguiente tabla de síntomas y soluciones para la resolución de problemas puede resultarle útil tanto si va a escribir código nuevo como si va a migrar una aplicación existente. Si estás portando, y deseas seguir avanzando y llegar a la etapa de creación y ejecución de tu proyecto, puedes progresar temporalmente comentando o anulando cualquier código no esencial que esté causando problemas, y volver después para restaurar lo que has quitado.
Para obtener una lista de las preguntas más frecuentes, consulte Preguntas más frecuentes.
Seguimiento de problemas de XAML
Las excepciones de análisis xaml pueden ser difíciles de diagnosticar, especialmente si no hay ningún mensaje de error significativo dentro de la excepción. Asegúrese de que el depurador está configurado para detectar excepciones de primera oportunidad (para intentar detectar la excepción de análisis al principio). Puede que sea posible inspeccionar la variable de la excepción en el depurador para determinar si el HRESULT o el mensaje contienen información útil. Además, compruebe la ventana de salida de Visual Studio para ver los mensajes de error generados por el analizador XAML.
Si la aplicación finaliza y todo lo que sabes es que se produjo una excepción no controlada durante el análisis de marcado XAML, podría ser el resultado de una referencia (por clave) a un recurso que falta. O bien, podría ser una excepción producida dentro de un UserControl, un control personalizado o un panel de diseño personalizado. Un último recurso es una división binaria. Quita aproximadamente la mitad del marcado de una página XAML y vuelve a ejecutar la aplicación. A continuación, sabrá si el error está en algún lugar dentro de la mitad que quitó (que ahora debe restaurar en cualquier caso) o en la mitad que no se quitó. Repita el proceso dividiendo por la mitad la parte que contiene el error, y así sucesivamente, hasta localizar el problema.
Síntomas y remedios
| Síntoma | Solución |
|---|---|
| Se produce una excepción en tiempo de ejecución con un valor HRESULT de REGDB_E_CLASSNOTREGISTERED. | Vea ¿Por qué obtengo una excepción de "clase no registrada"? |
| El compilador de C++ genera el error "'implements_type': no es miembro de ninguna clase base directa o indirecta de '<tipo> proyectado'". | Esto puede suceder cuando se llama a make con el nombre del espacio de nombres no completo de tu tipo de implementación (MyRuntimeClass, por ejemplo) y no has incluido el encabezado de dicho tipo. El compilador interpreta MyRuntimeClass como el tipo proyectado. La solución consiste en incluir el encabezado del tipo de implementación (MyRuntimeClass.hpor ejemplo). |
| El compilador de C++ genera el error "intentando hacer referencia a una función eliminada". | Esto puede ocurrir cuando se llama a make y el tipo de implementación que se pasa como parámetro de plantilla tiene un = delete constructor predeterminado. Edite el archivo de encabezado del tipo de implementación y cambie = delete a = default. También puede añadir un constructor en la IDL para la clase de tiempo de ejecución. |
| Has implementado INotifyPropertyChanged, pero los enlaces XAML no se actualizan (y la interfaz de usuario no se suscribe a PropertyChanged). | Recuerda que tienes que establecer Mode=OneWay (o TwoWay) en tu expresión de enlace en marcado XAML. Consulta Controles XAML; enlazar a una propiedad C++/WinRT. |
| Estás enlazando un control de elementos XAML a una colección observable y se produce una excepción en tiempo de ejecución con el mensaje "El parámetro es incorrecto". | En su IDL y en su implementación, declare cualquier colección observable como del tipo Windows.Foundation.Collections.IVector<IInspectable>. Pero devuelve un objeto que implementa Windows. Foundation.Collections.IObservableVector<T>, donde T es el tipo de elemento. Consulta Controles de elementos XAML; enlazar a una colección C++/WinRT. |
| El compilador de C++ genera un error del formulario "'MyImplementationType_base<MyImplementationType>': no hay ningún constructor predeterminado adecuado disponible". | Esto puede suceder si has derivado de un tipo que tiene un constructor no trivial. El constructor del tipo derivado debe pasar los parámetros que necesita el constructor del tipo base. Para obtener un ejemplo trabajado, vea Derivar de un tipo que tenga un constructor no trivial. |
| El compilador de C++ produce el error"No se puede convertir de «const std::vector<std::wstring,std::allocator<_Ty>>» a «const winrt::param::async_iterable<winrt::hstring> &»". | Esto puede suceder cuando se pasa std::vector de std::wstring a una API de Windows Runtime que espera una colección. Para obtener más información, consulta Tipos de datos estándar de C++ y C++/WinRT. |
| El compilador de C++ produce el error "No se puede convertir de «const std::vector<winrt::hstring,std::allocator<_Ty>>» a «const winrt::param::async_iterable<winrt::hstring> &»". | Esto puede suceder cuando se pasa std::vector de winrt::hstring a una API asincrónica de Windows Runtime que espera una colección y no has copiado ni movido el vector al destinatario asincrónico. Para obtener más información, consulta Tipos de datos estándar de C++ y C++/WinRT. |
| Al abrir un proyecto, Visual Studio produce el error "La aplicación del proyecto no está instalada". | Si aún no lo ha hecho, debe instalar las plantillas de C++ de SDK de Aplicaciones para Windows y la extensión de Visual Studio (VSIX) de C++/WinRT (consulte Compatibilidad de Visual Studio con C++/WinRT). |
| Las pruebas del Kit de certificación de Aplicación de Windows producen un error que indica que una de las clases en tiempo de ejecución "no deriva de una clase base de Windows. Todas las clases que se pueden componer deben derivar en última instancia de un tipo en el espacio de nombres Windows". | Cualquier clase en tiempo de ejecución (que declare en la aplicación) que derive de una clase base se conoce como una clase composable . La clase base final de una clase compuesta debe ser un tipo que se origine en un espacio de nombres Windows.* o Microsoft.*; por ejemplo, Microsoft. Interfaz de usuario. Xaml.DependencyObject. Consulta Controles XAML; enlace a una propiedad de C++/WinRT para obtener más detalles. |
| El compilador de C++ genera un error "T debe ser de tipo WinRT" para una especialización del delegado EventHandler o TypedEventHandler. | Considere usar winrt::delegate<...T> en su lugar. Consulte Crear eventos en C++/WinRT. |
| El compilador de C++ genera un error "T debe ser de tipo WinRT" para una especialización de operaciones asincrónicas de Windows Runtime. | Considere devolver una tarea de la Biblioteca de Patrones Paralelos (PPL) en su lugar. Consulte Concurrencia y operaciones asíncronas. |
| El compilador de C++ genera un error "T debe ser de tipo WinRT" al llamar a winrt::xaml_typename. | Use el tipo proyectado con winrt::xaml_typename (por ejemplo, use BgLabelControlApp::BgLabelControl) y no el tipo de implementación(por ejemplo, no use BgLabelControlApp::implementation::BgLabelControlControl). Consulta Controles personalizados de XAML (con plantilla). |
| El compilador de C++ genera "error C2220: advertencia tratada como error: no se generó ningún archivo 'object'". | Corrija la advertencia o establezca C/C++>General>Tratar advertencias como errores en No (/WX-). |
| La aplicación se bloquea porque se llama a un controlador de eventos en el objeto C++/WinRT un vez destruido el objeto. | Consulte Acceso seguro al puntero this con un delegado de control de eventos. |
| El compilador de C++ genera el "error C2338: This is only for weak ref support (Esto es solo para compatibilidad con referencia débil) ". | Estás solicitando una referencia débil para un tipo que ha pasado la estructura de marcador winrt::no_weak_ref como argumento de plantilla a su clase base. Consulte Desactivar la compatibilidad con referencias débiles. |
| El compilador de C++ genera "consume_Something: función que devuelve 'auto' no se puede usar antes de definirla". | Consulte C3779: ¿Por qué el compilador me da el error "consume_Something: una función que devuelve 'auto' no se puede usar antes de que se defina"?. |
| El enlazador de C++ genera "error LNK2019: símbolo externo sin resolver" | Vea ¿Por qué el enlazador me da un error "LNK2019: símbolo externo sin resolver"? |
| La cadena de herramientas LLVM y Clang genera errores cuando se usa con C++/WinRT. | No se admite la cadena de herramientas LLVM y Clang para C++/WinRT, pero si desea emular cómo lo usamos internamente, podría probar un experimento como el descrito en ¿Puedo usar LLVM/Clang para compilar con C++/WinRT?. |
| El compilador de C++ genera "ningún constructor predeterminado adecuado disponible" para un tipo proyectado. | Si intenta retrasar la inicialización de un objeto de clase en tiempo de ejecución o consumir e implementar una clase en tiempo de ejecución en el mismo proyecto, deberá llamar al constructor std::nullptr_t . Para obtener más información, consulta Consumir API con C++/WinRT. |
| El compilador de C++ genera "error C3861: 'from_abi': identificador no encontrado" y otros errores que se originan en base.h. Es posible que vea este error si usa Visual Studio 2017 (versión 15.8.0 o posterior) y tiene como destino la versión 10.0.17134.0 del SDK de Windows (Windows 10, versión 1803). | Use como destino una versión posterior (más compatible) del Windows SDK o establezca la propiedad del proyecto C/C++>Lenguaje>Conformance mode: No (además, si /permissive- aparece en la propiedad del proyecto C/C++>Lenguaje>Línea de comandos, en Opciones adicionales, elimínelo). |
| El compilador de C++ genera "error C2039: 'IUnknown': no es miembro de ''global namespace''". | Consulte Cómo cambiar la versión de destino de su proyecto de C++/WinRT a una versión posterior del SDK de Windows. |
| El enlazador de C++ genera "error LNK2019: símbolo externo sin resolver _WINRT_CanUnloadNow@0 al que se hace referencia en la función _VSDesignerCanUnloadNow@0" | Consulte Cómo redirigir su proyecto de C++/WinRT a una versión posterior del SDK de Windows. |
| El proceso de compilación genera el mensaje de error El VSIX de C++/WinRT ya no proporciona compatibilidad para compilar proyectos. Agregue una referencia de proyecto al paquete NuGet Microsoft.Windows.CppWinRT. | Instale el paquete NuGet Microsoft.Windows.CppWinRT en su proyecto. Para obtener más información, consulte Versiones anteriores de la extensión VSIX. |
| El enlazador de C++ genera un error LNK2019: símbolo externo sin resolver, con una mención de winrt::impl::consume_Windows_Foundation_Collections_IVector. | A partir de C++/WinRT 2.0, si usas for basado en intervalo en una colección de Windows Runtime, deberás aplicar ahora #include <winrt/Windows.Foundation.Collections.h>. |
| El compilador de C++ genera "error C4002: Demasiados argumentos para la invocación de macro similar a la función GetCurrentTime". | Consulte ¿Cómo se resuelven las ambigüedades con GetCurrentTime o TRY?. |
| El compilador de C++ genera "error C2334: símbolos inesperados delante de '{'; se omite el cuerpo de la función aparente". | Consulte ¿Cómo se resuelven las ambigüedades con GetCurrentTime o TRY?. |
| El compilador de C++ genera "winrt::impl::produce<D,I> no se puede crear una instancia de la clase abstracta porque falta GetBindingConnector". | Tienes que #include <winrt/Microsoft.UI.Xaml.Markup.h>. |
| El compilador de C++ genera "error C2039: 'promise_type': no es miembro de 'std::experimental::coroutine_traits<void>'". | Tu corrutina debe devolver un objeto de operación asincrónica o winrt::fire_and_forget. Consulte Concurrencia y operaciones asincrónicas. |
| El proyecto genera "acceso ambiguo a 'PopulatePropertyInfoOverride'". | Este error puede producirse cuando declaras una clase base en tu IDL y una clase base diferente en el marcado XAML. |
| Al cargar una solución de C++/WinRT por primera vez, aparece "Error en la compilación en tiempo de diseño del proyecto 'MyProject.vcxproj' con la configuración 'Debug|x86'. IntelliSense podría no estar disponible."। | Este problema de IntelliSense se resolverá después de compilar por primera vez. |
| Al intentar especificar winrt::auto_revoke al registrar un delegado, se produce la excepción winrt::hresult_no_interface. | Consulta If your auto-revoke delegate fails to register (Si el delegado de revocación automática no se registra). |
| En una aplicación de C++/WinRT, al consumir un componente de Windows Runtime de C# que usa XAML, el compilador genera un error del formato "'MyNamespace_XamlTypeInfo': no es miembro de 'winrt::MyNamespace'",donde MyNamespace es el nombre del espacio de nombres del componente de Windows Runtime. | En pch.h, en la aplicación cliente de C++/WinRT, agregue #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h>; sustituya MyNamespace según corresponda. |
| En un proyecto de C++/WinRT en Visual Studio, IntelliSense genera un error del tipo "error E1696: no se puede abrir el archivo de origen". | Compile el proyecto recién creado al menos una vez. A continuación, haga clic con el botón derecho en el editor de código fuente >Volver a analizar>Volver a analizar archivo. Esto resolverá todos los errores de IntelliSense, incluido E1696. |
Note
Si este tema no respondió a su pregunta, puede encontrar ayuda visitando la comunidad de desarrolladores de C++ de Visual Studio o mediante la c++-winrt etiqueta en Stack Overflow.
Temas relacionados
Note
Muchos temas de C++/WinRT están en proceso de migrarse de la documentación de UWP a esta sección. Hasta que se complete la migración, los vínculos de la lista siguiente pueden dar lugar a la sección de documentos de UWP. La proyección del lenguaje C++/WinRT es la misma para las aplicaciones para UWP y WinUI 3, de modo que el contenido sea aplicable en ambos contextos. Los patrones propios de UWP (como el ciclo de vida de la aplicación o las API del espacio de nombres Windows.UI) se indican explícitamente en esos artículos.