Problemen met C++/WinRT oplossen

Note

Voor informatie over het installeren en gebruiken van de Visual Studio-extensie (VSIX) voor C++/WinRT (die ondersteuning voor projectsjablonen biedt), zie Visual Studio-ondersteuning voor C++/WinRT.

Dit onderwerp staat vooraan, zodat u er meteen van op de hoogte bent; zelfs als je het nog niet nodig hebt. De onderstaande tabel met symptomen en oplossingen voor het oplossen van problemen kan nuttig zijn, ongeacht of u nieuwe code snijdt of een bestaande app overgezet. Als u porting uitvoert en u wilt vooruitgaan en naar de fase gaan waarin uw project wordt gebouwd en uitgevoerd, kunt u tijdelijke vooruitgang boeken door opmerkingen te maken of elke niet-essentiële code uit te voeren die problemen veroorzaakt en die later terugkeert om die schuld af te lossen.

Zie Veelgestelde vragen voor een lijst met veelgestelde vragen.

XAML-problemen bijhouden

XAML-parseringsfouten kunnen moeilijk te diagnosticeren zijn, met name als er geen zinvolle foutberichten binnen de uitzondering zijn. Zorg ervoor dat de debugger zo is geconfigureerd dat first-chance-uitzonderingen worden onderschept (om de parse-uitzondering vroegtijdig te kunnen opvangen). Mogelijk kunt u de uitzonderingsvariabele in het foutopsporingsprogramma inspecteren om te bepalen of het HRESULT of bericht nuttige informatie bevat. Controleer ook het uitvoervenster van Visual Studio op foutberichten die worden uitgevoerd door de XAML-parser.

Als uw app wordt beëindigd en u weet dat er een niet-verwerkte uitzondering is opgetreden tijdens het parseren van XAML-markeringen, kan dit het resultaat zijn van een verwijzing (per sleutel) naar een ontbrekende resource. Of het zou een uitzondering kunnen zijn die wordt gegenereerd in een UserControl, een aangepast besturingselement of een aangepast lay-outpaneel. Een laatste redmiddel is een binaire splitsing. Verwijder ongeveer de helft van de markeringen van een XAML-pagina en voer de app opnieuw uit. Vervolgens weet u of de fout zich ergens in de helft bevindt die u hebt verwijderd (die u nu in elk geval moet herstellen) of in de helft die u niet hebt verwijderd. Herhaal het proces door de helft te splitsen die de fout bevat, enzovoort, totdat u het probleem hebt opgelost.

Symptomen en oplossingen

Symptoom Oplossing
Er wordt tijdens runtime een uitzondering gegenereerd met een HRESULT-waarde van REGDB_E_CLASSNOTREGISTERED. Zie Waarom krijg ik een uitzondering 'klasse niet geregistreerd'?
De C++-compiler produceert de fout 'implements_type': is geen lid van een directe of indirecte basisklasse van '<projected type>'. Dit kan gebeuren wanneer u make aanroept met de niet-gekwalificeerde naam zonder naamruimte van uw implementatietype (bijvoorbeeld MyRuntimeClass) en u het headerbestand van dat type niet hebt opgenomen. De compiler interpreteert MyRuntimeClass als het verwachte type. De oplossing is het opnemen van de header voor uw implementatietype (MyRuntimeClass.hbijvoorbeeld).
De C++-compiler produceert de fout "poging om te verwijzen naar een verwijderde functie". Dit kan gebeuren wanneer u make aanroept en het implementatietype dat u doorgeeft als sjabloonparameter een = delete standaardconstructor heeft. Bewerk het headerbestand van het implementatietype en wijzig = delete in = default. U kunt ook een constructor toevoegen aan de IDL voor de runtimeklasse.
U hebt INotifyPropertyChanged geïmplementeerd, maar uw XAML-bindingen worden niet bijgewerkt (en de gebruikersinterface is niet geabonneerd op PropertyChanged). Vergeet niet om Mode=OneWay (of TwoWay) in te stellen voor uw bindings-expressie in XAML-opmaak. Zie XAML-besturingselementen; bind aan een C++/WinRT-eigenschap.
U bindt een besturingselement voor XAML-items aan een waarneembare verzameling en er wordt tijdens runtime een uitzondering gegenereerd met het bericht 'De parameter is onjuist'. Declareer in uw IDL en uw implementatie een waarneembare verzameling als het type Windows. Foundation.Collections.IVector<IInspectable>. Maar retourneer een object dat Windows.Foundation.Collections.IObservableVector<T> implementeert, waarbij T het type van uw element is. Zie besturingselementen voor XAML-items; bind aan een C++/WinRT-verzameling.
De C++-compiler produceert een fout van het formulier ''MyImplementationType_base<MyImplementationType>': er is geen geschikte standaardconstructor beschikbaar. Dit kan gebeuren wanneer u bent afgeleid van een type dat een niet-triviale constructor heeft. De constructor van het afgeleide type moet de parameters doorgeven die de constructor van het basistype nodig heeft. Zie Afgeleid van een type met een niet-triviaal constructor voor een werkvoorbeeld.
De C++-compiler geeft de fout "kan niet worden geconverteerd van 'const std::vector<std::wstring,std::allocator<_Ty>>' naar 'const winrt::param::async_iterable<winrt::hstring> &'". Dit kan gebeuren wanneer u een std::vector van std::wstring doorgeeft aan een Windows Runtime-API die een verzameling verwacht. Zie Standard C++ gegevenstypen en C++/WinRT voor meer informatie.
De C++-compiler produceert de fout 'kan niet worden geconverteerd van 'const std::vector<winrt::hstring,std::allocator<_Ty>>' naar 'const winrt::p aram::async_iterable<winrt::hstring> &'. Dit kan gebeuren als u een std::vector van winrt::hstring doorgeeft aan een asynchrone Windows Runtime-API die een verzameling verwacht, en u de vector niet hebt gekopieerd of verplaatst naar de aangeroepen asynchrone functie. Zie Standard C++ gegevenstypen en C++/WinRT voor meer informatie.
Bij het openen van een project produceert Visual Studio de fout 'De toepassing voor het project is niet geïnstalleerd'. Als u dat nog niet hebt gedaan, moet u de Windows App SDK C++-sjablonen en de extensie C++/WinRT Visual Studio (VSIX) installeren (zie Visual Studio ondersteuning voor C++/WinRT).
De Windows-app Certification Kit-tests produceren een fout dat een van uw runtimeklassen niet is afgeleid van een Windows basisklasse. Alle composeerbare klassen moeten uiteindelijk worden afgeleid van een type in de Windows naamruimte". Elke runtimeklasse (die u in uw toepassing declareert) die is afgeleid van een basisklasse, wordt een samenstelbare klasse genoemd. De ultieme basisklasse van een composeerbare klasse moet een type zijn dat afkomstig is van een Windows.* of Microsoft.* naamruimte, bijvoorbeeld Microsoft. UI. Xaml.DependencyObject. Zie XAML-besturingselementen; bind aan een C++/WinRT-eigenschap voor meer informatie.
De C++-compiler produceert een fout 'T moet WinRT-type zijn' voor een EventHandler- of TypedEventHandler-gemachtigdenspecialisatie. Overweeg in plaats daarvan winrt::delegate<...T> te gebruiken. Zie Auteursgebeurtenissen in C++/WinRT.
De C++-compiler produceert een fout 'T moet WinRT-type zijn' voor een Windows Runtime asynchrone bewerkingsspecialisatie. Overweeg om in plaats daarvan een Parallel Patterns Library (PPL) taak te retourneren. Zie Gelijktijdigheid en asynchrone bewerkingen.
De C++-compiler produceert de fout 'T moet WinRT-type zijn' wanneer u winrt::xaml_typename aanroept. Gebruik het verwachte type met winrt::xaml_typename (gebruik bijvoorbeeld BgLabelControlApp::BgLabelControl) en niet het implementatietype (gebruik bijvoorbeeld BgLabelControl::implementation:BgLabelControl). Zie aangepaste (sjabloon)besturingselementen voor XAML.
De C++ compiler produceert 'fout C2220: waarschuwing behandeld als fout - geen objectbestand gegenereerd'. Corrigeer de waarschuwing of stel C/C++>Algemene>waarschuwingen behandelen als fouten in op Nee (/WX-).
Uw app loopt vast omdat een gebeurtenis-handler in uw C++/WinRT-object wordt aangeroepen nadat het object is vernietigd. Zie Veilig toegang krijgen tot deze aanwijzer met een gemachtigde voor gebeurtenisafhandeling.
De C++-compiler produceert 'fout C2338: Dit is alleen voor zwakke ref-ondersteuning'. U vraagt een zwakke verwijzing aan voor een type dat de winrt::no_weak_ref markeringsstruct als sjabloonargument heeft doorgegeven aan de basisklasse. Zie Afmelden voor zwakke referentieondersteuning.
De C++-compiler produceert 'consume_Something: functie die automatisch retourneert, kan niet worden gebruikt voordat deze is gedefinieerd' Zie C3779: Waarom geeft de compiler me een foutmelding "consume_Something: functie die 'auto' teruggeeft, kan niet worden gebruikt voordat die is gedefinieerd"?.
De C++-linker produceert 'fout LNK2019: Niet-opgelost extern symbool' Zie Waarom geeft de linker me de foutmelding "LNK2019: Unresolved external symbol"?.
De LLVM- en Clang-hulpprogrammaketen produceert fouten bij gebruik met C++/WinRT. We bieden geen ondersteuning voor de LLVM- en Clang-hulpprogrammaketen voor C++/WinRT, maar als u wilt emuleren hoe we het intern gebruiken, kunt u een experiment proberen, zoals het experiment dat wordt beschreven in Kan ik LLVM/Clang gebruiken om te compileren met C++/WinRT?.
De C++-compiler produceert 'geen geschikte standaardconstructor beschikbaar' voor een geprojecteerd type. Als u de initialisatie van een runtimeklasseobject probeert uit te stellen of een runtimeklasse in hetzelfde project wilt gebruiken en implementeren, moet u de constructor std::nullptr_t aanroepen. Zie API's gebruiken met C++/WinRT voor meer informatie.
De C++-compiler produceert 'fout C3861: 'from_abi': id niet gevonden' en andere fouten die afkomstig zijn uit base.h. Deze fout kan optreden als u Visual Studio 2017 (versie 15.8.0 of hoger) gebruikt en als doel hebt op de Windows SDK versie 10.0.17134.0 (Windows 10, versie 1803). Richt een latere (meer conforme) versie van de Windows SDK in of stel de projecteigenschap C/C++>Language>Conformance-modus in: Nee (ook als /permissive- wordt weergegeven in projecteigenschap C/C++>Language Command>Line onder Aanvullende opties en verwijder deze).
De C++ compiler produceert 'error C2039: 'IUnknown': is geen lid van ''global namespace''. Zie Hoe u uw C++/WinRT-project opnieuw als doel instelt voor een nieuwere versie van de Windows SDK.
De C++-linker produceert 'fout LNK2019: niet-opgelost extern symbool _WINRT_CanUnloadNow@0 waarnaar wordt verwezen in functie _VSDesignerCanUnloadNow@0' Zie Hoe u uw C++/WinRT-project opnieuw als doel instelt voor een nieuwere versie van de Windows SDK.
Het buildproces produceert het foutbericht C++/WinRT VSIX biedt geen ondersteuning meer voor projectbuilds. Voeg een projectreferentie toe aan de Microsoft.Windows. CppWinRT Nuget-pakket. Installeer de Microsoft.Windows. CppWinRT NuGet-pakket in uw project. Zie Eerdere versies van de VSIX-extensie voor meer informatie.
De C++-linker produceert fout LNK2019: niet-opgelost extern symbool, met een vermelding van winrt::impl::consume_Windows_Foundation_Collections_IVector. Vanaf C++/WinRT 2.0 geldt: als u een op een bereik gebaseerde for gebruikt op een Windows Runtime-verzameling, moet u nu #include <winrt/Windows.Foundation.Collections.h>.
De C++-compiler produceert 'fout C4002: Te veel argumenten voor functieachtige macro-aanroep GetCurrentTime'. Zie Hoe los ik dubbelzinnigheden op met GetCurrentTime en/of TRY?.
De C++-compiler produceert "fout C2334: onverwachte token(s) voorafgaand aan {"; duidelijke functietekst overslaan". Zie Hoe los ik dubbelzinnigheden op met GetCurrentTime en/of TRY?.
De C++-compiler produceert "winrt::impl::produce<D,I> kan abstracte klasse niet instantiëren vanwege de ontbrekende GetBindingConnector". Je moet #include <winrt/Microsoft.UI.Xaml.Markup.h> doen.
De C++-compiler produceert 'fout C2039: 'promise_type': is geen lid van 'std::experimenteel::coroutine_traits<void>'. Uw coroutine moet ofwel een object voor een asynchrone bewerking of winrt::fire_and_forget retourneren. Zie Gelijktijdigheid en asynchrone bewerkingen.
Uw project produceert 'dubbelzinnige toegang tot 'PopulatePropertyInfoOverride'. Deze fout kan optreden wanneer u één basisklasse declareert in uw IDL en een andere basisklasse in uw XAML-opmaak.
Het laden van een C++/WinRT-oplossing voor de eerste keer produceert "Designtime build failed for project 'MyProject.vcxproj' configuration 'Debug|x86'. IntelliSense is mogelijk niet beschikbaar.'. Dit IntelliSense-probleem wordt opgelost nadat u voor het eerst hebt gebouwd.
Een poging om winrt::auto_revoke op te geven bij het registreren van een gemachtigde, produceert een winrt::hresult_no_interface uitzondering. Kijk of uw gemachtigde voor automatisch intrekken niet kan worden geregistreerd.
Wanneer u in een C++/WinRT-app een C#-Windows Runtime-onderdeel gebruikt dat gebruikmaakt van XAML, produceert de compiler een fout van het formulier ''MyNamespace_XamlTypeInfo': is geen lid van 'winrt::MyNamespace', waarbij MyNamespace de naam van de naamruimte van het Windows Runtime-onderdeel is. Voeg in pch.h in de C++/WinRT-app die hiervan gebruikmaakt #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h> toe, waarbij MyNamespace zo nodig wordt vervangen.
In een C++/WinRT-project in Visual Studio geeft IntelliSense een fout weer in de vorm 'fout E1696: kan het bronbestand niet openen'. Compileer uw zojuist gemaakte project ten minste één keer. Klik vervolgens met de rechtermuisknop in de broncode-editor >Opnieuw scannen>bestand opnieuw scannen. Hiermee worden alle IntelliSense-fouten, inclusief E1696, opgelost.

Note

Als dit onderwerp uw vraag niet heeft beantwoord, kunt u hulp vinden door naar de Visual Studio C++-ontwikkelaarscommunity te gaan of door de c++-winrt tag op Stack Overflow te gebruiken.

Note

Veel C++/WinRT-onderwerpen zijn bezig met het migreren van de UWP-documentatie naar deze sectie. Totdat de migratie is voltooid, kunnen koppelingen in de onderstaande lijst leiden tot de sectie UWP-documenten. De C++/WinRT-taalprojectie is hetzelfde voor zowel UWP- als WinUI 3-apps, zodat inhoud in beide contexten van toepassing is. Eventuele UWP-specifieke patronen (zoals app-levenscyclus of Windows.UI naamruimte-API's) worden expliciet vermeld in deze artikelen.