Résolution des problèmes C++/WinRT

Note

Pour plus d’informations sur l’installation et l’utilisation de l’extension de Visual Studio C++/WinRT (VSIX) (qui fournit une prise en charge des modèles de projet), consultez Visual Studio prise en charge de C++/WinRT.

Cette rubrique est à l’avant-plan pour que vous en soyez conscient immédiatement ; même si vous n’en avez pas encore besoin. Le tableau ci-dessous des symptômes et solutions de dépannage pourra vous être utile, que vous développiez une nouvelle application ou adaptiez une application existante. 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.

Pour obtenir la liste des questions fréquemment posées, consultez les questions fréquemment posées.

Suivi des problèmes XAML

Les exceptions d’analyse XAML peuvent être difficiles à diagnostiquer, en particulier s’il n’existe aucun message d’erreur significatif dans l’exception. Assurez-vous que le débogueur est configuré pour intercepter les exceptions de première chance (afin d’essayer d’intercepter l’exception d’analyse le plus tôt possible). Vous pouvez peut-être inspecter la variable d’exception dans le débogueur pour déterminer si le HRESULT ou le message contient des informations utiles. Vérifiez également la fenêtre Sortie de Visual Studio pour consulter les messages d’erreur générés par l’analyseur XAML.

Si votre application s’arrête et que tout ce que vous savez, c’est qu’une exception non gérée s’est produite pendant l’analyse du balisage XAML, cela peut être dû à une référence, par clé, à une ressource manquante. Ou bien, il peut s’agir d’une exception déclenchée dans un UserControl, un contrôle personnalisé ou un panneau de disposition personnalisé. Un dernier recours est un fractionnement binaire. Supprimez environ la moitié du balisage d’une page XAML et réexécutez l’application. Vous saurez ensuite si l’erreur se trouve quelque part dans la moitié que vous avez supprimée (que vous devez maintenant restaurer dans n’importe quel cas) ou dans la moitié que vous n’avez pas supprimée. Répétez le processus en divisant la moitié dans laquelle se trouve l’erreur, et ainsi de suite, jusqu’à avoir isolé le problème.

Symptômes et remèdes

Symptôme Résolution
Une exception est levée au moment de l’exécution avec une valeur HRESULT égale à REGDB_E_CLASSNOTREGISTERED. Voir Pourquoi est-ce que je reçois une exception « classe non inscrite » ?.
Le compilateur C++ génère l’erreur « implements_type » : n’est membre d’aucune classe de base directe ou indirecte de «< type> projeté ». Cela peut se produire lorsque vous appelez make en utilisant le nom non qualifié par espace de noms de votre type d’implémentation (MyRuntimeClass, par exemple), et que vous n’avez pas inclus le fichier d’en-tête de ce type. Le compilateur interprète MyRuntimeClass comme type projeté. La solution consiste à inclure l’en-tête de votre type d’implémentation (MyRuntimeClass.hpar exemple).
Le compilateur C++ génère l’erreur « tentative de référence d’une fonction supprimée ». Cela peut se produire lorsque vous appelez effectuer et que le type d’implémentation que vous passez en tant que paramètre de modèle a un = delete constructeur par défaut. Modifiez le fichier d’en-tête du type d’implémentation et passez = delete à = default. Vous pouvez également ajouter un constructeur dans l’IDL pour la classe runtime.
Vous avez implémenté INotifyPropertyChanged, mais vos liaisons XAML ne sont pas mises à jour (et l’interface utilisateur n’est pas abonnée à PropertyChanged). N’oubliez pas de définir Mode=OneWay (ou TwoWay) sur votre expression de liaison dans le balisage XAML. Consultez Contrôles XAML ; lier à une propriété C++/WinRT.
Vous liez un contrôle d’éléments XAML à une collection observable, et une exception est levée à l’exécution avec le message « Le paramètre est incorrect ». Dans votre IDL et votre implémentation, déclarez n’importe quelle collection observable en tant que type Windows. Foundation.Collections.IVector<IInspectable>. Mais retourne un objet qui implémente Windows. Foundation.Collections.IObservableVector<T>, où T est votre type d’élément. Consultez les contrôles d’éléments XAML ; liaison à une collection C++/WinRT.
Le compilateur C++ génère une erreur du formulaire « 'MyImplementationType_base<MyImplementationType>' : aucun constructeur par défaut approprié n’est disponible ». Cela peut se produire en cas de dérivation à partir d’un type ayant un constructeur non trivial. Le constructeur de votre type dérivé doit transmettre les paramètres dont le constructeur du type de base a besoin. Pour un exemple pratique, consultez Dérivation à partir d’un type qui possède un constructeur non trivial.
Le compilateur C++ génère l’erreur « impossible de convertir de 'const std ::vector<std ::wstring,std ::allocator<_Ty>>' en 'const winrt ::p aram ::async_iterable<winrt ::hstring> &' ». Cela peut se produire lorsque vous transmettez un std::vector de std::wstring à une API Windows Runtime qui attend une collection. Pour plus d’informations, consultez les types de données C++ Standard et C++/WinRT.
Le compilateur C++ génère l’erreur « impossible de convertir de 'const std::vector<winrt::hstring,std::allocator<_Ty>>' en '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. Pour plus d’informations, consultez les types de données C++ Standard et C++/WinRT.
Lors de l’ouverture d’un projet, Visual Studio génère l’erreur « L’application pour le projet n’est pas installée ». Si ce n'est déjà fait, vous devez installer les modèles SDK d'application Windows C++ et l'extension Visual Studio WinRT (VSIX) (voir Visual Studio prise en charge de C++/WinRT).
Les tests du Kit de certification application Windows produisent 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 finalement dériver d’un type dans l’espace de noms Windows ». Toute classe runtime (que vous déclarez dans votre application) qui dérive d’une classe de base est appelée classe composable . La classe de base ultime d’une classe composable doit être un type provenant d’un espace de noms Windows.* ou Microsoft.* ; par exemple, Microsoft. UI. Xaml.DependencyObject. Pour plus d’informations, consultez les contrôles XAML ; lier à une propriété C++/WinRT.
Le compilateur C++ génère une erreur « T doit être de type WinRT » pour une spécialisation déléguée EventHandler ou TypedEventHandler. Utilisez plutôt winrt::delegate<...T>. Consultez Les événements d’auteur en C++/WinRT.
Le compilateur C++ génère une erreur « T doit être de type WinRT » pour une spécialisation d’opération asynchrone Windows Runtime. Envisagez de renvoyer une tâche de la bibliothèque PPL (Parallel Patterns Library) plutôt. Consultez Concurrence et opérations asynchrones.
Le compilateur C++ génère une erreur « T doit être de type WinRT » lorsque vous appelez 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). Consultez les contrôles personnalisés XAML (basés sur des modèles).
Le compilateur C++ génère l’erreur C2220 : avertissement traité comme une erreur - aucun fichier 'object' généré. Corrigez l’avertissement, ou définissez C/C++>Général>Traiter les avertissements comme des erreurs sur Non (/WX-).
Votre application se bloque car un gestionnaire d’événements dans votre objet C++/WinRT est appelé une fois l’objet détruit. Consultez Accéder en toute sécurité au pointeur this à l’aide d’un délégué de gestion d’événements.
Le compilateur C++ génère l’« erreur C2338 : ceci est réservé à la prise en charge des références faibles ». 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. Consultez Désactiver la prise en charge des références faibles.
Le compilateur C++ produit « consume_Something : fonction qui retourne « auto » ne peut pas être utilisée avant sa définition . Voir C3779 : Pourquoi le compilateur me donne-t-il une erreur « consume_Something : la fonction qui retourne « auto » ne peut pas être utilisée avant qu’elle soit définie ?
L’éditeur de liens C++ génère « erreur LNK2019 : symbole externe non résolu » Voir Pourquoi l’éditeur de liens me donne-t-il une erreur « LNK2019 : symbole externe non résolu » ?.
La chaîne d’outils LLVM et Clang génère des erreurs lorsqu’elles sont utilisées avec C++/WinRT. Nous ne prenons pas en charge la chaîne d’outils LLVM et Clang pour C++/WinRT, mais si vous souhaitez émuler la façon dont nous l’utilisons en interne, vous pouvez essayer une expérience telle que celle décrite dans Can I use LLVM/Clang to compile with C++/WinRT ?.
Le compilateur C++ génère « aucun constructeur par défaut approprié disponible » pour un type projeté. 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 . Pour plus d’informations, consultez Utiliser des API avec C++/WinRT.
Le compilateur C++ génère « erreur C3861 : « from_abi » : identificateur introuvable » et d’autres erreurs provenant de base.h. Cette erreur peut s’afficher si vous utilisez Visual Studio 2017 (version 15.8.0 ou ultérieure) et que vous ciblez la version 10.0.17134.0 (Windows 10 version 1803 du SDK Windows). Ciblez une version ultérieure (plus conforme) du KIT de développement logiciel (SDK) Windows, ou définissez le mode de conformité du langage C/C++>Language>: Non (également, si /permissive- apparaît dans la propriété de projet C/C++>Language>Command Line sous Options supplémentaires, puis supprimez-le).
Le compilateur C++ génère l'« erreur C2039 : « IUnknown » : n’est pas membre de l’espace de noms global ». Découvrez comment recibler votre projet C++/WinRT vers une version ultérieure du SDK Windows.
L’éditeur de liens C++ génère « erreur LNK2019 : symbole externe non résolu _WINRT_CanUnloadNow@0 référencé dans la fonction _VSDesignerCanUnloadNow@0 » Découvrez comment recibler votre projet C++/WinRT vers une version ultérieure du SDK Windows.
Le processus de génération génère le message d’erreur : VSIX C++/WinRT ne fournit plus de prise en charge de la génération de projet. Ajoutez une référence de projet au Microsoft.Windows. Package Nuget CppWinRT. Installez le package NuGet Microsoft.Windows.CppWinRT dans votre projet. Pour plus d’informations, consultez les versions antérieures de l’extension VSIX.
L’éditeur de liens C++ génère une erreur LNK2019 : symbole externe non résolu, avec une mention de 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>.
Le compilateur C++ génère « erreur C4002 : Trop d’arguments pour l’appel de macro de type fonction GetCurrentTime ». Voir Comment résoudre les ambiguïtés avec GetCurrentTime et/ou TRY ?.
Le compilateur C++ produit « erreur C2334 : symbole(s) inattendu(s) avant « { » ; corps de fonction apparent ignoré ». Voir Comment résoudre les ambiguïtés avec GetCurrentTime et/ou 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 ». Vous devez #include <winrt/Microsoft.UI.Xaml.Markup.h>.
Le compilateur C++ génère « erreur C2039 : « promise_type » : n’est pas membre de « std ::experimental ::coroutine_traits<void> ». Votre coroutine doit retourner un objet d’opération asynchrone ou winrt::fire_and_forget. Consultez Concurrence et opérations asynchrones.
Votre projet produit un « accès ambigu de « PopulatePropertyInfoOverride ». Cette erreur peut se produire lorsque vous déclarez une classe de base dans votre IDL et une autre classe de base dans votre balisage XAML.
Le chargement d’une solution C++/WinRT pour la première fois génère « Échec de la génération designtime pour la configuration du projet « MyProject.vcxproj » « Debug|x86 ». IntelliSense peut être indisponible.". Ce problème lié à IntelliSense est résolu après la première génération.
Le fait de spécifier winrt::auto_revoke lors de l’inscription d’un délégué génère une exception winrt::hresult_no_interface. Consultez Si votre agent de révocation automatique ne parvient pas à s’enregistrer.
Dans une application C++/WinRT, lorsque vous consommez un composant C# Windows Runtime qui utilise XAML, le compilateur génère une erreur du formulaire « MyNamespace_XamlTypeInfo » : n'est pas membre de « winrt ::MyNamespace », où MyNamespace est le nom de l'espace de noms du composant Windows Runtime. Dans pch.h, dans l’application C++/WinRT consommatrice, ajoutez #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h> — en remplaçant MyNamespace selon le cas.
Dans un projet C++/WinRT dans Visual Studio, IntelliSense génère une erreur du type « erreur E1696 : impossible d’ouvrir le fichier source ». Compilez au moins une fois votre projet nouvellement créé. Faites ensuite un clic droit dans l’éditeur de code source >Réanalyser>Réanalyser le fichier. Cela résout toutes les erreurs IntelliSense, notamment E1696.

Note

Si cette rubrique n'a pas répondu à votre question, vous pouvez trouver de l'aide en visitant la communauté des développeurs Visual Studio C++ ou en utilisant la c++-winrt balise sur Stack Overflow.

Note

De nombreuses rubriques C++/WinRT sont en cours de migration de la documentation UWP vers cette section. Tant que la migration n’est pas terminée, les liens de la liste ci-dessous peuvent conduire à la section des documents UWP. La projection de langage C++/WinRT est la même pour les applications UWP et WinUI 3, afin que le contenu soit applicable dans les deux contextes. Tous les modèles spécifiques à UWP (tels que le cycle de vie des applications ou Windows.UI les API d’espace de noms) sont explicitement notés dans ces articles.