Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
C++/WinRT is een volledig standaard moderne C++17-taalprojectie voor Windows Runtime-API's (WinRT), geïmplementeerd als een bibliotheek op basis van header-bestanden en ontworpen om u toegang te bieden tot de moderne Windows-API. Met C++/WinRT kunt u Windows Runtime-API's ontwerpen en gebruiken met behulp van een C++17-compiler die compatibel is met standaarden. De Windows SDK bevat C++/WinRT; het is geïntroduceerd in versie 10.0.17134.0 (Windows 10, versie 1803).
C++/WinRT is de aanbevolen vervanging voor de C++/CX- taalprojectie en de Windows Runtime C++-sjabloonbibliotheek (WRL). De volledige lijst met onderwerpen over C++/WinRT bevat informatie over zowel interoperabiliteit met als het overzetten van C++/CX en WRL.
Belangrijk
Enkele van de belangrijkste onderdelen van C++/WinRT waar u rekening mee moet houden, worden beschreven in de secties SDK-ondersteuning voor C++/WinRT- en Visual Studio-ondersteuning voor C++/WinRT, XAML, de VSIX-extensie en het NuGet-pakket.
Zie ook Waar vind ik C++/WinRT-voorbeeld-apps?.
Taalprojecties
De Windows Runtime is gebaseerd op COM-API's (Component Object Model) en is ontworpen voor toegang via taalprojecties. Een projectie verbergt de COM-details en biedt een natuurlijkere programmeerervaring voor een bepaalde taal.
De C++/WinRT-taalprojectie in de windows Runtime-API-referentie-inhoud
Wanneer u door Windows Runtime-API'sbladert, klikt u op de keuzelijst in de rechterbovenhoek en selecteert u C++/WinRT om API-syntaxisblokken te bekijken zoals ze verschijnen in de C++/WinRT-taalprojectie.
Visual Studio-ondersteuning voor C++/WinRT, XAML, de VSIX-extensie en het NuGet-pakket
Voor visual Studio-ondersteuning hebt u Visual Studio 2022 of Visual Studio 2019 of Visual Studio 2017 nodig (ten minste versie 15.6; we raden ten minste 15.7 aan). Installeer vanuit het Visual Studio Installer de Universal Windows Platform-ontwikkeling workload. Controleer in Installation Details>Universal Windows Platform developmentde C++ (v14x) Universal Windows Platform tools option(s) als u dit nog niet hebt gedaan. In de Windows-instellingen>Privacy en beveiliging (Windows 10: Update en beveiliging) >voor ontwikkelaars, schakel de optie Ontwikkelaarsmodus in (Windows 10: niet voor de optie Sideload-apps kiezen).
We raden u aan om te ontwikkelen met de nieuwste versies van Visual Studio en de Windows SDK. Als u een versie van C++/WinRT gebruikt die is geleverd met de Windows SDK vóór 10.0.17763.0 (Windows 10, versie 1809), moet u, om de bovengenoemde Windows-naamruimteheaders te gebruiken, een minimale Windows SDK-doelversie van 10.0.17134.0 (Windows 10, versie 1803) in uw project hebben.
Visual Studio 2022 wordt geleverd met C++/WinRT-project- en itemsjablonen die zijn ingebouwd, zodat u meteen aan de slag kunt met C++/WinRT-ontwikkeling. Het wordt ook geleverd met native Visual Studio-foutopsporingsvisualisatie (natvis) van C++/WinRT-geprojecteerde typen, waardoor een ervaring ontstaat die vergelijkbaar is met C#-foutopsporing. Natvis is automatisch voor foutopsporingsversies. Zie voor meer informatie systeemeigen foutopsporingsvisualisatie van Visual Studio voor C++/WinRT-.
Voor oudere versies van Visual Studio wilt u de nieuwste versie van de C++/WinRT Visual Studio Extension (VSIX) downloaden en installeren vanuit de Visual Studio Marketplace-.
- De VSIX-extensie biedt u C++/WinRT-project- en itemsjablonen in Visual Studio.
- Daarnaast krijgt u visual Studio systeemeigen foutopsporingsvisualisatie (natvis) van C++/WinRT-projecttypen.
De Visual Studio-projectsjablonen voor C++/WinRT worden beschreven in de onderstaande secties. Wanneer u een nieuw C++/WinRT-project maakt met de nieuwste versie van de VSIX-extensie geïnstalleerd, installeert het nieuwe C++/WinRT-project automatisch het Microsoft.Windows.CppWinRT NuGet-pakket. Het Microsoft.Windows.CppWinRT NuGet-pakket biedt C++/WinRT-buildondersteuning (MSBuild-eigenschappen en -doelen), waardoor uw project draagbaar is tussen een ontwikkelcomputer en een buildagent (waarop alleen het NuGet-pakket en niet de VSIX-extensie is geïnstalleerd).
U kunt ook een bestaand project converteren door het Microsoft.Windows.CppWinRT NuGet-pakket handmatig te installeren. Nadat u de nieuwste versie van de VSIX-extensie hebt geïnstalleerd (of bijgewerkt), opent u het bestaande project in Visual Studio, klikt u op Project>NuGet-pakketten beheren...>Blader, typt of plakt u Microsoft.Windows.CppWinRT- in het zoekvak, selecteert u het item in de zoekresultaten en klikt u vervolgens op Installeren om het pakket voor dat project te installeren. Zodra u het pakket hebt toegevoegd, krijgt u C++/WinRT MSBuild-ondersteuning voor het project, inclusief het aanroepen van het hulpprogramma cppwinrt.exe.
Belangrijk
Als u projecten hebt die zijn gemaakt met (of bijgewerkt om mee te werken) een versie van de VSIX-extensie die ouder is dan 1.0.190128.4, raadpleegt u Eerdere versies van de VSIX-extensie. Deze sectie bevat belangrijke informatie over de configuratie van uw projecten, die u moet weten om ze te upgraden om de nieuwste versie van de VSIX-extensie te gebruiken.
- Omdat C++/WinRT gebruikmaakt van functies uit de C++17-standaard, stelt het NuGet-pakket projecteigenschap in C/C++>Language>C++ Language Standard>ISO C++17 Standard (/std:c++17) in Visual Studio.
- Ook wordt de optie /bigobj compiler toegevoegd.
- Hiermee wordt de optie /await compiler toegevoegd om
co_awaitin te schakelen. - Hiermee wordt de XAML-compiler geïnstrueerd om C++/WinRT-codegen te verzenden.
- Mogelijk wilt u ook Conformance-modus instellen: Ja (/permissive-), waardoor uw code verder wordt beperkt tot standaarden.
- Een andere projecteigenschap waar u rekening mee moet houden, is C/C++>Algemeen>Waarschuwingen behandelen als fouten. Stel dit in op Ja(/WX) of Nee (/WX-) naar smaak. Soms genereren bronbestanden die door het hulpprogramma
cppwinrt.exeworden gegenereerd, waarschuwingen totdat u uw implementatie eraan toevoegt.
Als uw systeem is ingesteld zoals hierboven beschreven, kunt u een C++/WinRT-project maken en bouwen of openen in Visual Studio en implementeren.
Vanaf versie 2.0 bevat het Microsoft.Windows.CppWinRT NuGet-pakket het hulpprogramma cppwinrt.exe. U kunt het hulpprogramma cppwinrt.exe richten op een Windows Runtime-metagegevensbestand (.winmd) om een standaard-C++-bibliotheek op basis van headerbestanden te genereren dat -projecten maken van de API's die worden beschreven in de metagegevens voor gebruik in C++/WinRT-code. Windows Runtime-metagegevensbestanden (.winmd) bieden een canonieke manier om een Windows Runtime API-oppervlak te beschrijven. Door cppwinrt.exe te verwijzen naar metagegevens, kunt u een bibliotheek genereren voor gebruik met elke runtimeklasse die is geïmplementeerd in een tweede of externe Windows Runtime-component, of geïmplementeerd in uw eigen toepassing. Voor meer informatie, zie API's gebruiken met C++/WinRT.
Met C++/WinRT kunt u ook uw eigen runtimeklassen implementeren met behulp van standard C++, zonder gebruik te maken van COM-stijl programmeren. Voor een runtime-klasse beschrijft u alleen uw typen in een IDL-bestand en midl.exe en cppwinrt.exe genereren uw sjabloonbestanden voor implementatie van broncode voor u. U kunt ook gewoon interfaces implementeren door te afgeleid van een C++/WinRT-basisklasse. Voor meer informatie, zie Author APIs met C++/WinRT.
Zie het Microsoft.Windows.CppWinRT NuGet-pakket cppwinrt.exevoor een lijst met aanpassingsopties voor het hulpprogramma , instelbaar via projecteigenschappen.
U kunt een project identificeren dat gebruikmaakt van de C++/WinRT MSBuild-ondersteuning door de aanwezigheid van het Microsoft.Windows.CppWinRT NuGet-pakket dat in het project is geïnstalleerd.
Hier volgen de Visual Studio-projectsjablonen die worden geleverd door de VSIX-extensie.
Blanco app (C++/WinRT)
Een projectsjabloon voor een UWP-app (Universal Windows Platform) met een XAML-gebruikersinterface.
Visual Studio biedt XAML-compilerondersteuning voor het genereren van implementatie- en header-stubs van het IDL-bestand (Interface Definition Language) (.idl) dat zich achter elk XAML-markeringsbestand bevindt. Definieer in een IDL-bestand alle lokale runtimeklassen waarnaar u wilt verwijzen op de XAML-pagina's van uw app en bouw het project eenmaal om implementatiesjablonen te genereren in Generated Filesen stub-typedefinities in Generated Files\sources. Gebruik vervolgens deze stub-typedefinities voor referentie om uw lokale runtimeklassen te implementeren. Zie het onderverdelen van runtime-klassen in Midl-bestanden (.idl).
De XAML-ontwerpoppervlakondersteuning in Visual Studio voor C++/WinRT ligt dicht bij pariteit met C#. In Visual Studio kunt u het tabblad Gebeurtenissen van het venster Eigenschappen gebruiken om gebeurtenis-handlers toe te voegen in een C++/WinRT-project. U kunt gebeurtenis-handlers ook handmatig aan uw code toevoegen. Zie Gebeurtenissen verwerken met behulp van gemachtigden in C++/WinRT- voor meer informatie.
Core-app (C++/WinRT)
Een projectsjabloon voor een UWP-app (Universal Windows Platform) die geen XAML gebruikt.
In plaats daarvan wordt de C++/WinRT Windows-naamruimteheader gebruikt voor de Windows.ApplicationModel.Core-naamruimte. Klik na het bouwen en uitvoeren op een lege ruimte om een gekleurd vierkant toe te voegen; klik vervolgens op een gekleurd vierkant om het te slepen.
Consoletoepassing voor Windows (C++/WinRT)
Een projectsjabloon voor een C++/WinRT-clienttoepassing voor Windows Desktop, met een gebruikersinterface van de console.
Windows-bureaubladtoepassing (C++/WinRT)
Een projectsjabloon voor een C++/WinRT-clienttoepassing voor Windows Desktop, waarin een Windows Runtime-Windows.Foundation.Uri- in een Win32-MessageBox-wordt weergegeven.
Windows Runtime-onderdeel (C++/WinRT)
Een projectsjabloon voor een onderdeel; doorgaans voor gebruik van een Universal Windows Platform (UWP).
Deze sjabloon demonstreert de midl.exe>cppwinrt.exe hulpprogrammaketen, waarbij Metagegevens van Windows Runtime (.winmd) worden gegenereerd op basis van IDL en vervolgens implementatie- en header-stubs worden gegenereerd op basis van de Windows Runtime-metagegevens.
Definieer in een IDL-bestand de runtimeklassen in uw onderdeel, de standaardinterface en eventuele andere interfaces die ze implementeren. Bouw het project eenmaal om module.g.cpp, module.h.cpp, implementatiesjablonen in Generated Filesen stub-typedefinities in Generated Files\sourceste genereren. Gebruik vervolgens de stub-typedefinities voor verwijzing om de runtimeklassen in uw onderdeel te implementeren. Zie het onderverdelen van runtime-klassen in Midl-bestanden (.idl).
Bundel het binaire bestand van het ingebouwde Windows Runtime-onderdeel en de bijbehorende .winmd met de UWP-app die ze gebruikt.
Eerdere versies van de VSIX-extensie
U wordt aangeraden de meest recente versie van de VSIX-extensie te installeren (of bij te werken naar). Deze is geconfigureerd om zichzelf standaard bij te werken. Als u dit doet en u projecten hebt die zijn gemaakt met een versie van de VSIX-extensie eerder dan 1.0.190128.4, bevat deze sectie belangrijke informatie over het upgraden van deze projecten om te werken met de nieuwe versie. Als u deze niet bijwerkt, vindt u de informatie in deze sectie nog steeds nuttig.
Qua ondersteunde Windows SDK- en Visual Studio-versies en Visual Studio-configuratie is de informatie in de Visual Studio-ondersteuning voor C++/WinRT, XAML, de VSIX-extensie en het NuGet-pakket hierboven van toepassing op eerdere versies van de VSIX-extensie. In de onderstaande informatie worden belangrijke verschillen beschreven met betrekking tot het gedrag en de configuratie van projecten die zijn gemaakt met (of bijgewerkt om te werken met) eerdere versies.
Eerder gemaakt dan 1.0.181002.2
Als uw project is gemaakt met een versie van de VSIX-extensie ouder dan 1.0.181002.2, is C++/WinRT-buildondersteuning ingebouwd in die versie van de VSIX-extensie. Voor uw project is de eigenschap <CppWinRTEnabled>true</CppWinRTEnabled> ingesteld in het bestand .vcxproj.
<Project ...>
<PropertyGroup Label="Globals">
<CppWinRTEnabled>true</CppWinRTEnabled>
...
U kunt uw project upgraden door het Microsoft.Windows.CppWinRT- NuGet-pakket handmatig te installeren. Nadat u de nieuwste versie van de VSIX-extensie hebt geïnstalleerd (of bijgewerkt), opent u uw project in Visual Studio, klikt u op Project>NuGet-pakketten beheren...>Blader, typt of plakt u Microsoft.Windows.CppWinRT- in het zoekvak, selecteert u het item in de zoekresultaten en klikt u vervolgens op Installeren om het pakket voor uw project te installeren.
Gemaakt met (of bijgewerkt naar) tussen 1.0.181002.2 en 1.0.190128.3
Als uw project is gemaakt met een versie van de VSIX-extensie tussen 1.0.181002.2 en 1.0.190128.3, inclusief, is het Microsoft.Windows.CppWinRT- NuGet-pakket automatisch in het project geïnstalleerd door de projectsjabloon. Mogelijk hebt u ook een upgrade van een ouder project uitgevoerd om een versie van de VSIX-extensie in dit bereik te gebruiken. Als u dat hebt gedaan, kan het zijn dat het Microsoft.Windows.CppWinRT- NuGet-pakket in uw bijgewerkte project wel of niet is geïnstalleerd, aangezien de build-ondersteuning ook nog aanwezig was in de versies van de VSIX-extensie binnen dit bereik.
Als u uw project wilt upgraden, volgt u de instructies in de vorige sectie en zorgt u ervoor dat het Microsoft.Windows.CppWinRT- NuGet-pakket is geïnstalleerd.
Ongeldige upgradeconfiguraties
Met de nieuwste versie van de VSIX-extensie is het niet geldig voor een project om de eigenschap <CppWinRTEnabled>true</CppWinRTEnabled> te hebben als het niet ook het Microsoft.Windows.CppWinRT- NuGet-pakket is geïnstalleerd. Een project met deze configuratie produceert het buildfoutbericht: 'De C++/WinRT VSIX biedt geen ondersteuning meer voor projectbuilds. Voeg een projectverwijzing toe aan het Nuget-pakket Microsoft.Windows.CppWinRT.
Zoals hierboven vermeld, moet het NuGet-pakket nu in het C++/WinRT-project worden geïnstalleerd.
Aangezien het <CppWinRTEnabled>-element nu verouderd is, kunt u eventueel uw .vcxprojbewerken en het element verwijderen. Het is niet strikt noodzakelijk, maar het is een optie.
Als uw .vcxproj<RequiredBundles>$(RequiredBundles);Microsoft.Windows.CppWinRT</RequiredBundles>bevat, kunt u deze verwijderen zodat u kunt bouwen zonder dat de C++/WinRT VSIX-extensie moet worden geïnstalleerd.
SDK-ondersteuning voor C++/WinRT
Hoewel deze nu alleen om compatibiliteitsredenen aanwezig is, bevat de Windows SDK vanaf versie 10.0.17134.0 (Windows 10, versie 1803) een op headers gebaseerde standaard-C++-bibliotheek voor het gebruik van Windows-API's van derden (Windows Runtime-API's in Windows-naamruimten). Deze headers bevinden zich in de map %WindowsSdkDir%Include<WindowsTargetPlatformVersion>\cppwinrt\winrt. Vanaf de Windows SDK-versie 10.0.17763.0 (Windows 10, versie 1809) worden deze headers voor u gegenereerd in de $(GeneratedFilesDir) van uw project map.
Voor compatibiliteit wordt de Windows SDK ook geleverd met het hulpprogramma cppwinrt.exe. We raden u echter aan in plaats daarvan de meest recente versie van cppwinrt.exete installeren en te gebruiken, die is opgenomen in het Microsoft.Windows.CppWinRT NuGet-pakket. Dat pakket en cppwinrt.exeworden beschreven in de bovenstaande secties.
Aangepaste typen in de C++/WinRT projectie
In uw C++/WinRT-programmering kunt u standaard C++-taalfuncties en Standard C++-gegevenstypen en C++/WinRT-gebruiken, waaronder enkele C++ Standaardbibliotheekgegevenstypen. Maar u zult ook op de hoogte worden van een aantal aangepaste gegevenstypen in de projectie en u kunt ervoor kiezen om ze te gebruiken. We gebruiken bijvoorbeeld winrt::hstring in het snelstartcodevoorbeeld in Aan de slag met C++/WinRT-.
winrt::com_array is een ander type dat u waarschijnlijk op een bepaald moment zult gebruiken. Maar u bent minder geneigd om een type als winrt::array_viewdirect te gebruiken. U kunt er ook voor kiezen om deze niet te gebruiken, zodat u geen code hebt om te wijzigen als en wanneer een equivalent type wordt weergegeven in de C++-standaardbibliotheek.
Waarschuwing
Er zijn ook typen die u kunt zien als u de headers van de C++/WinRT Windows-naamruimte nauwkeurig onderzoekt. Een voorbeeld is winrt::param::hstring, maar er zijn ook verzamelingsvoorbeelden. Deze bestaan alleen om de binding van invoerparameters te optimaliseren en leveren grote prestatieverbeteringen op en zorgen ervoor dat de meeste aanroepende patronen gewoon werken voor gerelateerde standaard C++-typen en -containers. Deze typen worden alleen gebruikt door de projectie in gevallen waarin ze de meeste waarde toevoegen. Ze zijn sterk geoptimaliseerd en ze zijn niet voor algemeen gebruik; wees niet verleid om ze zelf te gebruiken. U mag ook niets van de winrt::impl naamruimte gebruiken, omdat dit implementatietypen zijn en daarom moeten worden gewijzigd. U moet standaardtypen blijven gebruiken of typen uit de winrt-naamruimte.