Résolution des problèmes liés à C++/WinRTTroubleshooting C++/WinRT issues

Notes

Pour plus d’informations sur l’installation et l’utilisation de l’extension VSIX (Visual Studio Extension) C++/WinRT (qui prend en charge les modèles de projet), consultez Prise en charge de Visual Studio pour 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.

Cette rubrique est fournie en amont pour que vous en ayez connaissance immédiatement, même si vous n’en avez pas encore l’utilité.This topic is up front so that you're aware of it right away; even if you don't need it yet. Le tableau des symptômes et solutions de problèmes ci-après peut vous être utile, que vous coupiez un nouveau code ou portiez une application existante.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 vous effectuez un portage et que vous êtes impatient d’avancer et de passer à la phase de génération et d’exécution de votre projet, progressez provisoirement en commentant ou en remplaçant le code non essentiel problématique, puis revenez plus tard combler ce qui manque.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.

Pour obtenir la liste des questions fréquentes, consultez Questions fréquentes (FAQ).For a list of frequently-asked questions, see Frequently-asked questions.

Suivi des problèmes XAMLTracking down XAML issues

Les exceptions d’analyse XAML peuvent être difficiles à diagnostiquer, en particulier si l’exception ne présente aucun message d’erreur explicite.XAML parse exceptions can be difficult to diagnose—particularly if there are no meaningful error messages within the exception. Assurez-vous que le débogueur est configuré pour intercepter les exceptions de première chance (pour essayer d’intercepter l’exception d’analyse le plus tôt possible).Make sure that the debugger is configured to catch first-chance exceptions (to try and catch the parsing exception early on). Vous pourrez peut-être inspecter la variable d’exception dans le débogueur pour déterminer si la valeur HRESULT ou le message comportent des informations utiles.You may be able to inspect the exception variable in the debugger to determine whether the HRESULT or message has any useful information. Vérifiez également la fenêtre de sortie de Visual Studio pour voir si elle contient des messages d’erreur de l’analyseur XAML.Also, check Visual Studio's output window for error messages output by the XAML parser.

Si votre application s’arrête et que vous savez simplement qu’une exception non prise en charge a été levée pendant l’analyse des balises XAML, cela peut être le résultat d’une référence (par clé) à une ressource manquante.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. Il peut également s’agir d’une exception levée dans un UserControl, un contrôle personnalisé ou un panneau de disposition personnalisé.Or, it could be an exception thrown inside a UserControl, a custom control, or a custom layout panel. En dernier recours, vous pouvez effectuer un fractionnement binaire.A last resort is a binary split. Supprimez environ la moitié des balises d’une page XAML et réexécutez l’application.Remove about half of the markup from a XAML Page and re-run the app. Vous saurez alors si l’erreur se situe quelque part dans la partie que vous avez supprimée (que vous devez maintenant restaurer dans tous les cas), ou dans la partie que vous n’avez pas supprimée.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. Répétez ce processus en fractionnant la moitié qui contient l’erreur et ainsi de suite jusqu’à ce que vous ayez ciblé le problème.Repeat the process by splitting the half that contains the error, and so on, until you've zeroed in on the issue.

Symptômes et solutionsSymptoms and remedies

SymptômeSymptom SolutionRemedy
Une exception est levée au moment de l’exécution avec une valeur HRESULT égale à REGDB_E_CLASSNOTREGISTERED.An exception is thrown at runtime with a HRESULT value of REGDB_E_CLASSNOTREGISTERED. Consultez Pourquoi suis-je confronté à l’exception « classe non enregistrée » ?.See Why am I getting a "class not registered" exception?.
Le compilateur C++ génère l’erreur «  'implements_type' : n’est membre d’aucune classe de base directe ou indirecte de '<type projeté>'  ».The C++ compiler produces the error "'implements_type': is not a member of any direct or indirect base class of '<projected type>'". Cela peut se produire quand vous appelez make avec le nom complet de l’espace de noms de votre type d’implémentation (MyRuntimeClass, par exemple), et que vous n’avez pas encore inclus l’en-tête de ce type.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. Le compilateur interprète MyRuntimeClass en tant que type projeté.The compiler interprets MyRuntimeClass as the projected type. La solution consiste à inclure l’en-tête de votre type d’implémentation (MyRuntimeClass.h, par exemple).The solution is to include the header for your implementation type (MyRuntimeClass.h, for example).
Le compilateur C++ génère l’erreur « tentative de référencement d’une fonction supprimée ».The C++ compiler produces the error "attempting to reference a deleted function". Cela peut arriver quand vous appelez make et que le type d’implémentation que vous passez en tant que paramètre de modèle a un constructeur par défaut = delete.This can happen when you call make and the implementation type that you pass as the template parameter has an = delete default constructor. Modifiez le fichier d’en-tête du type d’implémentation et remplacez = delete par = default.Edit the implementation type's header file and change = delete to = default. Vous pouvez également ajouter un constructeur dans le fichier IDL pour la classe runtime.You can also add a constructor into the IDL for the runtime class.
Vous avez implémenté INotifyPropertyChanged, mais vos liaisons XAML ne sont pas mises à jour (et l’IU ne s’abonne pas à PropertyChanged).You've implemented INotifyPropertyChanged, but your XAML bindings are not updating (and the UI is not subscribing to PropertyChanged). Veillez à définir Mode=OneWay (ou TwoWay) pour votre expression de liaison dans les balises XAML.Remember to set Mode=OneWay (or TwoWay) on your binding expression in XAML markup. Consultez Contrôles XAML ; liaison à une propriété C++/WinRT.See XAML controls; bind to a C++/WinRT property.
Vous liez un contrôle d’éléments XAML à une collection observable, et une exception est levée au moment de l’exécution avec le message « Le paramètre n’est pas correct ».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". Dans votre fichier IDL et votre implémentation, déclarez toute collection observable en tant que type Windows.Foundation.Collections.IVector.In your IDL and your implementation, declare any observable collection as the type Windows.Foundation.Collections.IVector. Toutefois, retournez un objet qui implémente Windows.Foundation.Collections.IObservableVector, où T est votre type d’élément.But return an object that implements Windows.Foundation.Collections.IObservableVector, where T is your element type. Consultez Contrôles d’éléments XAML ; liaison à une collection C++/WinRT.See XAML items controls; bind to a C++/WinRT collection.
Le compilateur C++ génère l’erreur suivante : «  'MyImplementationType_base<MyImplementationType>' : aucun constructeur par défaut approprié disponible ».The C++ compiler produces an error of the form "'MyImplementationType_base<MyImplementationType>': no appropriate default constructor available". Cela peut se produire en cas de dérivation à partir d’un type ayant un constructeur non trivial.This can happen when you have derived from a type that has a non-trivial constructor. Le constructeur de votre type dérivé doit passer les paramètres nécessaires au constructeur du type de base.Your derived type's constructor needs to pass along the parameters that the base type's constructor needs. Pour un exemple pratique, consultez Dérivation à partir d’un type qui possède un constructeur non trivial.For a worked example, see Deriving from a type that has a non-trivial constructor.
Le compilateur C++ génère l’erreur suivante : « Impossible de convertir 'const std::vector<std::wstring,std::allocator<_Ty>>' en '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> &'". Cela peut se produire quand vous passez un std::vector de std::wstring à une API Windows Runtime qui attend une collection.This can happen when you pass a std::vector of std::wstring to a Windows Runtime API that expects a collection. Pour plus d’informations, consultez Types de données C++ standard et C++/WinRT.For more info, see Standard C++ data types and C++/WinRT.
Le compilateur C++ génère l’erreur suivante : « Impossible de convertir 'const std::vector<winrt::hstring,std::allocator<_Ty>>' en '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> &'". Cela peut se produire quand vous passez un std::vector de winrt::hstring à une API Windows Runtime asynchrone qui attend une collection, et que vous n’avez ni copié, ni déplacé le vecteur vers l’appelé asynchrone.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. Pour plus d’informations, consultez Types de données C++ standard et C++/WinRT.For more info, see Standard C++ data types and C++/WinRT.
Quand vous ouvrez un projet, Visual Studio génère l’erreur suivante : « L’application du projet n’est pas installée ».When opening a project, Visual Studio produces the error "The application for the project is not installed". Si vous ne l’avez pas déjà fait, installez les outils Windows universels pour développer en C++ à partir de la boîte de dialogue Nouveau projet 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 cela ne résout pas le problème, le projet peut dépendre de l’extension Visual Studio (VSIX) C++/WinRT (consultez Prise en charge de Visual Studio pour 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.
Les tests du Kit de certification des applications Windows génèrent une erreur indiquant que l’une de vos classes runtime « ne dérive pas d’une classe de base Windows. Toutes les classes composables doivent en définitive dériver d’un type de l’espace de noms 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". Toute classe runtime (que vous déclarez dans votre application) qui dérive d’une classe de base est appelée classe composable.Any runtime class (that you declare in your application) that derives from a base class is known as a composable class. La classe de base ultime d’une classe composable doit être un type provenant d’un espace de noms Windows.*, par exemple 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. Pour plus d’informations, consultez Contrôles XAML ; liaison à une propriété C++/WinRT.See XAML controls; bind to a C++/WinRT property for more details.
Le compilateur C++ génère une erreur « T must be WinRT type » (T doit être de type WinRT) pour une spécialisation de délégué EventHandler ou TypedEventHandler.The C++ compiler produces a "T must be WinRT type" error for an EventHandler or TypedEventHandler delegate specialization. Utilisez winrt::delegate<...T> à la place.Consider using winrt::delegate<...T> instead. Consultez Créer des événements en C++/WinRT.See Author events in C++/WinRT.
Le compilateur C++ génère une erreur « T must be WinRT type » (T doit être de type WinRT) pour une spécialisation d’opération asynchrone Windows Runtime.The C++ compiler produces a "T must be WinRT type" error for a Windows Runtime asynchronous operation specialization. Retournez une tâche PPL (Parallel Patterns Library) à la place.Consider returning a Parallel Patterns Library (PPL) task instead. Consultez Opérations concurrentes et asynchrones.See Concurrency and asynchronous operations.
Le compilateur C++ génère une erreur « T must be WinRT type » (T doit être de type WinRT) quand vous appelez winrt::xaml_typename.The C++ compiler produces a "T must be WinRT type" error when you call winrt::xaml_typename. Utilisez le type projeté avec winrt::xaml_typename (par exemple, utilisez BgLabelControlApp::BgLabelControl), et non le type d’implémentation (par exemple, n’utilisez pas 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). Consultez Contrôles XAML personnalisés (basés sur un modèle).See XAML custom (templated) controls.
Le compilateur C++ génère l’« erreur C2220 : avertissement traité en tant qu’erreur - aucun fichier 'object' généré ».The C++ compiler produces "error C2220: warning treated as error - no 'object' file generated". Corrigez l’avertissement ou affectez à C/C++ > Général > Considérer les avertissements comme des erreurs la valeur Non (/WX-) .Either correct the warning, or set C/C++ > General > Treat Warnings As Errors to No (/WX-).
Votre application plante, car un gestionnaire d’événements dans votre objet C++/WinRT est appelé après la destruction de l’objet.Your app crashes because an event handler in your C++/WinRT object is called after the object has been destroyed. Consultez accès sécurisé au pointeur this avec un délégué de gestion des événements.See Safely accessing the this pointer with an event-handling delegate.
Le compilateur C++ génère l’« erreur C2338 : ceci est réservé à la prise en charge des références faibles ».The C++ compiler produces "error C2338: This is only for weak ref support". Vous demandez une référence faible pour un type qui a passé le struct de marqueur winrt::no_weak_ref en tant qu’argument de modèle à sa classe de 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. Consultez Refus de la prise en charge des références faibles.See Opting out of weak reference support.
L’éditeur de liens C++ génère l’« erreur LNK2019 : symbole externe non résolu »The C++ linker produces "error LNK2019: Unresolved external symbol" Consultez Pourquoi l’éditeur de liens retourne-t-il une erreur « LNK2019 : symbole externe non résolu » ?.See Why is the linker giving me a "LNK2019: Unresolved external symbol" error?.
La chaîne d’outils LLVM et Clang génère des erreurs quand elle est utilisée avec C++/WinRT.The LLVM and Clang toolchain produces errors when used with C++/WinRT. Nous ne prenons pas en charge la chaîne d’outils LLVM et Clang pour C++/WinRT, mais si vous souhaitez émuler notre mode d’utilisation interne, vous pouvez essayer la méthode décrite dans Puis-je utiliser LLVM/Clang pour compiler avec 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?.
Le compilateur C++ génère l’erreur « aucun constructeur par défaut approprié disponible » pour un type projeté.The C++ compiler produces "no appropriate default constructor available" for a projected type. Si vous essayez de retarder l’initialisation d’un objet de classe runtime, ou de consommer et d’implémenter une classe runtime dans le même projet, vous devez appeler le constructeur 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. Pour plus d’informations, consultez Utiliser des API avec C++/WinRT.For more info, see Consume APIs with C++/WinRT.
Le compilateur C++ génère l’« erreur C3861 : 'from_abi' : identificateur introuvable » et d’autres erreurs provenant de base.h.The C++ compiler produces "error C3861: 'from_abi': identifier not found", and other errors originating in base.h. Cette erreur peut s’afficher si vous utilisez Visual Studio 2017 (version 15.8.0 ou ultérieure), et si vous ciblez le kit SDK Windows version 10.0.17134.0 (Windows 10, version 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). Ciblez une version ultérieure (plus conforme) du kit SDK Windows, ou définissez la propriété de projet C/C++ > Langage > Mode de conformité : Non (de plus, si /permissive- apparaît dans la propriété de projet C/C++ > Langage > Ligne de commande sous Options supplémentaires, supprimez-la).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).
Le compilateur C++ génère l’« erreur C2039 : 'IUnknown' : n’est pas membre de l’`espace de noms global ».The C++ compiler produces "error C2039: 'IUnknown': is not a member of '`global namespace''". Consultez Guide pratique pour recibler votre projet C++/WinRT vers une version ultérieure du SDK Windows.See How to retarget your C++/WinRT project to a later version of the Windows SDK.
L’éditeur de liens C++ génère l’« erreur LNK2019 : symbole externe non résolu _WINRT_CanUnloadNow@0 référencé dans la fonction _VSDesignerCanUnloadNow@0 »The C++ linker produces "error LNK2019: unresolved external symbol _WINRT_CanUnloadNow@0 referenced in function _VSDesignerCanUnloadNow@0" Consultez Guide pratique pour recibler votre projet C++/WinRT vers une version ultérieure du SDK Windows.See How to retarget your C++/WinRT project to a later version of the Windows SDK.
Le processus de build génère le message d’erreur suivant : L’extension VSIX C++/WinRT ne fournit plus de prise en charge de build de projet. Ajoutez une référence de projet au package 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. Installez le package NuGet Microsoft.Windows.CppWinRT dans votre projet.Install the Microsoft.Windows.CppWinRT NuGet package into your project. Pour plus d’informations, consultez Versions antérieures de l’extension VSIX.For details, see Earlier versions of the VSIX extension.
L’éditeur de liens C++ génère l’« *erreur LNK2019 : symbole externe non résolu * en faisant mention à 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. Depuis C++/WinRT 2.0, si vous utilisez un for basé sur une plage dans une collection Windows Runtime, vous devez désormais #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>.
Le compilateur C++ génère « Erreur C4002 : trop d’arguments pour l’appel de macro de type fonction GetCurrentTime ».The C++ compiler produces "error C4002: Too many arguments for function-like macro invocation GetCurrentTime". Consultez Comment faire pour résoudre les ambiguïtés avec GetCurrentTime et/ou TRY ?.See How do I resolve ambiguities with GetCurrentTime and/or TRY?.
Le compilateur C++ génère « Erreur C2334 : jetons inattendus avant '{' ; corps apparent de la fonction ignoré ».The C++ compiler produces "error C2334: unexpected token(s) preceding '{'; skipping apparent function body". Consultez Comment faire pour résoudre les ambiguïtés avec GetCurrentTime et/ou TRY ?.See How do I resolve ambiguities with GetCurrentTime and/or TRY?.
Le compilateur C++ génère « winrt::impl::produce<D,I> ne peut pas instancier une classe abstraite en raison d’un GetBindingConnector manquant ».The C++ compiler produces "winrt::impl::produce<D,I> cannot instantiate abstract class, due to missing GetBindingConnector". Vous devez utiliser #include <winrt/Windows.UI.Xaml.Markup.h>.You need to #include <winrt/Windows.UI.Xaml.Markup.h>.
Le compilateur C++ génère « Erreur C2039 : 'promise_type': n’est pas membre de 'std::experimental::coroutine_traits'  ».The C++ compiler produces "error C2039: 'promise_type': is not a member of 'std::experimental::coroutine_traits'". Votre coroutine doit retourner un objet d’opération asynchrone ou winrt::fire_and_forget.Your coroutine needs to return either an asynchronous operation object, or winrt::fire_and_forget. Consultez Opérations concurrentes et asynchrones.See Concurrency and asynchronous operations.
Votre projet génère « accès ambigu de 'PopulatePropertyInfoOverride'  ».Your project produces "ambiguous access of 'PopulatePropertyInfoOverride'". Cette erreur peut se produire quand vous déclarez une classe de base dans votre IDL et une autre classe de base dans votre balisage XAML.This error can occur when you declare one base class in your IDL and a different base class in your XAML markup.
La première fois que vous chargez une solution C++/WinRT, vous obtenez : « Échec de la build au moment du design pour le projet 'MyProject.vcxproj' et la configuration 'Debug|x86'. IntelliSense est peut-être non 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.". Ce problème lié à IntelliSense est résolu après la première génération.This IntelliSense issue will resolve after you build for the first time.
Toute tentative de spécification de winrt::auto_revoke au moment de l’inscription d’un délégué produit une exception winrt::hresult_no_interface.Attempting to specify winrt::auto_revoke when registering a delegate produces a winrt::hresult_no_interface exception. Consultez Si votre délégué à révocation automatique ne parvient pas à s’inscrire.See If your auto-revoke delegate fails to register.
Dans une application C++/WinRT, lors de l’utilisation d’un composant Windows Runtime C# qui utilise XAML, le compilateur génère une erreur au format «  'MyNamespace_XamlTypeInfo' : n’est pas un membre de 'winrt::MyNamespace'  », —où MyNamespace est le nom de l’espace de noms du composant 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. Dans pch.h dans l’application qui utilise C++/WinRT, ajoutez #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h>—remplacer MyNamespace si nécessaire.In pch.h in the consuming C++/WinRT app, add #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h>—replacing MyNamespace as appropriate.

Notes

Si cette rubrique n’a pas répondu à votre question, vous pouvez rechercher de l’aide en accédant à la page de la Communauté de développeurs Visual Studio C++ ou en utilisant la balise c++-winrt sur 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.