Problembehandlung bei C++/WinRT

Hinweis

Informationen zum Installieren und Verwenden der C++/WinRT Visual Studio Extension (VSIX) (die Projektvorlagenunterstützung bereitstellt) finden Sie unter Visual Studio Unterstützung für C++/WinRT.

Dieses Thema steht im Vordergrund, damit Sie es sofort erkennen können. auch wenn Sie es noch nicht benötigen. Die nachstehende Tabelle mit Problembehandlungssymptomen und Abhilfemaßnahmen kann hilfreich für Sie sein, unabhängig davon, ob Sie neuen Code ausschneiden oder eine vorhandene App portieren. Wenn Sie beim Portieren vorankommen und an den Punkt gelangen möchten, an dem Ihr Projekt erstellt und ausgeführt werden kann, können Sie vorübergehend Fortschritte machen, indem Sie allen nicht zwingend erforderlichen Code, der Probleme verursacht, auskommentieren oder streichen. Sie können zu einem späteren Zeitpunkt zurückkehren und Ihren Rückstand abarbeiten.

Eine Liste der häufig gestellten Fragen finden Sie in häufig gestellten Fragen.

Nachverfolgen von XAML-Problemen

XAML-Analyseausnahmen können schwierig zu diagnostizieren sein – insbesondere, wenn in der Ausnahme keine aussagekräftigen Fehlermeldungen vorhanden sind. Stellen Sie sicher, dass der Debugger so konfiguriert ist, dass Ausnahmen mit der ersten Chance erfasst werden (um die Analyseausnahme frühzeitig abzufangen). Möglicherweise können Sie die Ausnahmevariable im Debugger überprüfen, um festzustellen, ob das HRESULT oder die Nachricht nützliche Informationen enthält. Überprüfen Sie außerdem das Ausgabefenster Visual Studio auf Fehlermeldungen, die vom XAML-Parser ausgegeben werden.

Wenn Ihre App beendet wird und Sie nur wissen, dass während der XAML-Markupanalyse eine unbehandelte Ausnahme ausgelöst wurde, kann dies das Ergebnis eines Verweises (nach Schlüssel) auf eine fehlende Ressource sein. Oder es könnte sich um eine Ausnahme handeln, die in einem UserControl, einem benutzerdefinierten Steuerelement oder einem benutzerdefinierten Layoutpanel ausgelöst wurde. Eine letzte Möglichkeit ist eine binäre Aufteilung. Entfernen Sie etwa die Hälfte des Markups von einer XAML-Seite, und führen Sie die App erneut aus. Sie werden dann wissen, ob sich der Fehler in der Hälfte befindet, die Sie entfernt haben (die Sie jetzt in jedem Fall wiederherstellen sollten) oder in der Hälfte, die Sie nicht entfernt haben. Wiederholen Sie den Vorgang, indem Sie die Hälfte, die den Fehler enthält, erneut aufteilen, und so weiter, bis Sie das Problem eingegrenzt haben.

Symptome und Heilmittel

Symptom Abhilfe
Eine Ausnahme wird zur Laufzeit mit einem HRESULT-Wert von REGDB_E_CLASSNOTREGISTERED ausgelöst. Siehe Warum erhalte ich die Ausnahme „Klasse nicht registriert“?.
Der C++-Compiler erzeugt den Fehler "'implements_type': ist kein Mitglied einer direkten oder indirekten Basisklasse von '<projiziertem Typ>'". Dies kann passieren, wenn Sie make mit dem nicht namespace-qualifizierten Namen Ihres Implementierungstyps aufrufen (z. B. MyRuntimeClass) und den Header dieses Typs nicht eingebunden haben. Der Compiler interpretiert MyRuntimeClass als projizierten Typ. Die Lösung besteht darin, den Header für Ihren Implementierungstyp (MyRuntimeClass.hz. B.) einzuschließen.
Der C++-Compiler erzeugt den Fehler "versuch, auf eine gelöschte Funktion zu verweisen". Dies kann passieren, wenn Sie make aufrufen und der Implementierungstyp, den Sie als Vorlagenparameter übergeben, einen = delete Standardkonstruktor hat. Bearbeiten Sie die Headerdatei des Implementierungstyps, und ändern Sie sie = delete in = default. Sie können auch einen Konstruktor in die IDL für die Runtimeklasse einfügen.
Sie haben INotifyPropertyChanged implementiert, ihre XAML-Bindungen werden jedoch nicht aktualisiert (und die Benutzeroberfläche abonniert propertyChanged nicht). Denken Sie daran, Mode=OneWay (oder TwoWay) in Ihrem Bindungsausdruck im XAML-Markup festzulegen. Siehe XAML-Steuerelemente; Binden an eine C++/WinRT-Eigenschaft.
Sie binden ein XAML-Elementsteuerelement an eine feststellbare Auflistung, und eine Ausnahme wird zur Laufzeit mit der Meldung "Der Parameter ist falsch" ausgelöst. Deklarieren Sie in Ihrer IDL und Ihrer Implementierung eine beliebige feststellbare Sammlung als typ Windows. Foundation.Collections.IVector<IInspectable>. Geben Sie jedoch ein Objekt zurück, das Windows.Foundation.Collections.IObservableVector<T> implementiert, wobei T Ihr Elementtyp ist. Siehe XAML-Elementsteuerelemente; Binden an eine C++/WinRT-Auflistung.
Der C++-Compiler erzeugt einen Fehler des Formulars "'MyImplementationType_base<MyImplementationType>': kein geeigneter Standardkonstruktor verfügbar". Dies kann passieren, wenn Sie von einem Typ abgeleitet haben, der über einen nicht trivialen Konstruktor verfügt. Der Konstruktor des abgeleiteten Typs muss die Parameter an den Konstruktor des Basistyps weitergeben, die dieser benötigt. Ein funktionierendes Beispiel finden Sie unter Ableiten von einem Typ, der einen nicht trivialen Konstruktor hat.
Der C++-Compiler erzeugt den Fehler "'const std::vector<std::wstring,std::allocator<_Ty>>' kann nicht in 'const winrt::param::async_iterable<winrt::hstring> &' konvertiert werden". Dies kann passieren, wenn Sie einen std::vector von std::wstring an eine Windows-Runtime-API übergeben, die eine Auflistung erwartet. Weitere Informationen finden Sie unter C++-Standarddatentypen und C++/WinRT.
Der C++-Compiler meldet den Fehler "Konvertierung von 'const std::vector<winrt::hstring,std::allocator<_Ty>>' in 'const winrt::param::async_iterable<winrt::hstring> &' nicht möglich". Dies kann passieren, wenn Sie einen std::vector vom Typ winrt::hstring an eine asynchrone Windows-Runtime-API übergeben, die eine Sammlung erwartet, und Sie den Vektor zum asynchronen Aufrufer weder kopiert noch verschoben haben. Weitere Informationen finden Sie unter C++-Standarddatentypen und C++/WinRT.
Beim Öffnen eines Projekts erzeugt Visual Studio den Fehler "Die Anwendung für das Projekt ist nicht installiert". Falls noch nicht geschehen, müssen Sie die Windows App SDK C++-Vorlagen und die C++/WinRT Visual Studio Extension (VSIX) installieren (siehe Visual Studio Unterstützung für C++/WinRT).
Die Windows-App Zertifizierungskit-Tests führen zu einem Fehler, dass eine Ihrer Laufzeitklassen "nicht von einer Windows Basisklasse abgeleitet ist. Alle komponierbaren Klassen müssen letztendlich von einem Typ im Windows-Namespace abgeleitet werden". Jede Laufzeitklasse (die Sie in Ihrer Anwendung deklarieren), die von einer Basisklasse abgeleitet wird, wird als komponierbare Klasse bezeichnet. Die oberste Basisklasse einer zusammensetzbaren Klasse muss ein Typ aus einem Windows.*- oder Microsoft.*-Namespace sein; zum Beispiel Microsoft.UI.Xaml.DependencyObject. Weitere Informationen finden Sie unter XAML-Steuerelemente; Binden an eine C++/WinRT-Eigenschaft .
Der C++-Compiler erzeugt einen Fehler, der darauf hinweist, dass T ein WinRT-Typ sein muss, für eine EventHandler- oder TypedEventHandler-Delegatspezialisierung. Erwägen Sie stattdessen die Verwendung von winrt::delegate<...T>. Siehe Author-Ereignisse in C++/WinRT.
Der C++-Compiler gibt bei einer Spezialisierung für einen asynchronen Windows-Runtime-Vorgang den Fehler „T must be WinRT type“ aus. Erwägen Sie stattdessen, eine Parallel Patterns Library (PPL)- Aufgabe zurückzugeben. Siehe Parallelität und asynchrone Vorgänge.
Der C++-Compiler erzeugt einen Fehler "T muss WinRT-Typ sein", wenn Sie winrt::xaml_typename aufrufen. Verwenden Sie den projizierten Typ mit winrt::xaml_typename (z. B. BgLabelControlApp::BgLabelControl) und nicht den Implementierungstyp (z. B. nicht BgLabelControlApp::implementation::BgLabelControl). Siehe benutzerdefinierte XAML-Steuerelemente (vorlagenbasiert).
Der C++-Compiler erzeugt "Fehler C2220: Warnung als Fehler behandelt - keine 'Objekt'-Datei generiert". Korrigieren Sie entweder die Warnung, oder setzen Sie C/C++>Allgemein>Warnungen als Fehler behandeln auf Nein (/WX-).
Ihre App stürzt ab, da ein Ereignishandler in Ihrem C++/WinRT-Objekt aufgerufen wird, nachdem das Objekt zerstört wurde. Siehe Sicherer Zugriff auf den this-Zeiger mit einem Delegat für die Ereignisbehandlung.
Der C++-Compiler erzeugt "fehler C2338: Dies ist nur für schwache Referenzunterstützung". Sie fordern einen schwachen Verweis für einen Typ an, der die Markerstruktur winrt::no_weak_ref als Vorlagenargument an die Basisklasse übergeben hat. Siehe "Deaktivieren von schwacher Referenzunterstützung".
Der C++-Compiler erzeugt "consume_Something: Funktion, die 'auto' zurückgibt, kann nicht verwendet werden, bevor sie definiert wird" Siehe C3779: Warum gibt mir der Compiler einen Fehler "consume_Something: Funktion, die 'auto' zurückgibt, kann nicht verwendet werden, bevor sie definiert wird".
Der C++-Linker erzeugt „Fehler LNK2019: Nicht aufgelöstes externes Symbol Mehr dazu finden Sie unter Warum erhalte ich den Fehler „LNK2019: Nicht aufgelöstes externes Symbol“ vom Linker?.
Die LLVM- und Clang-Toolkette erzeugt Fehler, wenn sie mit C++/WinRT verwendet werden. Wir unterstützen die LLVM- und Clang-Toolkette für C++/WinRT nicht, aber wenn Sie die Verwendung intern emulieren möchten, können Sie ein Experiment wie die in "Can I use LLVM/Clang to compile with C++/WinRT?" beschriebene versuchen.
Der C++-Compiler erzeugt "keinen geeigneten Standardkonstruktor verfügbar" für einen projizierten Typ. Wenn Sie versuchen, die Initialisierung eines Laufzeitklassenobjekts zu verzögern oder eine Laufzeitklasse im selben Projekt zu nutzen und zu implementieren, müssen Sie den Konstruktor "std::nullptr_t " aufrufen. Weitere Informationen finden Sie unter Verwenden von APIs mit C++/WinRT.
Der C++-Compiler erzeugt "Fehler C3861: 'from_abi': Bezeichner nicht gefunden", und andere Fehler, die mit "base.h" stammen. Dieser Fehler wird möglicherweise angezeigt, wenn Sie Visual Studio 2017 (Version 15.8.0 oder höher) verwenden und auf die Windows SDK-Version 10.0.17134.0 (Windows 10, Version 1803) abzielen. Verwenden Sie entweder eine spätere (stärker standardkonforme) Version des Windows SDK, oder setzen Sie die Projekteigenschaft C/C++>Sprache>Konformitätsmodus: Nein (wenn außerdem /permissive- in der Projekteigenschaft C/C++>Sprache>Befehlszeile unter Zusätzliche Optionen erscheint, entfernen Sie es).
Der C++-Compiler erzeugt „Fehler C2039: "IUnknown" ist kein Member von "global namespace"“. Erfahren Sie, wie Sie Ihr C++/WinRT-Projekt auf eine höhere Version des Windows SDK umstellen.
Der C++-Linker erzeugt den Fehler „Fehler LNK2019: Verweis auf nicht aufgelöstes externes Symbol _WINRT_CanUnloadNow@0 in Funktion _VSDesignerCanUnloadNow@0“. Erfahren Sie, wie Sie Ihr C++/WinRT-Projekt auf eine höhere Version des Windows SDK umstellen.
Der Buildprozess erzeugt die Fehlermeldung Der C++/WinRT-VSIX bietet keine Unterstützung für Projektbuilds mehr. Bitte fügen Sie einen Projektverweis auf das NuGet-Paket Microsoft.Windows.CppWinRT hinzu.. Installieren Sie das Microsoft.Windows.CppWinRT NuGet-Paket in Ihrem Projekt. Ausführliche Informationen finden Sie in früheren Versionen der VSIX-Erweiterung.
Der C++-Linker erzeugt Fehler LNK2019: nicht aufgelöstes externes Symbol mit einer Erwähnung von winrt::impl::consume_Windows_Foundation_Collections_IVector. Wenn Sie seit C++/WinRT 2.0 ein bereichsbasiertes for in einer Windows-Runtime-Sammlung verwenden, müssen Sie jetzt #include <winrt/Windows.Foundation.Collections.h> ausführen.
Der C++-Compiler erzeugt "error C4002: Too many arguments for function-like macro invocation GetCurrentTime". Erfahren Sie , wie kann ich Mehrdeutigkeiten mit GetCurrentTime und/oder TRY lösen?.
Der C++-Compiler erzeugt "Fehler C2334: unerwartete Token vor '{'; Scheinbarer Funktionskörper wird übersprungen". Erfahren Sie , wie kann ich Mehrdeutigkeiten mit GetCurrentTime und/oder TRY lösen?.
Der C++-Compiler erzeugt „winrt::impl::produce<D,I>: Instanz von abstrakter Klasse kann nicht erstellt werden, da "GetBindingConnector" nicht vorhanden ist“. Sie müssen #include <winrt/Microsoft.UI.Xaml.Markup.h>.
Der C++-Compiler erzeugt "error C2039: 'promise_type': ist kein Element von 'std::experimental::coroutine_traits<void>'". Die Coroutine muss ein Objekt eines asynchronen Vorgangs oder winrt::fire_and_forget zurückgeben. Siehe Parallelität und asynchrone Vorgänge.
Ihr Projekt erzeugt „mehrdeutiger Zugriff auf 'PopulatePropertyInfoOverride'“. Dieser Fehler kann auftreten, wenn Sie eine Basisklasse in Ihrer IDL und eine andere Basisklasse in Ihrem XAML-Markup deklarieren.
Beim ersten Laden einer C++/WinRT-Projektmappe wird „Fehler beim Entwurfszeitbuild für das Projekt "MyProject.vcxproj", Konfiguration "Debug|x 86". IntelliSense ist möglicherweise nicht verfügbar.“. Dieses IntelliSense-Problem löst sich nach dem ersten Buildvorgang.
Der Versuch, winrt::auto_revoke bei der Registrierung eines Delegaten anzugeben, führt zu einer winrt::hresult_no_interface-Ausnahme. Siehe Wenn Ihr Delegierter für den automatischen Widerruf nicht registriert werden kann.
In einer C++/WinRT-App erzeugt der Compiler bei der Verwendung einer C#-Windows-Runtime-Komponente, die XAML verwendet, einen Fehler des Formulars "'MyNamespace_XamlTypeInfo': ist kein Mitglied von 'winrt::MyNamespace'", wobei MyNamespace der Name des Namespaces der Windows-Runtime Komponente ist. In pch.h fügen Sie in der aufrufenden C++/WinRT-App #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h> hinzu, und ersetzen Sie dabei MyNamespace nach Bedarf.
In einem C++/WinRT-Projekt in Visual Studio erzeugt IntelliSense einen Fehler der Form "Fehler E1696: Quelldatei kann nicht geöffnet werden". Kompilieren Sie das neu erstellte Projekt mindestens einmal. Klicken Sie dann im Quellcode-Editor mit der rechten Maustaste auf >Rescan>Rescan File. Dadurch werden alle IntelliSense-Fehler behoben, einschließlich E1696.

Hinweis

Wenn Dieses Thema Ihre Frage nicht beantwortet hat, finden Sie möglicherweise Hilfe, indem Sie die Visual Studio C++-Entwicklercommunity besuchen oder das c++-winrt Tag auf Stack Overflow verwenden.

Hinweis

Viele C++/WinRT-Themen werden von der UWP-Dokumentation zu diesem Abschnitt migriert. Bis die Migration abgeschlossen ist, können Links in der nachstehenden Liste zum Abschnitt "UWP-Dokumente" führen. Die C++/WinRT-Sprachprojektion ist für UWP- und WinUI 3-Apps identisch, sodass Inhalte in beiden Kontexten anwendbar sind. Alle UWP-spezifischen Muster (z. B. App-Lebenszyklus- oder Windows.UI Namespace-APIs) werden in diesen Artikeln explizit aufgeführt.