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


A C++/WinRT használatának első lépései

Fontos

További információ a Visual Studio C++/WinRT-fejlesztéshez való beállításáról – beleértve a C++/WinRT Visual Studio-bővítmény (VSIX) és a NuGet-csomag telepítését és használatát (amelyek együttesen projektsablont és buildtámogatást biztosítanak) – lásd Visual Studio C++/WinRT-támogatását.

A C++/WinRT használatának felgyorsításához ez a témakör egy új Windows Console-alkalmazás (C++/WinRT) projekten alapuló egyszerű kódpéldát mutat be. Ez a témakör azt is bemutatja, hogyan adhat hozzá C++/WinRT-támogatást egy Windows Desktop-alkalmazásprojekthez.

Megjegyzés:

Bár azt javasoljuk, hogy a Visual Studio és a Windows SDK legújabb verzióival dolgozzon. Ha a Visual Studio 2017 (15.8.0-s vagy újabb verziót) használja, és a Windows SDK 10.0.17134.0-s verzióját (Windows 10, 1803-es verzió) célozza meg, akkor előfordulhat, hogy egy újonnan létrehozott C++/WinRT-projektet nem sikerül lefordítani a következő hibával: "error C3861: 'from_abi': az azonosító nem található", és más hibákkal, amelyek az base.hfájlból erednek. A megoldás a Windows SDK egy későbbi (konformabb) verziójának megcélzása, vagy a C/C++LanguageConformance mód projekttulajdonság beállítása: Nincs (akkor sem, ha /megengedő- jelenik meg a projekttulajdonságban C/C++LanguageParancssori További beállítások, majd törölje).

C++/WinRT gyors üzembe helyezés

Hozzon létre egy új Windows-konzolalkalmazási (C++/WinRT) projektet.

Szerkeszd pch.h és main.cpp, hogy így nézzen ki.

// pch.h
#pragma once
#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/Windows.Web.Syndication.h>
#include <iostream>
// main.cpp
#include "pch.h"

using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Web::Syndication;

int main()
{
    winrt::init_apartment();

    Uri rssFeedUri{ L"https://blogs.windows.com/feed" };
    SyndicationClient syndicationClient;
    syndicationClient.SetRequestHeader(L"User-Agent", L"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");
    SyndicationFeed syndicationFeed = syndicationClient.RetrieveFeedAsync(rssFeedUri).get();
    for (const SyndicationItem syndicationItem : syndicationFeed.Items())
    {
        winrt::hstring titleAsHstring = syndicationItem.Title().Text();
        
        // A workaround to remove the trademark symbol from the title string, because it causes issues in this case.
        std::wstring titleAsStdWstring{ titleAsHstring.c_str() };
        titleAsStdWstring.erase(remove(titleAsStdWstring.begin(), titleAsStdWstring.end(), L'™'), titleAsStdWstring.end());
        titleAsHstring = titleAsStdWstring;

        std::wcout << titleAsHstring.c_str() << std::endl;
    }
}

Vegyük a fenti rövid kód példáját darabonként, és ismertessük az egyes részeket.

#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/Windows.Web.Syndication.h>

Az alapértelmezett projektbeállításokkal a belefoglalt fejlécek a Windows SDK-ból származnak a mappában %WindowsSdkDir%Include<WindowsTargetPlatformVersion>\cppwinrt\winrt. A Visual Studio ezt az elérési utat tartalmazza az IncludePath makróban. A Windows SDK-tól azonban nincs szigorú függőség, mert a projekt (az cppwinrt.exe eszköz segítségével) ugyanazokat a fejléceket hozza létre a projekt $(GeneratedFilesDir) mappájába. Ha máshol nem találhatók, vagy ha módosítja a projekt beállításait, akkor a rendszer betölti őket az adott mappából.

A fejlécek C++/WinRT-be vetített Windows API-kat tartalmaznak. Más szóval minden Windows-típushoz a C++/WinRT egy C++-felhasználóbarát megfelelőt (az úgynevezett előrejelzett típust) határoz meg. A kivetített típus teljes neve megegyezik a Windows típuséval, de a C++ winrt névtérben van elhelyezve . Ha ezeket az elemeket az előre összeállított fejlécbe helyezi, azzal csökkenti a növekményes buildelési időt.

Fontos

Ha windowsos névterekből szeretne típust használni, #include a megfelelő C++/WinRT Windows-névtérfejlécfájlt, a fent látható módon. A megfelelő fejléc az, amelynek neve megegyezik a típus névterével. Ha például a Windows:::Foundation:::Collections::P ropertySet futtatókörnyezeti osztály C++/WinRT-vetül etét szeretné használni, adja meg a fejlécet.

Gyakori, hogy egy C++/WinRT-vetítési fejléc automatikusan belefoglalja a kapcsolódó névtérfejlécfájlokat. Például a winrt/Windows.Foundation.Collections.h következőket tartalmazza winrt/Windows.Foundation.h: . Nem szabad azonban erre a viselkedésre támaszkodnia, mivel ez egy implementáció részletei, amelyek idővel változnak. A szükséges fejléceket explicit módon kell megadnia.

using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Web::Syndication;

Az using namespace irányelvek nem kötelezőek, de kényelmesek. Az ilyen irányelvek fent látható mintája (amely lehetővé teszi a winrt névtérben lévő adatok nem minősített névkeresését) alkalmas új projekt megkezdésekor, és a C++/WinRT az egyetlen nyelvi előrejelzés, amelyet a projekten belül használ. Ha viszont a C++/WinRT-kódot C+++/CX és/vagy SDK-alkalmazás bináris interfész (ABI) kóddal keveri (vagy a következőből portolt: vagy együttműködik egy vagy mindkét modellel), majd tekintse meg azokat a témaköröket, A C++/WinRT és a C+++/CXközötti interopálás, Áthelyezés a C+++/WinRT-be a C++/CX, és Interop között C++/WinRT és az ABI.

winrt::init_apartment();

A winrt<hívása:init_apartment inicializálja a szálat a Windows futtatókörnyezetben; alapértelmezés szerint egy többszálú lakásban. A hívás a COM-t is inicializálja.

Uri rssFeedUri{ L"https://blogs.windows.com/feed" };
SyndicationClient syndicationClient;

Halmozz fel két objektumot a stackre: az egyik a Windows-blog URI-ját, a másik egy szindikációs klienst képvisel. Az uri-t egyszerű, széles sztringkonstanssal készítjük el (a sztringek kezelésének további módjait a C++/WinRT sztringkezelésében találja).

SyndicationFeed syndicationFeed = syndicationClient.RetrieveFeedAsync(rssFeedUri).get();

SyndicationClient::RetrieveFeedAsync egy aszinkron Windows-futtatókörnyezeti függvény példája. A példakód egy aszinkron műveleti objektumot kap RetrieveFeedAsync, és meghívja lekéri a az objektumon, hogy blokkolja a hívó szálat, és várja meg az eredményt (ebben az esetben a syndication feedet). Az egyidejűségről és a nem blokkoló technikákról további információt a C++/WinRT egyidejűségi és aszinkron műveleteiben talál.

for (const SyndicationItem syndicationItem : syndicationFeed.Items()) { ... }

SyndicationFeed.Items egy tartomány, amelyet a begin és end függvények (vagy azok állandó, fordított és konstans-fordított variánsai) által visszaadott iterátorok határoznak meg. Emiatt tartományalapú utasítással vagy for sablonfüggvénnyel is számba vehet elemeket. Amikor egy ilyen Windows Runtime-gyűjteményt iterálsz, szükséged lesz #include <winrt/Windows.Foundation.Collections.h>-ra.

winrt::hstring titleAsHstring = syndicationItem.Title().Text();

// Omitted: there's a little bit of extra work here to remove the trademark symbol from the title text.

std::wcout << titleAsHstring.c_str() << std::endl;

Lekéri a hírcsatorna címszövegét winrt::hstring objektumként (a C++/WinRTsztringkezelésének további részletei). A hstring ezután a c_str függvényen keresztül jön ki, amely a C++ standard kódtár sztringjeihez használt mintát tükrözi.

Mint látható, a C++/WinRT modern, osztályszerű C++ kifejezéseket támogat, például syndicationItem.Title().Text(). Ez a hagyományos COM-programozástól eltérő, és tisztább programozási stílus. Nem kell közvetlenül inicializálnia a COM-t, és nem kell a COM-mutatókkal dolgoznia.

A HRESULT visszatérési kódjait sem kell kezelnie. A C++/WinRT a HRESULT-hibákat olyan kivételekké alakítja, mint a winrt::hresult-error egy természetes és modern programozási stílus esetében. A hibakezelésről és a kódpéldákról további információt a C++/WinRT hibakezelése című témakörben talál.

Windows Asztali alkalmazásprojekt módosítása C++/WinRT-támogatás hozzáadásához

Egyes asztali projektek (például a Visual Studio WinUI 3-sablonjai) beépített C++/WinRT-támogatással rendelkeznek.

Ez a szakasz bemutatja, hogyan adhat hozzá C++/WinRT-támogatást bármely Windows Desktop alkalmazás-projekthez. Ha nem rendelkezik meglévő Windows Desktop-alkalmazásprojekttel, akkor ezeket a lépéseket követve először létrehozhat egyet. Nyissa meg például a Visual Studiót, és hozzon létre egy Visual C++>Windows Desktop>Asztali Windows-alkalmazásprojektet .

Igény szerint telepítheti a C++/WinRT Visual Studio-bővítményt (VSIX) és a NuGet-csomagot. További részletekért lásd a Visual Studio támogatását C++/WinRT-hez.

Projekttulajdonságok beállítása

Navigáljon a(z) Projekt tulajdonságokhoz Általános>Windows SDK-verzió, és válassza Minden konfiguráció és Minden platformlehetőséget. Győződjön meg arról, hogy a Windows SDK-verzió a 10.0.17134.0 (Windows 10, 1803-es verzió) vagy újabb verzióra van állítva.

Győződjön meg arról, hogy önt nem érinti a Miért nem áll össze az új projektem?.

Mivel a C++/WinRT a C++17 szabvány funkcióit használja, állítsa be a C/C++>nyelv>C++ nyelvi szabvány projekttulajdonságot úgy, hogy az az ISO C++17 szabványra () álljon (/std:c++17).

Az előre összeállított fejléc

Az alapértelmezett projektsablon egy előre összeállított fejlécet hoz létre, vagy elnevezveframework.hstdafx.h. Nevezze át ezt pch.h-ra. Ha rendelkezik stdafx.cpp fájllal, nevezze át pch.cpp névre. A projekttulajdonság C/C++>Előre lefordított fejlécek>Előre összeállított fejléc beállítása Létrehozás (/Yc), és Előre összeállított fejlécfájlpch.h.

Keresse meg és cserélje le az összes #include "framework.h" (vagy #include "stdafx.h") #include "pch.h"-re.

Adja hozzá a pch.helemet a winrt/base.helemhez.

// pch.h
...
#include <winrt/base.h>

Összekapcsolás

A C++/WinRT nyelvi vetítés a Windows Futtatókörnyezet egyes ingyenes (nem tag) függvényeitől és belépési pontjaitól függ, amelyek a WindowsApp.lib esernyőtárhoz való csatolást igénylik. Ez a szakasz a linker kielégítésének három módját ismerteti.

Az első lehetőség az, hogy hozzáadja a Visual Studio-projekthez az összes C++/WinRT MSBuild tulajdonságot és célt. Ehhez telepítse a Microsoft.Windows.CppWinRT NuGet-csomagot a projektbe. Nyissa meg a projektet a Visual Studióban, kattintson a Projekt>NuGet-csomagok kezelése...>Tallózás, írja be vagy illessze be a keresőmezőbe a Microsoft.Windows.CppWinRT kifejezést, válassza ki az elemet a keresési eredményekből, majd kattintson a Telepítés gombra, hogy telepítse a csomagot ehhez a projekthez.

A projekthivatkozás beállításaival explicit módon csatolhatja WindowsApp.lib. Vagy a forráskódban (például pch.h) is megteheti, mint ez.

#pragma comment(lib, "windowsapp")

Most már lefordíthatja és csatolhatja, és hozzáadhat C++/WinRT-kódot a projekthez (például a fenti A C++/WinRT gyorsindítási szakaszban láthatóhoz hasonló kódot).

A C++/WinRT három fő forgatókönyve

A C++/WinRT használata és megismerése, valamint a dokumentáció további részeinek megismerése során valószínűleg észre fogja venni, hogy három fő forgatókönyv létezik, az alábbi szakaszokban leírtak szerint.

Windows API-k és -típusok használata

Más szóval vagy API-k meghívásával. Például API-hívások indítása a Bluetooth használatával való kommunikációhoz; videó streamelése és bemutatása; integrálható a Windows rendszerhéjjal; és így tovább. A C++/WinRT teljes mértékben és kompromisszumok nélkül támogatja ezt a forgatókönyvkategóriát. További információért lásd: API-k fogyasztása C++/WinRT segítségével.

Windows API-k és -típusok készítése

Más szóval API-k és -típusok előállítása. Például a fenti szakaszban leírt API-k előállítása; vagy a grafikus API-k; a tárolási és fájlrendszer API-k; a hálózati API-k és így tovább. További információért lásd Szerzői API-k C++/WinRT.

Az API-k C++/WinRT használatával történő létrehozása kicsit nagyobb szerepet játszik a használatuknál, mivel a implementálás előtt az IDL használatával kell meghatároznia az API alakját. Egy XAML-vezérlők áttekintése ismerteti ezt, és mutatja be, hogyan kell kötni egy C++/WinRT tulajdonsághoz.

XAML-alkalmazások

Ez a forgatókönyv az XAML felhasználói felületi keretrendszer alkalmazásainak és vezérlőinek kiépítéséről szól. Az XAML-alkalmazásokban végzett munka a használat és a létrehozás kombinációját tartalmazza. Mivel azonban az XAML jelenleg a Windows domináns felhasználói felületi keretrendszere, és a Windows futtatókörnyezetre gyakorolt hatása ezzel arányos, megérdemli a saját forgatókönyv kategóriáját.

Vegye figyelembe, hogy az XAML a legjobban olyan programozási nyelvekkel működik, amelyek reflectiont támogatnak. A C++/WinRT-ben néha egy kis plusz munkát kell elvégeznie az XAML-keretrendszerrel való együttműködéshez. Az összes ilyen esetet a dokumentáció ismerteti. Jó kiindulópontok az XAML-vezérlők (); a C++/WinRT tulajdonsághoz való kötés (); valamint a C++/WinRT-vel készült XAML egyéni (sablonos) vezérlők (, ).

C++/WinRT-ben írt mintaalkalmazások

Lásd : Hol találom a C++/WinRT mintaalkalmazásokat?.

Fontos API-k