Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Důležité
Informace o nastavení Visual Studio pro vývoj pro C++/WinRT – včetně instalace a použití rozšíření C++/WinRT Visual Studio (VSIX) a balíčku NuGet (který společně poskytuje podporu šablony projektu a sestavení) – viz Visual Studio podpora pro C++/WinRT.
Abychom vás rychle seznámili s používáním C++/WinRT, toto téma vás provede jednoduchým příkladem kódu, který vychází z nového projektu Windows Console Application (C++/WinRT). Toto téma také ukazuje, jak přidat podporu C++/WinRT do projektu aplikace Windows Desktop.
Note
Přestože doporučujeme vyvíjet s využitím nejnovějších verzí Visual Studio a sady Windows SDK, pokud používáte Visual Studio 2017 (verze 15.8.0 nebo novější) a cílení na sadu Windows SDK verze 10.0.17134.0 (Windows 10, verze 1803), pak nově vytvořený projekt C++/WinRT se nemusí podařit zkompilovat s chybou "chyba C3861: "from_abi": identifikátor nebyl nalezen" a s jinými chybami pocházejícími ze base.h. Řešení je buď cílit na novější (konformnější) verzi sady Windows SDK, nebo nastavit vlastnost projektu C/C++>Language>Conformance mode: Ne (také pokud se /permissive- zobrazí ve vlastnosti projektu C/C++>Language>Command Line v části Další možnosti a pak ho odstraňte).
Rychlý start pro C++/WinRT
Vytvořte nový projekt konzolové aplikace Windows (C++/WinRT).
Upravte pch.h a main.cpp tak, aby vypadaly takto.
// 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;
}
}
Pojďme si krátkou ukázku kódu uvedenou výše projít část po části a vysvětlit si, co se v každé z nich děje.
#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/Windows.Web.Syndication.h>
Ve výchozím nastavení projektu pocházejí zahrnuté hlavičky ze sady Windows SDK ve složce %WindowsSdkDir%Include<WindowsTargetPlatformVersion>\cppwinrt\winrt. Visual Studio zahrnuje tuto cestu v makru IncludePath. Neexistuje ale žádná striktní závislost na Windows SDK, protože váš projekt (prostřednictvím cppwinrt.exe nástroje) generuje stejné hlavičky do složky $(GeneratedFilesDir) vašeho projektu. Načtou se z této složky, pokud se nedají najít jinde nebo když změníte nastavení projektu.
Hlavičky obsahují rozhraní API systému Windows projekovaná do C++/WinRT. Jinými slovy, pro každý typ Windows definuje C++/WinRT ekvivalent jazyka C++, který je vhodný pro jazyk C++(označovaný jako projektovaný typ). Projektovaný typ má stejný plně kvalifikovaný název jako typ Windows, ale je umístěn v oboru názvů winrt jazyka C++. Zahrnutí těchto direktiv #include do předkompilované hlavičky zkracuje dobu přírůstkového sestavení.
Důležité
Kdykoli chcete použít typ z oboru názvů systému Windows, musíte #include odpovídající soubor záhlaví oboru názvů Windows pro C++/WinRT, jak je znázorněno výše.
Odpovídající hlavička je ta, která má stejný název jako obor názvů typu. Pokud například chcete použít projekci C++/WinRT pro běhovou třídu Windows::Foundation::Collections::PropertySet, zahrňte soubor záhlaví winrt/Windows.Foundation.Collections.h.
Je běžné, že projekční hlavička C++/WinRT automaticky zahrne hlavičkové soubory souvisejících oborů názvů. Například winrt/Windows.Foundation.Collections.h zahrnuje winrt/Windows.Foundation.h. Toto chování byste ale neměli spoléhat, protože se jedná o podrobnosti implementace, které se v průběhu času mění. Musíte explicitně zahrnout všechny hlavičky, které potřebujete.
using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Web::Syndication;
Direktivy using namespace jsou volitelné, ale pohodlné. Vzor uvedený výše pro tyto direktivy (povolení nekvalifikovaného vyhledávání názvů pro cokoli v oboru názvů winrt ) je vhodný pro zahájení nového projektu a jazyk C++/WinRT je jediná projekce jazyka, kterou v rámci tohoto projektu používáte. Pokud na druhou stranu kombinujete kód C++/WinRT s kódem C++/CX a/nebo s kódem binárního rozhraní aplikace SDK (ABI) (buď převádíte z jednoho nebo obou těchto modelů, nebo s nimi zajišťujete interoperabilitu), přečtěte si témata Interoperabilita mezi C++/WinRT a C++/CX, Přechod z C++/CX na C++/WinRT a Interoperabilita mezi C++/WinRT a ABI.
winrt::init_apartment();
Volání winrt::init_apartment inicializuje vlákno v prostředí Windows Runtime; ve výchozím nastavení v vícevláknovém bytě. Volání také inicializuje COM.
Uri rssFeedUri{ L"https://blogs.windows.com/feed" };
SyndicationClient syndicationClient;
V zásobníku vytvořte dva objekty: jeden představuje identifikátor URI blogu Windows a druhý klienta syndikace. Identifikátor URI vytvoříme pomocí jednoduchého řetězcového literálu (další způsoby práce s řetězci najdete v tématu Zpracování řetězců v jazyce C++/WinRT ).
SyndicationFeed syndicationFeed = syndicationClient.RetrieveFeedAsync(rssFeedUri).get();
SyndicationClient::RetrieveFeedAsync je příkladem asynchronní prostředí Windows Runtime funkce. Příklad kódu získá objekt asynchronní operace z RetrieveFeedAsync a na tomto objektu zavolá get, aby zablokoval volající vlákno a počkal na výsledek (což je v tomto případě syndikační kanál). Další informace o souběžnosti a neblokujících technikách najdete v tématu Souběžnost a asynchronní operace s C++/WinRT.
for (const SyndicationItem syndicationItem : syndicationFeed.Items()) { ... }
SyndicationFeed.Items je oblast definovaná iterátory vrácenými z počátečních a koncových funkcí (nebo jejich konstantní, reverzní a konstantní-reverzní varianty). Z tohoto důvodu můžete vytvořit výčet položek pomocí příkazu založeného na for rozsahu nebo pomocí funkce šablony std::for_each . Kdykoli iterujete nad kolekcí prostředí Windows Runtime takto, budete muset #include <winrt/Windows.Foundation.Collections.h>.
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;
Získá text názvu kanálu jako objekt typu winrt::hstring (další podrobnosti najdete v části Zpracování řetězců v C++/WinRT). Řetězec hstring se pak vypíše pomocí funkce c_str, což odpovídá vzoru používanému u řetězců standardní knihovny C++.
Jak vidíte, jazyk C++/WinRT podporuje moderní a třídou podobné výrazy jazyka C++, například syndicationItem.Title().Text(). Jedná se o jiný a čistější programovací styl od tradičního programování modelu COM. Nemusíte přímo inicializovat COM ani pracovat s ukazateli COM.
Nemusíte zpracovávat návratové kódy HRESULT. C++/WinRT převádí chyby HRESULT na výjimky, jako je winrt::hresult-error pro přirozený a moderní programovací styl. Další informace o zpracování chyb a příkladech kódu najdete v tématu Zpracování chyb pomocí C++/WinRT.
Úprava projektu desktopové aplikace Windows pro přidání podpory C++/WinRT
Některé desktopové projekty (například šablony WinUI 3 v Visual Studio) mají integrovanou podporu C++/WinRT.
V této části se ale dozvíte, jak můžete přidat podporu C++/WinRT do libovolného projektu desktopové aplikace Windows, který můžete mít. Pokud ještě nemáte projekt desktopové aplikace Windows, můžete postupovat podle těchto kroků tak, že ho nejprve vytvoříte. Například otevřete Visual Studio a vytvořte projekt Visual C++>Windows Desktop>Windows Desktop Application.
Volitelně můžete nainstalovat rozšíření C++/WinRT Visual Studio (VSIX) a balíček NuGet. Podrobnosti najdete v článku Podpora C++/WinRT v aplikaci Visual Studio.
Nastavení vlastností projektu
Přejděte na vlastnost projektu Obecné>Windows verze sady SDK a vyberte Všechny konfigurace a všechny platformy. Ujistěte se, že je verze sady Windows SDK nastavená na 10.0.17134.0 (Windows 10 verze 1803) nebo novější.
Potvrďte, že se vás netýká Proč se můj nový projekt nezkompiluje?
Vzhledem k tomu, že C++/WinRT používá funkce ze standardu C++17, nastavte vlastnost projektu C/C++>Language>C++ Standard na ISO C++17 Standard (/std:c++17).
Předkompilovaná hlavička
Výchozí šablona projektu pro vás vytvoří předkompilovanou hlavičku s názvem framework.hnebo stdafx.h. Přejmenujte ho na pch.h. Pokud máte stdafx.cpp soubor, přejmenujte ho na pch.cpp. Nastavte vlastnost projektu C/C++>Předkompilované hlavičky>Předkompilovaná hlavička na Vytvořit (/Yc) a vlastnost Soubor předkompilované hlavičky na pch.h.
Najít a nahradit vše #include "framework.h" (nebo #include "stdafx.h") za #include "pch.h".
Do pch.h zahrňte winrt/base.h.
// pch.h
...
#include <winrt/base.h>
Propojování
Projekce jazyka C++/WinRT závisí na určitých prostředí Windows Runtime bezplatných (nečlenových) funkcích a vstupních bodech, které vyžadují propojení s zastřešující knihovnou WindowsApp.lib. Tato část popisuje tři způsoby, jak vyhovět linkeru.
První možností je přidat do projektu Visual Studio všechny vlastnosti a cíle C++/WinRT MSBuild. Uděláte to tak, že ve svém projektu nainstalujete balíček NuGet Microsoft.Windows.CppWinRT. Otevřete project v Visual Studio, klikněte na Project>Spravování balíčků NuGet...>Procházet, psát nebo vkládat Microsoft.Windows. CppWinRT ve vyhledávacím poli, vyberte položku ve výsledcích hledání a potom klepněte na tlačítko Nainstalovat, chcete-li nainstalovat balíček pro tento project.
Nastavení propojení projektu můžete také použít k explicitnímu propojení WindowsApp.lib. Nebo to můžete udělat ve zdrojovém kódu ( pch.hnapříklad v tomto příkladu).
#pragma comment(lib, "windowsapp")
Teď můžete zkompilovat a propojit kód C++/WinRT do projektu (například kód podobný kódu, který je uvedený v části Rychlý start jazyka C++/WinRT výše).
Tři hlavní scénáře pro C++/WinRT
Při používání a seznámení s C++/WinRT a projděte si zbývající část dokumentace, pravděpodobně si všimnete, že existují tři hlavní scénáře, jak je popsáno v následujících částech.
Používání rozhraní API a typů systému Windows
Jinými slovy, používání nebo volání rozhraní API. Například volání rozhraní API ke komunikaci pomocí Bluetooth; streamování a prezentace videa; integrace s prostředím Windows atd. C++/WinRT plně a nekompromisně podporuje tuto kategorii scénáře. Další informace najdete v tématu Využití rozhraní API s C++/WinRT.
Vytváření rozhraní API a typů Windows
Jinými slovy, vytváření rozhraní API a typů. Například vytváření druhů rozhraní API popsaných v části výše; rozhraní API grafiky; rozhraní API systému souborů a úložiště; síťová rozhraní API atd. Další informace najdete v tématu Vytváření rozhraní API pomocí C++/WinRT.
Vytváření API pomocí C++/WinRT je o něco složitější než jejich používání, protože před jejich implementací musíte pomocí IDL definovat podobu API. Postup, jak to udělat, najdete v článku Ovládací prvky XAML; navázání na vlastnost C++/WinRT.
Aplikace XAML
Tento scénář se týká vytváření aplikací a ovládacích prvků v architektuře uživatelského rozhraní XAML. Práce v aplikaci XAML se rovná kombinaci využívání a vytváření obsahu. Vzhledem k tomu, že XAML je dominantním rozhraním uživatelského rozhraní pro Windows dnes a jeho vliv na prostředí Windows Runtime je úměrný tomu, zaslouží si vlastní kategorii scénáře.
Mějte na paměti, že XAML funguje nejlépe s programovacími jazyky, které nabízejí reflexi. V jazyce C++/WinRT někdy musíte udělat trochu další práci, abyste mohli spolupracovat s architekturou XAML. Všechny tyto případy jsou popsané v dokumentaci. Dobrým místem, kde začít, jsou ovládací prvky XAML; vazba na vlastnost C++/WinRT a vlastní ovládací prvky XAML (šablonované) pomocí C++/WinRT.
Ukázkové aplikace napsané v C++/WinRT
Podívejte se, kde najdu ukázkové aplikace C++/WinRT?.
Důležitá rozhraní API
- Metoda SyndicationClient::RetrieveFeedAsync
- SyndicationFeed.Items – vlastnost
- winrt::hstring – struktura
- winrt::hresult-error – struktura
Příbuzná témata
Windows developer