Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A C++/WinRT egy teljesen standard, modern C++17 nyelvi kivetítés Windows Runtime (WinRT) API-khoz, fejlécfájl-alapú kódtárként implementálva, és úgy lett kialakítva, hogy első osztályú hozzáférést biztosítson a modern Windows API-hoz. A C++/WinRT használatával windowsos futtatókörnyezeti API-kat hozhat létre és használhat bármilyen szabványnak megfelelő C+++17 fordító használatával. A Windows SDK tartalmazza a C++/WinRT; a 10.0.17134.0-s verzióban (Windows 10, 1803-ban) jelent meg.
A C++/WinRT a Microsoft által ajánlott helyettesítő a C++/CX nyelvi vetítési felülethez, valamint a Windows Runtime C++ Sablonkönyvtárhoz (WRL). A C++/WinRT
Fontos
A C+++/WinRT legfontosabb elemeit a C++/WinRT SDK-támogatásának C++/WinRT és Visual Studio-támogatás C++/WinRT, XAML, VSIX-bővítmény és NuGet-csomagcímű szakasz ismerteti.
Lásd még Hol találom a C++/WinRT mintaalkalmazásokat?.
Nyelvi előrejelzések
A Windows futtatókörnyezet a Component Object Model (COM) API-kon alapul, és úgy lett kialakítva, hogy nyelvi kivetítéseken keresztül elérhető legyen. A kivetítés elrejti a COM részleteit, és természetesebb programozási élményt nyújt egy adott nyelvhez.
A C++/WinRT nyelvi kivetítés a Windows Runtime API referenciatartalmaiban
Ha a Windows Runtime API-katböngészi, kattintson a jobb felső sarokban található Nyelv legördülő listára, és válassza ki a C++/WinRT lehetőséget az API-szintaxis blokkok megtekintéséhez, ahogyan azok a C++/WinRT nyelvi vetítésben megjelennek.
A Visual Studio támogatása a C++/WinRT, az XAML, a VSIX bővítmény és a NuGet-csomag esetében
A Visual Studio támogatásához Visual Studio 2022 vagy Visual Studio 2019 vagy Visual Studio 2017 szükséges (legalább 15.6-os verzió, legalább 15.7). A Visual Studio Installerben telepítse az univerzális Windows platform fejlesztési számítási feladatát. Ha még nem tette meg, a Telepítés részletei>Univerzális Windows Platform fejlesztésben, válassza ki a C++ (v14x) Univerzális Windows Platform eszközök lehetőséget. A Windows-beállítások>adatvédelmi és biztonsági beállításaiban (Windows 10: Frissítés és biztonság) >A fejlesztőknek pedig engedélyezze a Fejlesztői mód beállítást (Windows 10: nem a Sideload-alkalmazások lehetőséget).
Bár azt javasoljuk, hogy a Visual Studio és a Windows SDK legújabb verzióival dolgozzon, ha a Windows SDK-val a 10.0.17763.0 (Windows 10, 1809-es verzió) előtti C++/WinRT verziót használja, akkor a fent említett Windows-névterek fejléceinek használatához a projektjének minimum Windows SDK-célverzióján 10.0.17134.0 (Windows 10, 1803-as verzió) kell alapulnia.
A Visual Studio 2022 beépített C++/WinRT-projekt- és elemsablonokkal készül, így azonnal megkezdheti a C++/WinRT fejlesztést. Emellett a Visual Studio natív hibakeresési vizualizációval (natvis) is rendelkezik, amely a C++/WinRT előrejelzett típusokból áll; A C#-hibakereséshez hasonló élményt nyújt. A Natvis automatikusan hibakeresési buildekhez használható. További információ: C++ / WinRT natív hibakeresési vizualizációja a Visual Studio számára.
A Visual Studio régebbi verzióihoz szeretné letölteni és telepíteni a C++/WinRT Visual Studio Extension (VSIX) legújabb verzióját a Visual Studio Piactér-ról.
- A VSIX bővítmény C++/WinRT projekt- és elemsablonokat biztosít a Visual Studióban.
- Emellett a Visual Studio natív hibakeresési vizualizációt (natvis) is biztosít a C++/WinRT előrejelzett típusok esetében.
A C++/WinRT Visual Studio-projektsablonjait az alábbi szakaszok ismertetik. Amikor új C++/WinRT-projektet hoz létre a VSIX-bővítmény legújabb verziójával, az új C++/WinRT projekt automatikusan telepíti a Microsoft.Windows.CppWinRT NuGet csomagot. A Microsoft.Windows.CppWinRT NuGet csomag C++/WinRT buildtámogatást (MSBuild tulajdonságok és célok) biztosít, így a projekt hordozhatóvá válik egy fejlesztőgép és egy buildügynök között (amelyre csak a NuGet-csomag van telepítve, és nem a VSIX-bővítmény).
Másik lehetőségként átalakíthat egy meglévő projektet a Microsoft.Windows.CppWinRT NuGet-csomag manuális telepítésével. Miután telepítette (vagy frissítette) a VSIX-bővítmény legújabb verzióját, nyissa meg a meglévő projektet a Visual Studióban, és kattintson a Project>Manage NuGet Packages...>Keresse meg, írja be vagy illessze be a Microsoft.Windows.CppWinRT fájlt a keresőmezőbe, jelölje ki az elemet a keresési eredmények között, majd kattintson a Telepítés gombra a projekt csomagjának telepítéséhez. A csomag hozzáadása után C++/WinRT MSBuild támogatást kap a projekthez, beleértve az cppwinrt.exe
eszköz meghívását is.
Fontos
Ha olyan projektjei vannak, amelyek a VSIX-bővítmény 1.0.190128.4-nél korábbi verziójával lettek létrehozva (vagy frissítve lettek), akkor tekintse meg a VSIX-bővítmény korábbi verzióit. Ez a szakasz fontos információkat tartalmaz a projektek konfigurálásáról, amelyeket a VSIX-bővítmény legújabb verziójának használatához frissítenie kell.
- Mivel a C++/WinRT a C++17 szabvány funkcióit használja, a NuGet-csomag beállítja a C/C++>Language>C++ Language Standard>ISO C++17 Standard (/std:c++17) projekttulajdonságot a Visual Studióban.
- Emellett hozzáadja a /bigobj fordítási opciót.
- Hozzáadja a /await fordítóbeállítást a
co_await
engedélyezéséhez. - Arra utasítja az XAML fordítót, hogy hozzon létre C++/WinRT-kódot.
- Érdemes lehet konfigurálnia a Megfelelőség módot is: Igen (/megengedő), ami tovább korlátozza a kód szabványmegfelelőségét.
- Egy másik projekt tulajdonság, amire figyelemmel kell lenni, a C/C++>>Általános, A figyelmeztetéseket hibaként kezelni. Állítsa Igen(/WX) vagy Nem (/WX-) ízlés szerint. Előfordulhat, hogy az
cppwinrt.exe
eszköz által létrehozott forrásfájlok figyelmeztetéseket generálnak, amíg hozzá nem adja a megvalósítást hozzájuk.
Ha a rendszer a fentiekben leírtak szerint van beállítva, létrehozhat és létrehozhat vagy megnyithat egy C++/WinRT-projektet a Visual Studióban, és üzembe helyezheti azt.
A 2.0-s verziótól a Microsoft.Windows.CppWinRT NuGet csomag tartalmazza az cppwinrt.exe
eszközt. A cppwinrt.exe
eszközt windowsos futtatókörnyezeti metaadatok (.winmd
) fájlra irányítva létrehozhat egy fejlécfájl-alapú standard C++ kódtárat, amely projekteket a metaadatokban leírt API-kat C++/WinRT-kódból való felhasználás céljából. A Windows Futtatókörnyezet metaadatfájljai (.winmd
) lehetővé teszik a Windows Runtime API-felület leírásának kánonikus módját. Ha a cppwinrt.exe
metaadatokra mutat, létrehozhat egy könyvtárat, amely bármely második vagy harmadik fél által implementált Windows futtatókörnyezeti összetevőben, vagy a saját alkalmazásában implementált futtatókörnyezeti osztályokkal használható. További információért lásd: API-k fogyasztása C++/WinRT segítségével.
A C++/WinRT használatával saját futtatókörnyezeti osztályokat is implementálhat a standard C++ használatával anélkül, hogy COM-stílusú programozást használna. Futtatás idejű osztály esetén egyszerűen leírhatja a típusokat egy IDL-fájlban, és a midl.exe
és a cppwinrt.exe
létrehozza az Ön számára a megvalósítási sablon forráskódfájljait. A C++/WinRT alaposztályból származtatva egyszerűen implementálhat interfészeket. További információért lásd Szerzői API-k C++/WinRT.
A cppwinrt.exe
eszköz testreszabási opcióinak listájához, amelyeket a projekt tulajdonságain keresztül állíthatsz be, lásd a Microsoft.Windows.CppWinRT NuGet-csomag readme fájlját.
A C++/WinRT MSBuild támogatást használó projekteket a projektben telepített Microsoft.Windows.CppWinRT NuGet-csomag jelenlétével azonosíthatja.
Íme a VSIX-bővítmény által biztosított Visual Studio-projektsablonok.
Üres alkalmazás (C++/WinRT)
Egy XAML felhasználói felülettel rendelkező univerzális Windows-platform (UWP) alkalmazás projektsablonja.
A Visual Studio XAML-fordítótámogatást biztosít a megvalósításhoz és a fejléccsomók létrehozásához az egyes XAML-jelölőfájlok mögött található Interface Definition Language (IDL) (.idl
) fájlból. Egy IDL-fájlban definiáljon minden olyan helyi futtatókörnyezeti osztályt, amelyekre hivatkozni szeretne az alkalmazás XAML-oldalain, majd hozza létre egyszer a projektet, hogy implementációs sablonokat Generated Files
hozzon létre az alkalmazásban, és a stub típusú definíciókban Generated Files\sources
. Ezután használja ezeket a csonktípus-definíciókat a helyi futtatókörnyezeti osztályok implementálásához. Lásd futásidejű osztályok MIDL fájlokba való rendezése (.idl).
Az XAML tervezési felület támogatása a Visual Studio for C++/WinRT-ben közel áll a C#-hoz való paritáshoz. A Visual Studióban a Tulajdonságok ablak Események lapján vehet fel eseménykezelőket egy C++/WinRT-projekten belül. Az eseménykezelőket manuálisan is hozzáadhatja a kódhoz – további információt a C++/WinRT delegáltjaival végzett események kezelése című témakörben talál.
Core-alkalmazás (C++/WinRT)
Az XAML-t nem használó univerzális Windows-platform (UWP) alkalmazás projektsablonja.
Ehelyett a C++/WinRT Windows névtér fejléceit használja a Windows.ApplicationModel.Core névtérhez. Az építkezés és a futtatás után kattintson egy üres területre egy színes négyzet hozzáadásához; majd kattintson egy színes négyzetre a húzáshoz.
Windows-konzolalkalmazás (C++/WinRT)
Projektsablon egy Windows Desktophoz készült C++/WinRT-ügyfélalkalmazáshoz egy konzol felhasználói felületével.
Windows Asztali alkalmazás (C++/WinRT)
A Windows Desktophoz készült C++/WinRT ügyfélalkalmazás projektsablonja, amely megjeleníti a Windows Runtime Windows.Foundation.Uri egy Win32 MessageBox ban.
Windows futtatókörnyezeti összetevő (C++/WinRT)
Egy összetevő projektsablonja; általában univerzális Windows-platformról (UWP) történő fogyasztásra.
Ez a sablon bemutatja az midl.exe
>cppwinrt.exe
eszközláncot, ahol a Windows Futtatókörnyezet metaadatai (.winmd
) az IDL-ből jönnek létre, majd a megvalósítás és a fejléccsomók a Windows futtatókörnyezet metaadataiból jönnek létre.
Egy IDL-fájlban adja meg az összetevő futtatókörnyezeti osztályait, az alapértelmezett felületüket és az általuk implementálható többi felületet. A projektet építse fel egyszer, hogy generálja a module.g.cpp
, module.h.cpp
-t, implementációs sablonokat a Generated Files
-ben, és csonk típusú definíciókat a Generated Files\sources
-ban. Ezután használja ezeket a csonktípus-definíciókat az összetevő futtatókörnyezeti osztályainak implementálásához. Lásd futásidejű osztályok MIDL fájlokba való rendezése (.idl).
Csomagolja össze a Windows Runtime összetevő binárisát és a hozzá tartozó .winmd
-t az azt felhasználó UWP-alkalmazással.
A VSIX-bővítmény korábbi verziói
Javasoljuk, hogy telepítse (vagy frissítse) a VSIX-bővítmény legújabb verzióját. Alapértelmezés szerint úgy van konfigurálva, hogy frissítse magát. Ha ezt teszi, és olyan projektjei vannak, amelyek a VSIX-bővítmény 1.0.190128.4-es verziónál korábbi verziójával lettek létrehozva, akkor ez a szakasz fontos információkat tartalmaz a projektek új verzióval való frissítéséről. Ha nem frissül, akkor továbbra is hasznosnak fogja találni az ebben a szakaszban található információkat.
A Windows SDK és a Visual Studio támogatott verziói, valamint a Visual Studio konfigurációja tekintetében a Visual Studio C++/WinRT, XAML, VSIX-bővítmény és NuGet-csomag szakaszának információi a VSIX-bővítmény korábbi verzióira vonatkoznak. Az alábbi információk a korábbi verziókban létrehozott (vagy frissített) projektek viselkedésével és konfigurációjával kapcsolatos fontos különbségeket ismertetik.
Korábban készült, mint 1.0.181002.2
Ha a projektet a VSIX-bővítmény 1.0.181002.2-nél korábbi verziójával hozták létre, akkor a C++/WinRT buildtámogatás a VSIX-bővítmény adott verziójába lett beépítve. A projektben a <CppWinRTEnabled>true</CppWinRTEnabled>
tulajdonság be van állítva a .vcxproj
fájlban.
<Project ...>
<PropertyGroup Label="Globals">
<CppWinRTEnabled>true</CppWinRTEnabled>
...
A projektet a Microsoft.Windows.CppWinRT NuGet csomag manuális telepítésével frissítheti. Miután telepítette (vagy frissítette) a VSIX-bővítmény legújabb verzióját, nyissa meg a projektet a Visual Studióban, és kattintson a Project>Manage NuGet Packages...>Keresse meg, írja be vagy illessze be a Microsoft.Windows.CppWinRT fájlt a keresőmezőbe, jelölje ki az elemet a keresési eredmények között, majd kattintson a Telepítés gombra a projekt csomagjának telepítéséhez.
1.0.181002.2 és 1.0.190128.3 között létrehozott (vagy frissített)
Ha a projektet a VSIX-bővítmény 1.0.181002.2 és 1.0.190128.3 közötti verziójával hozták létre, akkor a Projektsablon automatikusan telepítette a Microsoft.Windows.CppWinRT NuGet-csomagot a projektbe. Előfordulhat, hogy frissített egy régebbi projektet is, hogy a VSIX-bővítmény egy verzióját használja ebben a tartományban. Ha igen, akkor – mivel a buildtámogatás ebben a tartományban továbbra is megtalálható a VSIX-bővítmény verzióiban – előfordulhat, hogy a frissített projektben telepítve van a Microsoft.Windows.CppWinRT NuGet-csomag
A projekt frissítéséhez kövesse az előző szakaszban leírt utasításokat, és győződjön meg arról, hogy a projekt rendelkezik a Microsoft.Windows.CppWinRT NuGet-csomag telepített
Érvénytelen frissítési konfigurációk
A VSIX-bővítmény legújabb verziójával nem érvényes, hogy egy projekt rendelkezik a <CppWinRTEnabled>true</CppWinRTEnabled>
tulajdonsággal, ha nincs telepítve a Microsoft.Windows.CppWinRT NuGet csomag is. Egy ilyen konfigurációjú projekt a következő buildhibát eredményezi: "A C++/WinRT VSIX már nem nyújt projekt buildtámogatást." Adjon hozzá egy projekthivatkozást a Microsoft.Windows.CppWinRT Nuget csomaghoz."
Ahogy fentebb említettük, egy C++/WinRT-projektnek telepítenie kell a NuGet-csomagot.
Mivel a <CppWinRTEnabled>
elem elavult, igény szerint szerkesztheti a .vcxproj
elemet, és törölheti az elemet. Nem feltétlenül szükséges, de ez egy lehetőség.
Továbbá, ha a .vcxproj
tartalmazza a <RequiredBundles>$(RequiredBundles);Microsoft.Windows.CppWinRT</RequiredBundles>
-et, akkor eltávolíthatja, hogy a C++/WinRT VSIX bővítmény telepítése nélkül is építhesse.
SDK-támogatás a C++/WinRT-hez
Bár most már csak kompatibilitási okokból van jelen, a 10.0.17134.0-s verziótól (Windows 10, 1803-as verzió), a Windows SDK egy fejlécfájl-alapú standard C++ kódtárat tartalmaz a belső Windows API-k (Windows-névterek windowsos futtatókörnyezeti API-k) használatához. Ezek az élőfejek a mappában %WindowsSdkDir%Include<WindowsTargetPlatformVersion>\cppwinrt\winrt
találhatók. A Windows SDK 10.0.17763.0-s verziójától (Windows 10, 1809-es verzió) ezek a fejlécek a projekt $(GeneratedFilesDir) mappájában jönnek létre.
A kompatibilitás érdekében a Windows SDK is rendelkezik az cppwinrt.exe
eszközzel. Javasoljuk azonban, hogy ehelyett telepítse és használja a cppwinrt.exe
NuGet csomagban található legújabb verziót. Ezt a csomagot, és cppwinrt.exe
a fenti szakaszok ismertetik.
Egyéni típusok a C++/WinRT-vetítésben
A C++/WinRT-programozásban használhatja a standard C++ nyelvi funkciókat, a Standard C++ adattípusokat és a C++/WinRT-et – beleértve néhány C++ standard kódtár adattípust is. A kivetítésben azonban megismerhet néhány egyéni adattípust is, és használhatja őket. Például winrt::hstring használjuk az Első lépések a C++/WinRTcímű rövid útmutatóban.
winrt::com_array egy másik típus, amelyet valószínűleg használni fog valamikor. De kisebb az esélye, hogy közvetlenül egy olyan típust használjon, mint a winrt::array_view. Vagy úgy is dönthet, hogy nem használja, hogy ne legyen olyan kód, amelyet módosítania kell, ha és amikor a C++ Standard kódtárban egy ezzel egyenértékű típus jelenik meg.
Figyelmeztetés
Akadnak olyan típusok is, amelyeket a C++/WinRT Windows névtér fejléceinek alapos tanulmányozásakor láthat. Ilyen például winrt::param::hstring, de vannak kollekciós példák is. Ezek kizárólag a bemeneti paraméterek kötésének optimalizálására szolgálnak, amely jelentős teljesítménybeli javulást eredményez. Így a legtöbb hívási minta zökkenőmentesen használható a kapcsolódó standard C++ típusokkal és tárolókkal. Ezeket a típusokat csak akkor használja a vetítés, ha a legtöbb értéket adja hozzá. Nagyon optimalizáltak, és nem általános használatra valók; ne legyen kísértés arra, hogy saját maga használja őket. A névtérből winrt::impl
semmit sem érdemes használni, mivel ezek implementálási típusok, ezért változhatnak. Továbbra is a szabványos típusokat vagy a winrt névtértípusait kell használnia.
Lásd még Paraméterek átadása az ABI határvonalán.