Dela via


Felsöka problem med C++/WinRT

Anmärkning

Information om hur du installerar och använder C++/WinRT Visual Studio Extension (VSIX) (som tillhandahåller stöd för projektmallar) finns i Visual Studio-stöd för C++/WinRT-.

Det här ämnet är placerat i främsta rummet så att du är medveten om det direkt, även om du inte behöver det än. Tabellen med felsökningssymptom och åtgärder nedan kan vara till hjälp om du klipper ny kod eller porterar en befintlig app. Om du porterar och är angelägen om att gå vidare och komma till den fas där projektet bygger och körs kan du göra tillfälliga framsteg genom att kommentera eller stubba ut eventuell icke-nödvändig kod som orsakar problem och sedan återgå till att betala av den skulden senare.

En lista över vanliga frågor och svar finns i Vanliga frågor och svar.

Spåra XAML-problem

XAML-parsningsfel kan vara svåra att diagnostisera, särskilt om det inte finns några meningsfulla felmeddelanden i undantaget. Kontrollera att felsökaren är konfigurerad för att fånga undantag från första chansen (för att försöka fånga upp parsningsfelet tidigt). Du kanske kan inspektera undantagsvariabeln i felsökningsprogrammet för att avgöra om HRESULT eller meddelandet har någon användbar information. Kontrollera även utdatafönstret i Visual Studio för felmeddelanden som matas ut av XAML-parsern.

Om din app avslutas och allt du vet är att ett ohanterat undantag utlöstes under parsning av XAML-markup, kan det bero på en referens via nyckel till en saknad resurs. Eller så kan det vara ett undantag som genereras i en UserControl, en anpassad kontroll eller en anpassad layoutpanel. En sista utväg är en binär delning. Ta bort ungefär hälften av markeringen från en XAML-sida och kör appen igen. Sedan vet du om felet finns någonstans inom den halva som du tog bort (som du nu bör återställa i alla fall) eller i den halva som du inte tog bort. Upprepa processen genom att dela upp den halva som innehåller felet och så vidare tills du har nollställt problemet.

Symtom och åtgärder

Symtom Botemedel
Ett undantag utlöses under körning med HRESULT-värdet REGDB_E_CLASSNOTREGISTERED. Se Varför får jag ett undantag för "klassen är inte registrerad"?.
C++-kompilatorn genererar felet ""implements_type": är inte medlem i någon direkt eller indirekt basklass av<projicerad typ>. Detta kan inträffa när du anropar göra med det namnområdes-okvalificerade namnet för din implementeringstyp (MyRuntimeClass, till exempel) och du inte har inkluderat den typens huvud. Kompilatorn tolkar MyRuntimeClass som den projicerade typen. Lösningen är att inkludera headern för din implementeringstyp (MyRuntimeClass.h, till exempel).
C++-kompilatorn genererar felet "försöker referera till en borttagen funktion". Detta kan inträffa när du anropar göra och den implementeringstyp som du skickar som mallparameter har en = delete standardkonstruktor. Redigera implementeringstypens huvudfil och ändra = delete till = default. Du kan också lägga till en konstruktor i IDL-gränssnittet för körningsklassen.
Du har implementerat INotifyPropertyChanged, men dina XAML-bindningar uppdateras inte (och användargränssnittet prenumererar inte på PropertyChanged). Kom ihåg att ange Mode=OneWay (eller TwoWay) på bindningsuttrycket i XAML-markering. Se XAML-kontroller och bind till en C++/WinRT-egenskap.
Du binder en XAML-objektkontroll till en observerbar samling och ett undantag genereras vid körning med meddelandet "Parametern är felaktig". I din IDL och din implementering deklarerar du alla observerbara samlingar som typen Windows.Foundation.Collections.IVector<IInspectable>. Men returnera ett objekt som implementerar Windows.Foundation.Collections.IObservableVector<T>, där T är din elementtyp. Se kontroller för XAML-objekt; binda till en C++/WinRT-samling.
C++-kompilatorn genererar ett fel i formuläret "'MyImplementationType_base<MyImplementationType>': ingen lämplig standardkonstruktor tillgänglig". Detta kan inträffa när du har härlett från en typ med en icke-trivial konstruktor. Konstruktorn för den härledda typen måste vidarebefordra de parametrar som bastypens konstruktor behöver. För ett arbetsexempel, se Härledning från en typ med en icke-trivial konstruktor.
C++-kompilatorn skapar felet "det går inte att konvertera från 'const std::vector<std::wstring,std::allocator<_Ty>>' till 'const winrt::p aram::async_iterable<winrt::hstring> &'". Detta kan inträffa när du skickar en std::vector av std::wstring till ett Windows Runtime-API som förväntar sig en samling. Mer information finns i C++-standarddatatyper och C++/WinRT-.
C++-kompilatorn skapar felet "det går inte att konvertera från 'const std::vector<winrt::hstring,std::allocator<_Ty>>' till 'const winrt::p aram::async_iterable<winrt::hstring> &'". Detta kan inträffa när du skickar en std::vector av winrt::hstring till ett asynkront Windows Runtime-API som förväntar sig en samling, och du varken har kopierat eller flyttat vektorn till den asynkrona anropare. Mer information finns i C++-standarddatatyper och C++/WinRT-.
När du öppnar ett projekt genererar Visual Studio felet "Programmet för projektet är inte installerat". Om du inte redan har gjort det måste du installera Universella Windows-verktyg för C++-utveckling inifrån dialogrutan Nytt projekt i Visual Studio. Om det inte löser problemet kan projektet bero på C++/WinRT Visual Studio-tillägget (VSIX) (se Visual Studio-stöd för C++/WinRT-.
Windows App Certification Kit-testerna uppstår ett fel där en av dina runtime-klasser "" inte härleds från en Windows-basklass. Alla sammansättningsbara klasser måste i slutändan härledas från en typ i Windows-namnområdet "". Alla körtidsklasser (som du deklarerar i din applikation) som härleds från en basklass kallas för en komponerbar-klass. Den ultimata basklassen för en sammansättningsbar klass måste vara en typ som har sitt ursprung i ett Windows.* -namnområde. till exempel Windows.UI.Xaml.DependencyObject. Se XAML-kontroller; bind till en C++/WinRT-egenskap för mer information.
C++-kompilatorn genererar ett felmeddelande "T måste vara WinRT-typ" för en EventHandler- eller TypedEventHandler-delegatspecialisering. Överväg att använda winrt::delegate<... T> i stället. Se Författarhändelser i C++/WinRT.
C++-kompilatorn skapar felet "T måste vara WinRT-typ" för en asynkron Windows Runtime-åtgärdsspecialisering. Överväg att returnera ett PPL-bibliotek (Parallel Patterns Library) uppgift i stället. Se Samtidighet och asynkrona åtgärder.
C++-kompilatorn skapar felet "T måste vara WinRT-typ" när du anropar winrt::xaml_typename. Använd den projicerade typen med winrt::xaml_typename (använd till exempel BgLabelControlApp::BgLabelControl), och inte implementeringstypen (använd till exempel inte BgLabelControlApp::implementation::BgLabelControl). Se anpassade XAML-kontroller (mallade).
C++-kompilatorn genererar "fel C2220: varning behandlas som fel – ingen 'object'-fil genererades". Korrigera varningen eller ange C/C++>Allmänt>Behandla varningar som fel till Nej (/WX-).
Appen kraschar eftersom en händelsehanterare i C++/WinRT-objektet anropas efter att objektet har förstörts. Se På ett säkert sätt komma åt den här pekaren med ett ombud för händelsehantering.
C++-kompilatorn producerar "fel C2338: Detta är endast för svagt referensstöd". Du begär en svag referens för en typ som använde winrt::no_weak_ref markeringsstruktur som ett mallargument till sin basklass. Se Välja bort stöd för svaga referenser.
C++-kompilatorn ger felmeddelandet "consume_Something: funktion som returnerar 'auto' kan inte användas innan den är definierad" Se C3779: Varför ger kompilatorn mig felet "consume_Something: funktion som returnerar "auto" kan inte användas innan den definieras?.
C++-länkaren ger "fel LNK2019: Olöst extern symbol" Se Varför ger länkaren mig ett felmeddelande "LNK2019: Olöst extern symbol"?.
Verktygskedjan LLVM och Clang genererar fel när de används med C++/WinRT. Vi stöder inte LLVM- och Clang-verktygskedjan för C++/WinRT, men om du vill emulera hur vi använder den internt kan du prova ett experiment som det som beskrivs i Kan jag använda LLVM/Clang för att kompilera med C++/WinRT?.
C++-kompilatorn producerar "ingen lämplig standardkonstruktor tillgänglig" för en projekterad typ. Om du försöker fördröja initieringen av ett körningsklassobjekt eller använda och implementera en körningsklass i samma projekt måste du anropa konstruktorn std::nullptr_t. För mer information, se Använd API:er med C++/WinRT.
C++-kompilatorn genererarfel C3861: "from_abi": identifieraren hittades inte", och andra fel med ursprung i base.h. Du kan se det här felet om du använder Visual Studio 2017 (version 15.8.0 eller senare) och riktar in dig på Windows SDK version 10.0.17134.0 (Windows 10, version 1803). Ange antingen en senare (mer överensstämmande) version av Windows SDK eller ställ in projektegenskapen C/C++>Language>Conformance mode: No (om /permissive- också dyker upp i projektegenskapen C/C++>Language>Command Line under Ytterligare alternativ, ta då bort den).
C++-kompilatorn skaparfel C2039: 'IUnknown': är inte medlem i ''global namespace''". Se Så här gör du om ditt C++/WinRT-projekt till en senare version av Windows SDK-.
C++-länkaren resulterar ifel LNK2019: olöst extern symbol _WINRT_CanUnloadNow@0 som refereras av funktionen _VSDesignerCanUnloadNow@0. Se Så här gör du om ditt C++/WinRT-projekt till en senare version av Windows SDK-.
Byggprocessen genererar felmeddelandet C++/WinRT VSIX inte längre har stöd för projektbygge. Lägg till en projektreferens till Nuget-paketet Microsoft.Windows.CppWinRT. Installera Microsoft.Windows.CppWinRT- NuGet-paketet i projektet. Mer information finns i Tidigare versioner av VSIX-tillägget.
C++-länkaren genererar fel LNK2019: olöst extern symbol, med ett omnämnande av winrt::impl::consume_Windows_Foundation_Collections_IVector. Från och med C++/WinRT 2.0behöver du nu forom du använder en intervallbaserad #include <winrt/Windows.Foundation.Collections.h> på en Windows Runtime-samling.
C++-kompilatorn genererar "fel C4002: För många argument för funktionsliknande makroanrop GetCurrentTime". Se Hur löser jag tvetydigheter med GetCurrentTime och/eller TRY?.
C++-kompilatorn genererar "fel C2334: oväntade token(er) före {; hoppar över den synliga funktionskroppen". Se Hur löser jag tvetydigheter med GetCurrentTime och/eller TRY?.
C++ kompilatorn producerar "winrt::impl::produce<D,I> kan inte instansiera abstrakt klass på grund av saknad GetBindingConnector". Du måste #include <winrt/Windows.UI.Xaml.Markup.h>.
C++-kompilatorn producerarfel C2039: "promise_type": är inte medlem i 'std::experimental::coroutine_traits<void>'". Din korutin måste antingen returnera ett objekt för asynkron åtgärd eller winrt::fire_and_forget. Se Samtidighet och asynkrona åtgärder.
Projektet ger "tvetydig åtkomst till "PopulatePropertyInfoOverride"". Det här felet kan inträffa när du deklarerar en basklass i din IDL och en annan basklass i XAML-markering.
När du laddar en C++/WinRT-lösning för första gången genereras meddelandet "Designtime-bygget misslyckades för projektet 'MyProject.vcxproj' konfiguration 'Debug|x86'. IntelliSense kanske inte är tillgänglig.". Det här IntelliSense-problemet löser sig när du har skapat för första gången.
Om du försöker ange winrt::auto_revoke vid registrering av en delegerad, genereras ett winrt::hresult_no_interface-undantag. se om ditt automatiska återkallningsombud inte kan registrera.
I en C++/WinRT-app, när du använder en C# Windows Runtime-komponent som använder XAML, genererar kompilatorn ett fel i formuläret "'MyNamespace_XamlTypeInfo': är inte medlem i 'winrt::MyNamespace'"— där MyNamespace är namnet på Windows Runtime-komponentens namnområde. I pch.h i den förbrukande C++/WinRT-appen lägger du till #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h>– och ersätter MyNamespace- efter behov.
I ett C++/WinRT-projekt i Visual Studio genererar IntelliSense ett fel i formuläret "fel E1696: det går inte att öppna källfilen". Kompilera det nyligen skapade projektet minst en gång. Högerklicka sedan i källkodsredigeraren >Genomsök om>Genomsök fil. Det löser alla IntelliSense-fel, inklusive E1696.

Anmärkning

Om det här avsnittet inte besvarade din fråga kan du få hjälp genom att gå till Visual Studio C++-utvecklarcommunityn, eller genom att använda taggen c++-winrt på Stack Overflow.