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.
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++
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
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<
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
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
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 (
C++/WinRT-ben írt mintaalkalmazások
Lásd : Hol találom a C++/WinRT mintaalkalmazásokat?.
Fontos API-k
- SyndicationClient::RetrieveFeedAsync metódus
- SyndicationFeed.Items tulajdonság
- winrt::hstring struktúra
- winrt::hresult-error struct