Partager via


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

Remarque

Pour plus d’informations sur l’installation et l’utilisation des C++/WinRT Visual Studio Extension (VSIX) (qui fournit une prise en charge des modèles de projet), consultez prise en charge de Visual Studio pour 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 des symptômes de dépannage et des remèdes ci-dessous peut vous être utile si vous écrivez de nouveau code ou portez une application existante. Si vous effectuez un portage et que vous êtes impatient d'avancer et de passer à l'étape où votre projet est construit et s'exécute, vous pouvez faire des progrès temporaires en commentant ou en remplaçant tout code non essentiel qui provoque des problèmes, puis en revenant plus tard pour rembourser cette dette.

Pour obtenir la liste des questions fréquemment posées, consultez 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 occurrence (pour essayer d'intercepter l'exception d'analyse dès le début). 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 de sortie de Visual Studio pour connaître la sortie des messages d’erreur par l’analyseur XAML.

Si votre application se termine et que tout ce que vous savez est qu’une exception non gérée a été levée pendant l’analyse de balisage XAML, cela peut être le résultat d’une référence (par clé) à une ressource manquante. Ou bien, il peut s’agir d’une exception levée à l’intérieur d’un UserControl, d’un contrôle personnalisé ou d’un panneau de mise en page 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 fractionnant la moitié qui contient l’erreur, et ainsi de suite, jusqu’à ce que vous ayez cerné le problème.

Symptômes et remèdes

Symptôme Remède
Une exception est levée au moment de l’exécution avec une valeur HRESULT de *REGDB_E_CLASSNOTREGISTERED*. Consultez Pourquoi ai-je 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 avec le nom non qualifié de votre type d’implémentation (MyRuntimeClass, par exemple) et que vous n’avez pas inclus l’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. Voir 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 au moment de 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 et lier à 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 lorsque vous avez dérivé d’un type qui a 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 concret, consultez Dérivation d’un type qui a 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 passez un std::vector de std::wstring à une API Windows Runtime qui attend une collection. Pour plus d’informations, consultez types de données standard C++ 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 lorsque 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 transféré le vecteur vers le destinataire asynchrone. Pour plus d’informations, consultez types de données standard C++ et C++/WinRT.
Lors de l’ouverture d’un projet, Visual Studio génère l’erreur « L’application du projet n’est pas installée ». Si ce n’est déjà fait, vous devez installer Outils Windows Universels pour le développement en C++ depuis le dialogue Nouveau projet de Visual Studio. Si cela ne résout pas le problème, le projet peut dépendre de l’extension Visual Studio C++/WinRT (VSIX) (consultez la prise en charge de Visual Studio pour C++/WinRT.
Les tests du Kit de certification des applications 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.* ; par exemple, Windows.UI.Xaml.DependencyObject. Consultez contrôles XAML ; liez à une propriété C++/WinRT pour plus d’informations.
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. Envisagez d’utiliser winrt::delegate<...T> à la place. Consultez É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. Pensez à retourner une tâche dans la bibliothèque de modèles parallèles (PPL) à la place. Consultez Concurrence et les 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 contrôles XAML personnalisés (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 ce pointeur avec un délégué de gestion des événements.
Le compilateur C++ génère « erreur C2338: ceci est seulement pour le support de référence faible». 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. Consulter Choisir de ne pas utiliser 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 Consommer 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 ciblez le SDK Windows version 10.0.17134.0 (Windows 10, version 1803). 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 ' ''espace de noms global'' ». Consultez Comment recibler votre projet C++/WinRT vers une version ultérieure du Kit de développement logiciel (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 » Consultez Comment recibler votre projet C++/WinRT vers une version ultérieure du Kit de développement logiciel (SDK) Windows.
Le processus de compilation produit le message d’erreur , le C++/WinRT VSIX ne prend plus en charge la compilation des projets. Veuillez ajouter une référence de projet au package Nuget Microsoft.Windows.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 erreur LNK2019 : symbole externe non résolu, avec une mention de winrt ::impl ::consume_Windows_Foundation_Collections_IVector. À partir de C++/WinRT 2.0, si vous utilisez un for basé sur une plage sur une collection Windows Runtime, vous devez maintenant #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++ génère « erreurC2334 : jetons inattendus précédents « { » ; ignorer le corps de la fonction apparente». Voir Comment résoudre les ambiguïtés avec GetCurrentTime et/ou TRY ?.
Le compilateur C++ produit «winrt ::impl ::produce<D,I> ne peut pas instancier la classe abstraite, en raison de l'absence deGetBindingConnector ». Vous devez #include <winrt/Windows.UI.Xaml.Markup.h>.
Le compilateur C++ génère l'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 les opérations asynchrones.
Votre projet génère 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 IntelliSense sera résolu après votre première compilation.
Toute tentative de spécification de winrt::auto_revoke lors de l'inscription d'un délégué produit une exception winrt::hresult_no_interface. Consultez si votre délégué de révocation automatique ne parvient pas à enregistrer.
Dans une application C++/WinRT, lorsque vous consommez un composant Windows Runtime C# qui utilise XAML, le compilateur génère une erreur du formulaire « MyNamespace_XamlTypeInfo » : n’est pas membre de « winrt ::MyNamespace »,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 si nécessaire.
Dans un projet C++/WinRT dans Visual Studio, IntelliSense génère une erreur du formulaire « erreur E1696 : impossible d’ouvrir un fichier open source ». Compilez au moins une fois votre projet nouvellement créé. Cliquez ensuite avec le bouton droit dans l’éditeur de code source >Rescan>Rescan File. Cela résout toutes les erreurs IntelliSense, notamment E1696.

Remarque

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 balise c++-winrt sur Stack Overflow.