Sdílet prostřednictvím


Začínáme s C++/WinRT

Důležité

Informace o nastavení sady Visual Studio pro vývoj pro C++/WinRT – včetně instalace a použití rozšíření sady C++/WinRT Visual Studio (VSIX) a balíčku NuGet (který společně poskytuje podporu pro šablonu projektu a sestavení) – viz podpora sady Visual Studio pro C++/WinRT.

Abyste mohli rychle pracovat s používáním C++/WinRT, toto téma vás provede jednoduchým příkladem kódu založeným na novém projektu konzolové aplikace systému Windows (C++/WinRT). Toto téma také ukazuje, jak přidat podporu C++/WinRT do projektu desktopové aplikace windows.

Poznámka:

I když doporučujeme vyvíjet s využitím nejnovějších verzí sady Visual Studio a sady Windows SDK, pokud používáte Visual Studio 2017 (verze 15.8.0 nebo novější) a cílíte na windows SDK verze 10.0.17134.0 (Windows 10, verze 1803), mohou se vyskytnout problémy při kompilaci nově vytvořeného projektu C++/WinRT s chybou "chyba C3861: 'from_abi': identifikátor nebyl nalezen", a s jinými chybami pocházejícími z base.h. Řešení je buď cílit na novější (konformnější) verzi sady Windows SDK, nebo nastavit vlastnost projektu jazyka C/C++>jazyka>souladu: Není (také pokud se /permissive- zobrazí ve vlastnosti projektu C/C++>Jazyk>příkazového řádku v části Další možnosti, a pak ho odstraňte).

Rychlý start pro C++/WinRT

Vytvořte nový projekt konzolové aplikace pro 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;
    }
}

Vezměme krátký příklad kódu kousek po kousku a vysvětleme si, co se odehrává v každé části.

#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 uvnitř složky %WindowsSdkDir%Include<WindowsTargetPlatformVersion>\cppwinrt\winrt. Visual Studio zahrnuje danou cestu v makru IncludePath. Není ale žádná přísná závislost na sadě Windows SDK, protože váš projekt, prostřednictvím nástroje cppwinrt.exe, 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 promítaná do C++/WinRT. Jinými slovy, C++/WinRT definuje pro každý typ Windows ekvivalent přátelský k C++ (označovaný jako projekční typ ). Projektovaný typ má stejný plně kvalifikovaný název jako typ Windows, ale je umístěn v oboru názvů winrt. Zahrnutím těchto souborů do předkompilované hlavičky se zkrátí časy přírůstkového sestavení.

Důležité

Kdykoli chcete použít typ z oborů názvů Windows, musíte #include odpovídající hlavičkový soubor oboru názvů C++/WinRT Windows, jak je uvedeno výše. odpovídající hlavička je ta se stejným názvem jako obor názvů daného typu. Pokud chcete například použít projekci C++/WinRT pro běhovou třídu Windows::Foundation::Collections::PropertySet, zahrňte záhlaví winrt/Windows.Foundation.Collections.h.

Je běžné, že hlavičky projekcí C++/WinRT automaticky zahrnují soubory hlaviček 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ý, když začínáte nový projekt a C++/WinRT je jediná projekce jazyka, kterou používáte uvnitř tohoto projektu. Pokud, na druhé straně, Kombinujete kód C++/WinRT s kódem C++/CX nebo sadou SDK (ABI) (portujete z jednoho nebo obou těchto modelů) a pak se podívejte na témata spolupráce mezi C++/WinRT a C++/CX, Přechod na C++/WinRT z C++/CX z C++/CX, a interoperabilitu mezi C++/WinRT aABI .

winrt::init_apartment();

Volání winrt::init_apartment inicializuje vlákno v prostředí Windows Runtime; ve výchozím nastavení ve vícevláknovém apartmánu. Volání také inicializuje COM.

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

Alokujte na zásobníku dva objekty: představují identifikátor URI blogu Windows a klienta syndikace. Vytvoříme uri pomocí jednoduchého širokého řetězcového literálu (viz zpracování řetězců v C++/WinRT, kde najdete další způsoby práce s řetězci).

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

SyndicationClient::RetrieveFeedAsync je příkladem asynchronní funkce prostředí Windows Runtime. Tento příklad kódu obdrží asynchronní objekt operace z RetrieveFeedAsynca volá get na tomto objektu, aby zablokoval volající vlákno a čekal na výsledek (v tomto případě syndikační zdroj). Další informace o souběžnosti a neblokovacích technikách najdete v tématu Souběžnost a asynchronní operace v C++/WinRT.

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

SyndicationFeed.Items je oblast definovaná iterátory vrácenými z začátek a konec funkcí (nebo jejich konstantní, obrácené a obrácené konstantní varianty). Z tohoto důvodu můžete vytvořit výčet položek příkazem založeným for na rozsahu nebo pomocí funkce šablony std::for_each. Pokaždé, když iterujete kolekci v rámci Windows Runtime, 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 informačního kanálu jako objekt typu winrt::hstring (další podrobnosti viz zpracování řetězců v C++/WinRT ). hstring je pak vyveden prostřednictvím funkce c_str, která odráží vzor použitý s řetězci standardní knihovny C++.

Jak vidíte, C++/WinRT podporuje moderní a podobné výrazy jazyka C++, jako je 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 jsou 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 pro Windows pro přidání podpory C++/WinRT

Některé desktopové projekty (například šablony WinUI 3 v sadě 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 nemáte existující projekt desktopové aplikace pro Windows, můžete postupovat podle těchto kroků tak, že ho nejprve vytvoříte. Otevřete například Visual Studio a vytvořte projekt Visual C++>Windows desktopová aplikace>Windows Desktop Application.

Volitelně můžete nainstalovat rozšíření C++/WinRT Visual Studio (VSIX) a balíček NuGet. Podrobnosti najdete v tématu podpora sady Visual Studio pro C++/WinRT.

Nastavení vlastností projektu

Přejděte na vlastnost projektu Obecné>Verze Windows SDKa vyberte Všechny konfigurace a Všechny platformy. Ujistěte se, že windows SDK verze je nastavená na 10.0.17134.0 (Windows 10, verze 1803) nebo novější.

Potvrďte, že vás Proč se nový projekt nezkompiluje?.

Vzhledem k tomu, že jazyk C++/WinRT používá funkce ze standardu C++17, nastavte vlastnost projektu jazyka C/C++>>jazyka C++ na STANDARD ISO C++17 Standard (/std:c++17).

Předkompilovaná hlavička

Výchozí šablona projektu 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čkypředkompilované hlavičky navytvořit (/Yc) a předkompilovaný hlavičkový soubor na pch.h.

Vyhledejte a nahraďte všechny #include "framework.h" (nebo #include "stdafx.h") za #include "pch.h".

Do pch.hzahrnout winrt/base.h.

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

Propojování

Projekce jazyka C++/WinRT závisí na určitých volných (nezávislých) funkcích a vstupních bodech prostředí Windows Runtime, které vyžadují propojení se společnou knihovnou WindowsApp.lib. Tato část popisuje tři možnosti, jak vyhovět linkeru.

První možností je přidat do projektu sady Visual Studio všechny vlastnosti a cíle C++/WinRT MSBuild. Uděláte to tak, že do projektu nainstalujete balíček NuGet Microsoft.Windows.CppWinRT. Otevřete projekt ve Visual Studio, klikněte na Project>Spravovat balíčky NuGet...>Procházet, zadejte nebo vložte Microsoft.Windows.CppWinRT do vyhledávacího pole, vyberte položku ve výsledcích hledání a potom kliknutím na Nainstalovat nainstalujte balíček pro tento projekt.

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 (například v pch.h).

#pragma comment(lib, "windowsapp")

Teď můžete zkompilovat a připojit a přidat kód C++/WinRT do projektu (například část kódu podobná té uvedené v části Rychlý začátek 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.

Využívání rozhraní API a typů Windows

Jinými slovy, pomocí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; a tak dále. C++/WinRT plně a nekompromisně podporuje tuto kategorii scénáře. Další informace najdete v tématu Používání rozhraní API pomocí 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 API pro autory v jazyce C++/WinRT.

Vytváření rozhraní API pomocí C++/WinRT je o něco složitější než jejich využívání, protože před implementací musíte definovat strukturu pomocí IDL. V ovládacích prvcích XAML existuje návod, jak to udělat, a navázat vazbu 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 dnes dominantní architekturou uživatelského rozhraní ve Windows a její 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; připojte k vlastnosti C++/WinRT a vlastní XAML ovládací prvky (s šablonou) s C++/WinRT.

Ukázkové aplikace napsané v C++/WinRT

Viz Kde najdu ukázkové aplikace C++/WinRT?.

Důležitá rozhraní API