Solución de problemas de C++/WinRTTroubleshooting C++/WinRT issues

Nota

Para más información sobre cómo instalar y usar la Extensión de Visual Studio (VSIX) de C++/WinRT (que proporciona compatibilidad de plantilla de proyecto), consulta Compatibilidad de Visual Studio para C++/WinRT.For info about installing and using the C++/WinRT Visual Studio Extension (VSIX) (which provides project template support) see Visual Studio support for C++/WinRT.

Este tema se muestra por adelantado para que lo tengas en cuenta, aunque no lo necesites todavía.This topic is up front so that you're aware of it right away; even if you don't need it yet. 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.The table of troubleshooting symptoms and remedies below may be helpful to you whether you're cutting new code or porting an existing app. 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.If you're porting, and you're eager to forge ahead and get to the stage where your project builds and runs, then you can make temporary progress by commenting or stubbing out any non-essential code that's causing issues, and then returning to pay off that debt later.

Para ver una lista de las preguntas más frecuentes, consulta Preguntas más frecuentes.For a list of frequently-asked questions, see Frequently-asked questions.

Seguimiento de problemas XAMLTracking down XAML issues

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.XAML parse exceptions can be difficult to diagnose—particularly if there are no meaningful error messages within the exception. Asegúrate de que el depurador está configurado para capturar las primeras excepciones (para probar y capturar la excepción de análisis desde el principio).Make sure that the debugger is configured to catch first-chance exceptions (to try and catch the parsing exception early on). Podrás inspeccionar la variable de excepción en el depurador para determinar si el mensaje o HRESULT tiene información útil.You may be able to inspect the exception variable in the debugger to determine whether the HRESULT or message has any useful information. Asimismo, consulta la ventana de salida de Visual Studio para comprobar si presenta mensajes de error emitidos por el analizador XAML.Also, check Visual Studio's output window for error messages output by the XAML parser.

Si tu aplicación finaliza y todo lo que sabes es que se ha producido 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.If your app terminates and all you know is that an unhandled exception was thrown during XAML markup parsing, then that could be the result of a reference (by key) to a missing resource. O bien, podría tratarse de una excepción dentro de UserControl, un control personalizado o un panel de diseño personalizado.Or, it could be an exception thrown inside a UserControl, a custom control, or a custom layout panel. Un último recurso es una división binaria.A last resort is a binary split. Quita aproximadamente la mitad del marcado de una página XAML y vuelve a ejecutar la aplicación.Remove about half of the markup from a XAML Page and re-run the app. De este modo, sabrás si el error está en la mitad que quitaste (que ahora debes restaurar en cualquier caso) o en la mitad que no quitaste.You will then know whether the error is somewhere inside the half you removed (which you should now restore in any case) or in the half you did not remove. Repite el proceso dividiendo la mitad que contiene el error y así sucesivamente, hasta que reduzcas a cero el problema.Repeat the process by splitting the half that contains the error, and so on, until you've zeroed in on the issue.

Síntomas y solucionesSymptoms and remedies

SíntomaSymptom SoluciónRemedy
Se produce una excepción en tiempo de ejecución con un valor HRESULT de REGDB_E_CLASSNOTREGISTERED.An exception is thrown at runtime with a HRESULT value of REGDB_E_CLASSNOTREGISTERED. Consulta ¿Por qué se muestra la excepción "clase no registrada"?See Why am I getting a "class not registered" exception?.
El compilador de C++ produce el error "'implements_type': no es un miembro de ninguna clase base directa o indirecta de '<tipo proyectado>'".The C++ compiler produces the error "'implements_type': is not a member of any direct or indirect base class of '<projected type>'". 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.This can happen when you call make with the namespace-unqualified name of your implementation type (MyRuntimeClass, for example), and you haven't included that type's header. El compilador interpreta MyRuntimeClass como el tipo proyectado.The compiler interprets MyRuntimeClass as the projected type. La solución consiste en incluir el encabezado para el tipo de implementación (MyRuntimeClass.h, por ejemplo).The solution is to include the header for your implementation type (MyRuntimeClass.h, for example).
El compilador de C++ produce el error "se está intentando hacer referencia a una función eliminada".The C++ compiler produces the error "attempting to reference a deleted function". Esto puede suceder cuando se llama a make y el tipo de implementación que pasas como parámetro de plantilla tiene un constructor = delete predeterminado.This can happen when you call make and the implementation type that you pass as the template parameter has an = delete default constructor. Edita el archivo de encabezado del tipo de implementación y cambia = delete a = default.Edit the implementation type's header file and change = delete to = default. También puedes agregar un constructor al archivo IDL para la clase en tiempo de ejecución.You can also add a constructor into the IDL for the runtime class.
Has implementado INotifyPropertyChanged, pero tus enlaces de XAML no se actualizan (y la interfaz de usuario no se suscribe a PropertyChanged).You've implemented INotifyPropertyChanged, but your XAML bindings are not updating (and the UI is not subscribing to PropertyChanged). Recuerda que tienes que establecer Mode=OneWay (o TwoWay) en tu expresión de enlace en marcado XAML.Remember to set Mode=OneWay (or TwoWay) on your binding expression in XAML markup. Consulta Controles XAML; enlazar a una propiedad C++/WinRT.See XAML controls; bind to a C++/WinRT property.
Vas a enlazar 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 no es correcto".You're binding a XAML items control to an observable collection, and an exception is thrown at runtime with the message "The parameter is incorrect". En tu IDL e implementación, declara cualquier colección observable como el tipo Windows.Foundation.Collections.IVector.In your IDL and your implementation, declare any observable collection as the type Windows.Foundation.Collections.IVector. Pero devuelve un objeto que implementa Windows.Foundation.Collections.IObservableVector, donde T es tu tipo de elemento.But return an object that implements Windows.Foundation.Collections.IObservableVector, where T is your element type. Consulta Controles de elementos XAML; enlazar a una colección C++/WinRT.See XAML items controls; bind to a C++/WinRT collection.
El compilador de C++ produce un error del formulario "'MyImplementationType_base<MyImplementationType>': no hay disponible un constructor predeterminado adecuado".The C++ compiler produces an error of the form "'MyImplementationType_base<MyImplementationType>': no appropriate default constructor available". Esto puede suceder si has derivado de un tipo que tiene un constructor no trivial.This can happen when you have derived from a type that has a non-trivial constructor. Tu constructor del tipo derivado debe pasar los parámetros que el constructor del tipo base necesita.Your derived type's constructor needs to pass along the parameters that the base type's constructor needs. Para obtener un ejemplo trabajado, consulta Derivar de un tipo que tiene un constructor no trivial.For a worked example, see Deriving from a type that has a non-trivial constructor.
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> &' ".The C++ compiler produces the error "cannot convert from 'const std::vector<std::wstring,std::allocator<_Ty>>' to '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.This can happen when you pass a std::vector of std::wstring to a Windows Runtime API that expects a collection. Para más información, consulta Tipos de datos C++ estándar y C++/WinRT.For more info, see Standard C++ data types and C++/WinRT.
El compilador de C++ produce el error"No puede convertir de 'const std::vector<winrt::hstring,std::allocator<_Ty>>' a 'const winrt::param::async_iterable<winrt::hstring> &' ".The C++ compiler produces the error "cannot convert from 'const std::vector<winrt::hstring,std::allocator<_Ty>>' to '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.This can happen when you pass a std::vector of winrt::hstring to an asynchronous Windows Runtime API that expects a collection, and you've neither copied nor moved the vector to the async callee. Para más información, consulta Tipos de datos C++ estándar y C++/WinRT.For more info, see Standard C++ data types and C++/WinRT.
Al abrir un proyecto, Visual Studio genera el error "La aplicación del proyecto no está instalada".When opening a project, Visual Studio produces the error "The application for the project is not installed". Si no lo has hecho todavía, debes instalar herramientas universales de Windows para el desarrollo de C++ desde el cuadro de diálogo Nuevo proyecto de Visual Studio.If you haven't already, you need to install Windows Universal tools for C++ development from within Visual Studio's New Project dialog. Si esto no resuelve el problema, el proyecto puede depender de la Extensión de Visual Studio (VSIX) para C++/WinRT (consulta Compatibilidad de Visual Studio para C++/WinRT).If that doesn't resolve the issue, then the project may depend on the C++/WinRT Visual Studio Extension (VSIX) (see Visual Studio support for C++/WinRT.
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".The Windows App Certification Kit tests produce an error that one of your runtime classes "does not derive from a Windows base class. All composable classes must ultimately derive from a type in the Windows namespace". Cualquier clase en tiempo de ejecución (que declares en la aplicación) que se deriva de una clase base se conoce como una clase que admite composición.Any runtime class (that you declare in your application) that derives from a base class is known as a composable class. 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.The ultimate base class of a composable class must be a type originating in a Windows.* namespace; for example, Windows.UI.Xaml.DependencyObject. Consulta Controles XAML; enlazar a una propiedad C++/WinRT para más información.See XAML controls; bind to a C++/WinRT property for more details.
El compilador de C++ genera un error "T debe ser de tipo WinRT" para una especialización del delegado EventHandler o TypedEventHandler.The C++ compiler produces a "T must be WinRT type" error for an EventHandler or TypedEventHandler delegate specialization. Considera la posibilidad de utilizar winrt::delegate<... T> en su lugar.Consider using winrt::delegate<...T> instead. Consulta Crear eventos en C++/WinRT.See Author events in C++/WinRT.
El compilador de C++ genera un error "T debe ser de tipo WinRT" para una especialización de la operación asincrónica de Windows Runtime.The C++ compiler produces a "T must be WinRT type" error for a Windows Runtime asynchronous operation specialization. Considera la posibilidad de devolver una tarea de la biblioteca de patrones de procesamiento paralelo (PPL) en su lugar.Consider returning a Parallel Patterns Library (PPL) task instead. Consulta Operaciones simultáneas y asincrónicas.See Concurrency and asynchronous operations.
El compilador de C++ genera un error "T debe ser de tipo WinRT" cuando se llama a winrt::xaml_typename.The C++ compiler produces a "T must be WinRT type" error when you call 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::BgLabelControl).Use the projected type with winrt::xaml_typename (for example, use BgLabelControlApp::BgLabelControl), and not the implementation type(for example, don't use BgLabelControlApp::implementation::BgLabelControl). Consulte Controles personalizados (con plantilla) de XAML.See XAML custom (templated) controls.
El compilador de C++ genera el "error C2220: advertencia tratada como error - ningún archivo 'objeto' generado".The C++ compiler produces "error C2220: warning treated as error - no 'object' file generated". Corrige la advertencia o establece C/C++ > General > Tratar advertencias como errores en No (/WX-) .Either correct the warning, or set C/C++ > General > Treat Warnings As Errors to 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.Your app crashes because an event handler in your C++/WinRT object is called after the object has been destroyed. Consulta Acceso de forma segura al puntero this con un delegado de control de eventos.See Safely accessing the this pointer with an event-handling delegate.
El compilador de C++ genera el "error C2338: This is only for weak ref support (Esto es solo para compatibilidad con referencia débil) ".The C++ compiler produces "error C2338: This is only for weak ref support". 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.You're requesting a weak reference for a type that passed the winrt::no_weak_ref marker struct as a template argument to its base class. Consulta Rechazar el soporte de referencia débil.See Opting out of weak reference support.
El enlazador de C++ genera el "error LNK2019: símbolo externo sin resolver"The C++ linker produces "error LNK2019: Unresolved external symbol" Consulta ¿Por qué el enlazador me da un "error LNK2019: símbolo externo sin resolver"?See Why is the linker giving me a "LNK2019: Unresolved external symbol" error?.
La cadena de herramientas de LLVM y Clang produce errores cuando se usa con C++/WinRT.The LLVM and Clang toolchain produces errors when used with C++/WinRT. No admitimos la cadena de herramientas LLVM y Clang para C++/WinRT, pero si deseas emular cómo la utilizamos internamente, puedes intentar hacer un experimento, como el descrito en ¿Puedo usar LLVM/Clang para compilar con C++/WinRT?.We don't support the LLVM and Clang toolchain for C++/WinRT, but if you wanted to emulate how we use it internally, then you could try an experiment such as the one described in Can I use LLVM/Clang to compile with C++/WinRT?.
El compilador de C++ genera "no hay disponible un constructor predeterminado adecuado" para un tipo proyectado.The C++ compiler produces "no appropriate default constructor available" for a projected type. Si estás intentando 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, debes llamar al constructor std::nullptr_t.If you're trying to delay the initialization of a runtime class object, or to consume and implement a runtime class in the same project, then you'll need to call the std::nullptr_t constructor. Para obtener más información, consulta Consumir API con C++/WinRT.For more info, see Consume APIs with C++/WinRT.
El compilador de C++ genera el "error C3861: 'from_abi': no se encontró el identificador" y otros errores que se originan en base.h.The C++ compiler produces "error C3861: 'from_abi': identifier not found", and other errors originating in base.h. Puedes ver este error si usas Visual Studio 2017 (versión 15.8.0 o superior) y te diriges al SDK de Windows versión 10.0.17134.0 (Windows 10, versión 1803).You may see this error if you are using Visual Studio 2017 (version 15.8.0 or higher), and targeting the Windows SDK version 10.0.17134.0 (Windows 10, version 1803). Dirígete a una versión posterior (más compatible) del SDK de Windows o establece la propiedad del proyecto C/C++ > Lenguaje > Modo de conformidad: No (además, si /permissive- aparece en la propiedad del proyecto C/C++ > Lenguaje > Línea de comandos en Opciones adicionales, elimínalo).Either target a later (more conformant) version of the Windows SDK, or set project property C/C++ > Language > Conformance mode: No (also, if /permissive- appears in project property C/C++ > Language > Command Line under Additional Options, then delete it).
El compilador de C++ genera el "error C2039: 'IUnknown': no es un miembro de '`global namespace".The C++ compiler produces "error C2039: 'IUnknown': is not a member of '`global namespace''". Consulta Procedimientos para redirigir el proyecto de C++/WinRT a una versión posterior del SDK de Windows.See How to retarget your C++/WinRT project to a later version of the Windows SDK.
El enlazador de C++ genera un "error LNK2019: símbolo externo sin resolver_WINRT_CanUnloadNow@0 al que se hace referencia en la función _VSDesignerCanUnloadNow@0".The C++ linker produces "error LNK2019: unresolved external symbol _WINRT_CanUnloadNow@0 referenced in function _VSDesignerCanUnloadNow@0" Consulta Procedimientos para redirigir el proyecto de C++/WinRT a una versión posterior del SDK de Windows.See How to retarget your C++/WinRT project to a later version of the Windows SDK.
El proceso de compilación genera el mensaje de error The C++/WinRT VSIX no longer provides project build support. Please add a project reference to the Microsoft.Windows.CppWinRT Nuget package (VSIX de C++WinRT ya no proporciona compatibilidad con la compilación del proyecto. Agregue una referencia de proyecto al paquete NuGet Microsoft.Windows.CppWinRT).The build process produces the error message The C++/WinRT VSIX no longer provides project build support. Please add a project reference to the Microsoft.Windows.CppWinRT Nuget package. Instala el paquete NuGet Microsoft.Windows.CppWinRT en el proyecto.Install the Microsoft.Windows.CppWinRT NuGet package into your project. Para más información, consulta Versiones anteriores de la extensión VSIX.For details, see Earlier versions of the VSIX extension.
El enlazador de C++ genera el error LNK2019: símbolo externo sin resolver, con una mención de winrt::impl::consume_Windows_Foundation_Collections_IVector.The C++ linker produces error LNK2019: unresolved external symbol, with a mention of 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>.As of C++/WinRT 2.0, If you're using a range-based for on a Windows Runtime collection, then you'll now need to #include <winrt/Windows.Foundation.Collections.h>.
El compilador de C++ genera el error "error C4002: demasiados argumentos para la invocación de la macro como función GetCurrentTime".The C++ compiler produces "error C4002: Too many arguments for function-like macro invocation GetCurrentTime". Consulta ¿Cómo se pueden resolver las ambigüedades con GetCurrentTime o TRY?See How do I resolve ambiguities with GetCurrentTime and/or TRY?.
El compilador de C++ genera el error "error C2334: tokens inesperados antes de '{'; se omite el cuerpo de función aparente".The C++ compiler produces "error C2334: unexpected token(s) preceding '{'; skipping apparent function body". Consulta ¿Cómo se pueden resolver las ambigüedades con GetCurrentTime o TRY?See How do I resolve ambiguities with GetCurrentTime and/or TRY?.
El compilador de C++ genera el error "winrt::impl::produce<D,I> no se puede crear una instancia de la clase abstracta, porque falta GetBindingConnector".The C++ compiler produces "winrt::impl::produce<D,I> cannot instantiate abstract class, due to missing GetBindingConnector". Tienes que #include <winrt/Windows.UI.Xaml.Markup.h>.You need to #include <winrt/Windows.UI.Xaml.Markup.h>.
El compilador de C++ genera el error "error C2039: 'promise_type': no es un miembro de 'std::experimental::coroutine_traits'".The C++ compiler produces "error C2039: 'promise_type': is not a member of 'std::experimental::coroutine_traits'". Tu corrutina debe devolver un objeto de operación asincrónica o winrt::fire_and_forget.Your coroutine needs to return either an asynchronous operation object, or winrt::fire_and_forget. Consulta Operaciones simultáneas y asincrónicas.See Concurrency and asynchronous operations.
El proyecto genera "acceso ambiguo de 'PopulatePropertyInfoOverride'".Your project produces "ambiguous access of 'PopulatePropertyInfoOverride'". Este error puede producirse cuando se declaran una clase base en el archivo IDL y una clase base diferente en el marcado XAML.This error can occur when you declare one base class in your IDL and a different base class in your XAML markup.
Cargar una solución de C++/WinRT por primera vez genera el error "Error de compilación en tiempo de diseño para la configuración del proyecto 'MyProject.vcxproj' 'Debug|x86'. Es posible que IntelliSense no esté disponible. ".Loading a C++/WinRT solution for the first time produces "Designtime build failed for project 'MyProject.vcxproj' configuration 'Debug|x86'. IntelliSense might be unavailable.". Después de compilar por primera vez, se resolverá este problema de IntelliSense.This IntelliSense issue will resolve after you build for the first time.
Si intentas especificar winrt::auto_revoke al registrar un delegado, se genera una excepción winrt::hresult_no_interface.Attempting to specify winrt::auto_revoke when registering a delegate produces a winrt::hresult_no_interface exception. Consulta If your auto-revoke delegate fails to register (Si el delegado de revocación automática no se registra).See If your auto-revoke delegate fails to register.
En una aplicación de C++ o WinRT, al consumir un componente de Windows Runtime para C# que usa XAML, el compilador genera un error con el formato " 'MyNamespace_XamlTypeInfo': no es miembro de 'winrt::MyNamespace' "— donde MyNamespace es el nombre del espacio de nombres del componente de Windows Runtime.In a C++/WinRT app, when consuming a C# Windows Runtime component that uses XAML, the compiler produces an error of the form "'MyNamespace_XamlTypeInfo': is not a member of 'winrt::MyNamespace'"—where MyNamespace is the name of the Windows Runtime component's namespace. En el archivo pch.h de la aplicación que consume C++ o WinRT, agregue #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h>— reemplace MyNamespace según corresponda.In pch.h in the consuming C++/WinRT app, add #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h>—replacing MyNamespace as appropriate.

Nota

Si en este tema no hemos respondido a tu pregunta, podrás encontrar ayuda en la comunidad de desarrolladores de C++ de Visual Studio o mediante la etiqueta c++-winrt en Stack Overflow.If this topic didn't answer your question, then you might find help by visiting the Visual Studio C++ developer community, or by using the c++-winrt tag on Stack Overflow.