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-futtatókörnyezet (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 bármilyen szabványnak megfelelő C+++17 fordítóval készíthet és használhat Windows-futtatókörnyezet API-kat. A Windows SDK tartalmazza a C++/WinRT-t; az a 10.0.17134.0-s verzióban jelent meg (Windows 10, 1803-as verzió).
Jótanács
Mikor válassza a C++/WinRT elemet: Akkor használja a C++/WinRT függvényt, ha Windows alkalmazásokat kell létrehoznia a C++ alkalmazásban – például ha a teljesítménykorlátozások nem igényelnek szemétgyűjtőt, meglévő C++ kódtárakkal való együttműködéskor vagy Windows-futtatókörnyezet összetevők létrehozásakor. Ha a projekt nem rendelkezik ezekkel a követelményekkel, fontolja meg a WinUI 3-as C# használatát a gyorsabb fejlesztés és a beépített memóriabiztonság érdekében.
A C++/WinRT a Microsoft által a C++/CX nyelvi leképezés és a Windows-futtatókörnyezet C++ sablonkönyvtár (WRL) ajánlott helyettesítője. A C++/WinRT témaköreinek teljes listája tartalmazza a C++/CX és a WRL együttműködésével és portolásával kapcsolatos információkat.
Fontos
A C++/WinRT legfontosabb elemeit a C++/WinRT SDK-támogatása és Visual Studio a C++/WinRT, az XAML, a VSIX-bővítmény és a NuGet-csomag támogatása című szakaszban találja.
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 nyelvi kivetítéseken keresztüli hozzáférésre tervezték. 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-futtatókörnyezet API referenciatartalmaiban
Amikor Windows-futtatókörnyezet API-kat böngész, kattintson a nyelv kombinált listára a jobb felső sarokban, és válassza a C++/WinRT lehetőséget az API szintaxisblokkjainak megtekintéséhez, ahogy azok megjelennek a C++/WinRT nyelvi kivetítésben.
Visual Studio C++/WinRT, XAML, VSIX bővítmény és NuGet-csomag támogatása
A Visual Studio támogatásához a Visual Studio 2022-es vagy újabb verziójára lesz szüksége. A Visual Studio Telepítőben telepítse a Univerzális Windows-platform fejlesztési számítási feladatot. A Telepítés részletei>Univerzális Windows-platform fejlesztés területen ellenőrizze a C++ (v14x) Univerzális Windows-platform eszközök beállítását, ha még nem tette meg. Afejlesztők Windows >> beállításaiban pedig engedélyezze a Fejlesztői mód lehetőséget.
Note
A Visual Studio 2022 és az azt követő verziók beépítve tartalmazzák a C++/WinRT projekt- és elemsablonokat, valamint a C++/WinRT leképezett típusainak natív hibakeresési vizualizációját (natvis). Ha a Visual Studio régebbi verzióját használja, telepítse a C++/WinRT VSIX bővítményt a Visual Studio Marketplace-ről.
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-csomag. A Microsoft.Windows. A 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ői 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 egy meglévő projektet is átalakíthat a Microsoft.Windows.CppWinRT NuGet-csomag kézi 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, kattintson a Project>Manage NuGet Packages...>Browse elemre, írja be vagy illessze be a Microsoft.Windows.CppWinRT kifejezést a keresőmezőbe, jelölje ki az elemet a keresési eredmények között, majd kattintson a Install gombra a csomag projektbe történő 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 a C/C++>Language>C++ Language Standard>ISO C++17 Standard (/std:c++17) projekttulajdonságot állítja be Visual Studio.
- Emellett hozzáadja a /bigobj fordítót is.
- Hozzáadja a /await fordítókapcsolót a(z)
co_awaitengedélyezéséhez. - Arra utasítja az XAML-fordítót, hogy C++/WinRT-kódot generáljon.
- É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 projekttulajdonság, a C/C++Általános>>figyelmeztetések hibaként való kezelése. Állítsa be az Igen(/WX) vagy a Nem (/WX-) értéket ízlés szerint. Előfordulhat, hogy az
cppwinrt.exeeszkö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 Visual Studio, és üzembe helyezheti azt.
A 2.0-s verziótól a Microsoft.Windows. A CppWinRT NuGet-csomag tartalmazza az cppwinrt.exe eszközt. Az eszközt egy Windows-futtatókörnyezet metaadatfájlra (cppwinrt.exe) irányítva .winmd létrehozhat egy fejlécfájl-alapú standard C++ kódtárat, amely a metaadatokban leírt API-kat a C++/WinRT-kódból való felhasználás céljából projekteli. Windows-futtatókörnyezet metaadatfájlok.winmd () lehetővé teszik egy Windows-futtatókörnyezet API-felület leírásának kontikai módját. A metaadatokra mutatva cppwinrt.exe létrehozhat egy kódtárat, amely egy második vagy harmadik féltől származó Windows-futtatókörnyezet összetevőben implementált futtatókörnyezeti osztályhoz használható, vagy a saját alkalmazásában implementálható. További információ: API-k felhasználása C++/WinRT használatával.
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. Futásidejű osztály esetén csak leírja a típusait egy IDL-fájlban, és a midl.exe és cppwinrt.exe létrehozza a megvalósításhoz szükséges sablon forráskódfájlokat. A C++/WinRT alaposztályból származtatva egyszerűen implementálhat interfészeket. További információ: Szerzői API-k C++/WinRT használatával.
A cppwinrt.exe eszköz projekt tulajdonságain keresztül beállítható testreszabási lehetőségeinek listáját a Microsoft.Windows.CppWinRT NuGet-csomag readme fájljában találja.
A C++/WinRT MSBuild támogatást használó projekt arról azonosítható, hogy telepítve van benne a(z) Microsoft.Windows.CppWinRT NuGet-csomag.
Í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. WinUI 3 asztali alkalmazások esetén használja helyette a Blank App, Packaged (WinUI 3 in Desktop) sablont.
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-korrektúrafá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 Fileshozzon 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: A futtatókörnyezeti osztályok MIDL-fájlokba (.idl) szervezése.
A C++/WinRT Visual Studio XAML tervezési felületének támogatása közel áll a C#-hoz való paritáshoz. A Visual Studio 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. A sablonnak nincs WinUI 3-as megfelelője.
Ehelyett a Windows.ApplicationModel.Core névtérhez a C++/WinRT Windows névtér fejlécfájlját használja. 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 egy Win32 MessageBoxban jelenít meg egy Windows-futtatókörnyezet Windows.Foundation.Uri objektumot.
Windows futtatókörnyezeti összetevő (C++/WinRT)
Egy komponens projektsablonja; jellemzően Univerzális Windows-platform (UWP) alkalmazásokban való használatra.
Ez a sablon bemutatja az midl.exe>cppwinrt.exe eszközláncot, ahol Windows-futtatókörnyezet metaadatok (.winmd) jönnek létre az IDL-ből, majd a implementáció és a fejléccsomók a Windows-futtatókörnyezet metaadatokbó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. Buildelje a projektet egyszer a module.g.cpp, a module.h.cpp, az implementációs sablonok Generated Files alatti, valamint a csonk típusdefiníciók Generated Files\sources alatti előállításához. Ezután használja ezeket a csonktípus-definíciókat az összetevő futtatókörnyezeti osztályainak implementálásához. Lásd: A futtatókörnyezeti osztályok MIDL-fájlokba (.idl) szervezése.
Csomagolja össze a lefordított Windows-futtatókörnyezet-összetevő bináris fájlját és a hozzá tartozó .winmd elemet az azt használó UWP-alkalmazással együtt.
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 támogatott Windows SDK- és Visual Studio-verziókra, valamint a Visual Studio konfigurációjára vonatkozóan a fenti A C++/WinRT, az XAML, a VSIX-bővítmény és a NuGet-csomag Visual Studio-támogatása című szakaszban található információk a VSIX-bővítmény korábbi verzióira is érvényesek. 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.
Az 1.0.181002.2 előtti verzióban létrehozva
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 a legújabb verzióra frissítette) a VSIX-bővítményt, nyissa meg a projektet a Visual Studióban, kattintson a Project>Manage NuGet Packages...>Tallózás lehetőségre, írja be vagy illessze be a Microsoft.Windows.CppWinRT kifejezést a keresőmezőbe, jelölje ki az elemet a keresési eredmények közül, majd a csomag projektjéhez való telepítéséhez kattintson a Telepítés gombra.
1.0.181002.2 és 1.0.190128.3 között létrehozott (vagy frissített)
Ha a projekt a VSIX-bővítmény 1.0.181002.2 és 1.0.190128.3 közötti verziójával jött létre, akkor a Microsoft.Windows. A CppWinRT NuGet-csomagot a projektsablon automatikusan telepítette 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 fordítási támogatás a VSIX-bővítmény ebbe a tartományba eső verzióiban is továbbra is jelen volt – előfordulhat, hogy a frissített projektben telepítve van a Microsoft.Windows.CppWinRT NuGet-csomag, de az is lehet, hogy nincs.
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 projektben telepítve van a Microsoft.Windows.CppWinRT NuGet-csomag.
Érvénytelen frissítési konfigurációk
A VSIX-bővítmény legújabb verziójában egy projekt nem rendelkezhet érvényesen a <CppWinRTEnabled>true</CppWinRTEnabled> tulajdonsággal, ha a Microsoft.Windows.CppWinRT NuGet-csomag nincs telepítve. Az ezzel a konfigurációval rendelkező projekt a következő fordítási hibaüzenetet eredményezi: „A C++/WinRT VSIX már nem nyújt projektfordítási támogatást.” Adjon hozzá egy projektreferenciát a Microsoft.Windows.CppWinRT NuGet-csomaghoz.
Ahogy fentebb említettük, egy C++/WinRT-projektnek telepítenie kell a NuGet-csomagot.
Mivel az <CppWinRTEnabled> elem már elavult, igény szerint szerkesztheti a(z) .vcxproj elemet, és törölheti az elemet. Nem feltétlenül szükséges, de ez egy lehetőség.
Emellett, ha a(z) .vcxproj tartalmazza a(z) <RequiredBundles>$(RequiredBundles);Microsoft.Windows.CppWinRT</RequiredBundles> elemet, eltávolíthatja azt, így a C++/WinRT VSIX bővítmény telepítése nélkül is lehessen fordítani.
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 fejlécfájl-alapú standard C++ kódtárat tartalmaz a belső Windows API-k (Windows-futtatókörnyezet API-k Windows névterekben való használatához). Ezek a fejlécek a(z) %WindowsSdkDir%Include<WindowsTargetPlatformVersion>\cppwinrt\winrt mappában 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 az Windows SDK is rendelkezik az cppwinrt.exe eszközzel. Javasoljuk azonban, hogy ehelyett telepítse és használja a cppwinrt.exe legújabb verzióját, amely a Microsoft.Windows.CppWinRT NuGet-csomag részét képezi. Ezt a csomagot, és cppwinrt.exea 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. A winrt::hstring parancsot például a C++/WinRT használatának első lépései című gyorsindító kódpéldában használjuk.
winrt::com_array egy másik típus, amelyet valószínűleg használni fog valamikor. Kevésbé valószínű azonban, hogy közvetlenül használ egy olyan típust, 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.
Warning
Vannak olyan típusok is, amelyekkel találkozhat, ha alaposan áttanulmányozza a C++/WinRT Windows névtér fejlécfájljait. Ilyen például a winrt::param::hstring, de vannak példák kollekciókra is. Ezek kizárólag a bemeneti paraméterek hozzárendelésének optimalizálására szolgálnak, jelentős teljesítményjavulást eredményeznek, és lehetővé teszik, hogy a legtöbb hívási minta „egyszerűen működjön” a kapcsolódó szabványos C++ típusokkal és tárolókkal. Ezeket a típusokat a leképezés csak azokban az esetekben használja, amikor azok jelentik a legnagyobb hozzáadott értéket. 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 szabványos típusokat vagy típusokat kell használnia a winrt névtérből.
Lásd még: Paraméterek átadása az ABI-határon keresztül.
Fontos API-k
Kapcsolódó témakörök
Windows developer