Bevezetés a C++/WinRT használatába

 

 

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.

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_await engedé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.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 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