Megosztás a következőn keresztül:


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

 

 

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 témaköreinek teljes listája tartalmazza a C++/CX és a WRL interoperabilitásáról és a portolásról szóló információkat.

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_awaitengedé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 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 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 .vcxprojelemet, é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\winrttalá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.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. 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.

Fontos API-k