Udostępnij za pomocą


Wprowadzenie do języka C++/WinRT

 

 

C++/WinRT to całkowicie standardowa nowoczesna projekcja języka C++17 dla interfejsów API środowiska Uruchomieniowego systemu Windows (WinRT), zaimplementowana jako biblioteka oparta na plikach nagłówków i zaprojektowana w celu zapewnienia najwyższej klasy dostępu do nowoczesnego interfejsu API systemu Windows. Za pomocą języka C++/WinRT można tworzyć interfejsy API środowiska uruchomieniowego systemu Windows i korzystać z nich przy użyciu dowolnego kompilatora zgodnego ze standardami C++17. Zestaw Windows SDK obejmuje język C++/WinRT; wprowadzono go w wersji 10.0.17134.0 (Windows 10, wersja 1803).

C++/WinRT jest zalecanym zamiennikiem dla projekcji języka C++/CX oraz biblioteki szablonów dla środowiska uruchomieniowego Windows (WRL). Pełna lista tematów dotyczących C++/WinRT zawiera informacje zarówno o współdziałaniu z językiem C++/CX, jak i o przechodzeniu z C++/CX oraz WRL.

Ważne

Niektóre z najważniejszych elementów języka C++/WinRT, o których należy pamiętać, zostały opisane w sekcjach Obsługa zestawu SDK dla języków C++/WinRT i Visual Studio dla języków C++/WinRT, XAML, rozszerzenia VSIX i pakietu NuGet.

Zobacz też Gdzie można znaleźć przykładowe aplikacje C++/WinRT?.

Projekcje językowe

Środowisko uruchomieniowe systemu Windows jest oparte na interfejsach API modelu obiektów składników (COM) i jest zaprojektowane tak, aby umożliwiać dostęp za pośrednictwem projekcji językowych . Projekcja ukrywa szczegóły modelu COM i zapewnia bardziej naturalne środowisko programowania dla danego języka.

Projekcja języka C++/WinRT w zawartości referencyjnej interfejsu API środowiska uruchomieniowego systemu Windows

Podczas przeglądania interfejsów API środowiska uruchomieniowego systemu Windowskliknij pole kombi języka w prawym górnym rogu, a następnie wybierz C++/WinRT, aby wyświetlić bloki składni interfejsu API wyświetlane w projekcji języka C++/WinRT.

Obsługa programu Visual Studio dla języków C++/WinRT, XAML, rozszerzenia VSIX i pakietu NuGet

W przypadku obsługi programu Visual Studio potrzebujesz programu Visual Studio 2022 lub Visual Studio 2019 lub Visual Studio 2017 (co najmniej w wersji 15.6; zalecamy co najmniej 15.7). Z poziomu Instalatora programu Visual Studio zainstaluj obciążenie tworzenia platformy uniwersalnej systemu Windows. W szczegółach instalacjidla programowania na uniwersalnej platformie systemu Windowszaznacz opcję/ę narzędzia platformy uniwersalnej systemu Windows C++ (v14x) , jeśli jeszcze tego nie zrobiłeś/aś. W Ustawieniach> WindowsPrywatność i zabezpieczenia (Windows 10: Aktualizacja i zabezpieczenia) >Dla deweloperów włącz opcję Tryb dewelopera (Windows 10: zamiast opcji Pobierz bezpośrednie aplikacje).

Chociaż zalecamy programowanie przy użyciu najnowszych wersji programu Visual Studio i zestawu Windows SDK, Jeśli używasz wersji C++/WinRT dostarczanej z zestawem Windows SDK przed wersją 10.0.17763.0 (Windows 10, wersja 1809), a następnie, aby użyć nagłówków przestrzeni nazw systemu Windows wymienionych powyżej, potrzebujesz minimalnej wersji docelowej zestawu Windows SDK w projekcie 10.0.0.17134.0 (Windows 10, wersja 1803).

Program Visual Studio 2022 jest dostarczany z wbudowanymi szablonami projektów C++/WinRT i elementów, dzięki czemu można od razu rozpocząć pracę z programowaniem C++/WinRT. Zawiera również natywną wizualizację debugowania programu Visual Studio (natvis) typów projekcjonowanych C++/WinRT, dostarczając środowisko podobne do debugowania w języku C#. Natvis działa automatycznie dla wersji debugowania. Aby uzyskać więcej informacji, zobacz natywne wizualizacje debugowania w Visual Studio dla języka C++/WinRT.

W przypadku starszych wersji programu Visual Studio należy pobrać i zainstalować najnowszą wersję rozszerzenia C++/WinRT Visual Studio (VSIX) z witryny Visual Studio Marketplace.

  • Rozszerzenie VSIX udostępnia szablony projektów i elementów C++/WinRT w programie Visual Studio.
  • Ponadto zapewnia ona natywną wizualizację debugowania programu Visual Studio (natvis) przewidywanych typów C++/WinRT.

Szablony projektów programu Visual Studio dla języka C++/WinRT zostały opisane w poniższych sekcjach. Podczas tworzenia nowego projektu C++/WinRT z zainstalowaną najnowszą wersją rozszerzenia VSIX nowy projekt C++/ WinRT automatycznie instaluje pakiet NuGet Microsoft.Windows.CppWinRT. Pakiet Microsoft.Windows.CppWinRT NuGet zapewnia obsługę kompilacji C++/WinRT (właściwości i obiekty docelowe MSBuild), co umożliwia przenoszenie projektu między maszyną deweloperską a agentem kompilacji (na którym zainstalowany jest tylko pakiet NuGet, a nie rozszerzenie VSIX).

Alternatywnie możesz przekonwertować istniejący projekt, ręcznie instalując pakiet NuGet Microsoft.Windows.CppWinRT . Po zainstalowaniu (lub zaktualizowaniu do) najnowszej wersji rozszerzenia VSIX otwórz istniejący projekt w programie Visual Studio, kliknij pozycję Project>Manage NuGet Packages...>W polu wyszukiwania wyszukaj, wpisz lub wklej ciąg Microsoft.Windows.CppWinRT , wybierz element w wynikach wyszukiwania, a następnie kliknij przycisk Zainstaluj , aby zainstalować pakiet dla tego projektu. Po dodaniu pakietu uzyskasz obsługę programu MSBuild języka C++/WinRT dla projektu, w tym wywołanie narzędzia cppwinrt.exe.

Ważne

Jeśli masz projekty utworzone za pomocą programu (lub uaktualnione do pracy z) wersją rozszerzenia VSIX wcześniejszą niż 1.0.190128.4, zobacz wcześniejsze wersje rozszerzenia VSIX. Ta sekcja zawiera ważne informacje o konfiguracji projektów, które należy wiedzieć, aby uaktualnić je do korzystania z najnowszej wersji rozszerzenia VSIX.

  • Ponieważ język C++/WinRT używa funkcji ze standardu C++17, pakiet NuGet ustawia właściwość projektu C/C++>Language>C++ Language Standard> w programie Visual Studio.
  • Dodaje również opcję kompilatora /bigobj .
  • Dodaje opcję kompilatora /await, aby umożliwić co_await.
  • Nakazuje kompilatorowi XAML generowanie kodu C++/WinRT.
  • Możesz również ustawić tryb zgodności : Tak (/permissive-), co dodatkowo dostosowuje kod do zgodności ze standardami.
  • Inną właściwością projektu, o których należy pamiętać, jest C/C++>General> (Ogólne traktowanie ostrzeżeń jako błędów). Ustaw wartość Tak (/WX) lub Nie (/WX-) według uznania. Czasami pliki źródłowe generowane przez cppwinrt.exe narzędzie generują ostrzeżenia do momentu dodania implementacji do nich.

Po skonfigurowaniu systemu zgodnie z powyższym opisem będziesz mieć możliwość tworzenia i kompilowania lub otwierania projektu C++/WinRT w programie Visual Studio i wdrażania go.

Od wersji 2.0 pakiet NuGet Microsoft.Windows.CppWinRT zawiera cppwinrt.exe narzędzie . Narzędzie cppwinrt.exe można wskazać w pliku metadanych środowiska uruchomieniowego systemu Windows (.winmd), aby wygenerować standardową bibliotekę języka C++ opartą na nagłówkach, która projektów interfejsów API opisanych w metadanych do użycia z poziomu kodu C++/WinRT. Pliki metadanych środowiska uruchomieniowego systemu Windows (.winmd) zapewniają kanoniczny sposób opisywania powierzchni interfejsu API środowiska uruchomieniowego systemu Windows. Wskazując cppwinrt.exe na metadane, możesz wygenerować bibliotekę do użycia z dowolną klasą środowiska uruchomieniowego zaimplementowaną w składniku środowiska uruchomieniowego systemu Windows drugiej lub trzeciej firmy, lub zaimplementowaną we własnej aplikacji. Aby uzyskać więcej informacji, zobacz Korzystanie z interfejsów API za pomocą języka C++/WinRT.

Za pomocą języka C++/WinRT można również zaimplementować własne klasy środowiska uruchomieniowego przy użyciu standardowego języka C++, bez uciekania się do programowania w stylu MODELU COM. W przypadku klasy środowiska uruchomieniowego wystarczy opisać swoje typy w pliku IDL, a midl.exe i cppwinrt.exe wygenerują szablonowe pliki kodu źródłowego implementacji. Możesz też po prostu zaimplementować interfejsy, wyprowadzając z klasy bazowej C++/WinRT. Aby uzyskać więcej informacji, zobacz Author APIs with C++/WinRT.

Aby uzyskać listę opcji dostosowywania narzędzia cppwinrt.exe , ustawianych za pomocą właściwości projektu, zobacz plik Readme pakietu NuGet Microsoft.Windows.CppWinRT.

Można zidentyfikować projekt korzystający z obsługi programu MSBuild języka C++/WinRT przez obecność pakietu NuGet Microsoft.Windows.CppWinRT zainstalowanego w projekcie.

Poniżej przedstawiono szablony projektów programu Visual Studio udostępniane przez rozszerzenie VSIX.

Pusta aplikacja (C++/WinRT)

Szablon projektu dla aplikacji platformy uniwersalnej systemu Windows (UWP), która ma interfejs użytkownika XAML.

Program Visual Studio zapewnia obsługę kompilatora XAML w celu generowania wycinków implementacji i nagłówków z pliku IDL (.idlInterface Definition Language) (IDL), który znajduje się za każdym plikiem znaczników XAML. W pliku IDL zdefiniuj dowolne lokalne klasy środowiska uruchomieniowego, do których chcesz się odwołać na stronach XAML swojej aplikacji, a następnie skompiluj projekt jednokrotnie, aby wygenerować szablony implementacji w Generated Files oraz wycinkowe definicje typów w Generated Files\sources. Następnie użyj tych definicji typów szkieletów jako odniesienia przy implementacji lokalnych klas środowiska uruchomieniowego. Zobacz Rozdzielanie klas środowiska uruchomieniowego na pliki Midl (.idl).

Obsługa powierzchni projektowej XAML w programie Visual Studio dla języka C++/WinRT jest bliska parzystości języka C#. W programie Visual Studio możesz użyć karty Events okna właściwości , aby dodać programy obsługi zdarzeń w projekcie C++/WinRT. Możesz również ręcznie dodać programy obsługi zdarzeń do kodu — zobacz Obsługa zdarzeń za pomocą delegatów w C++/WinRT, aby uzyskać więcej informacji.

Aplikacja podstawowa (C++/WinRT)

Szablon projektu dla aplikacji platformy uniwersalnej systemu Windows (UWP), która nie używa języka XAML.

Zamiast tego używa nagłówka przestrzeni nazw systemu Windows C++/WinRT dla przestrzeni nazw Windows.ApplicationModel.Core. Po utworzeniu i uruchomieniu kliknij puste miejsce, aby dodać kolorowy kwadrat; następnie kliknij kolorowy kwadrat, aby go przeciągnąć.

Aplikacja konsolowa systemu Windows (C++/WinRT)

Szablon projektu dla aplikacji klienckiej C++/WinRT dla systemu Windows Desktop z interfejsem użytkownika konsoli.

Aplikacja pulpitowa systemu Windows (C++/WinRT)

Szablon projektu dla aplikacji klienckiej C++/WinRT na Windows Desktop, który wyświetla Windows Runtime Windows.Foundation.Uri wewnątrz Win32 MessageBox.

Składnik środowiska uruchomieniowego systemu Windows (C++/WinRT)

Szablon projektu dla składnika; zazwyczaj do użycia z Uniwersalną platformą Windows (UWP).

Ten szablon demonstruje midl.exe>cppwinrt.exe łańcuch narzędzi, w którym metadane środowiska uruchomieniowego systemu Windows (.winmd) są generowane na podstawie języka IDL, a następnie przykładowe implementacje i nagłówki są generowane na podstawie metadanych środowiska uruchomieniowego systemu Windows.

W pliku IDL zdefiniuj klasy środowiska uruchomieniowego w składniku, ich interfejs domyślny i wszystkie inne implementowanie interfejsów. Skompiluj projekt raz, aby wygenerować module.g.cpp, module.h.cpp, szablony implementacji w Generated Filesi definicje typów szkieletowych w Generated Files\sources. Następnie użyj tych definicji typów szkiców jako odniesienie do implementacji klas środowiska uruchomieniowego w składniku. Zobacz Rozdzielanie klas środowiska uruchomieniowego na pliki Midl (.idl).

Dołącz skompilowany plik binarny składnika środowiska uruchomieniowego Windows i jego .winmd do aplikacji UWP konsumującej je.

Wcześniejsze wersje rozszerzenia VSIX

Zalecamy zainstalowanie (lub zaktualizowanie) najnowszej wersji rozszerzenia VSIX. Jest ona domyślnie skonfigurowana do aktualizowania. Jeśli to zrobisz, i masz projekty, które zostały utworzone z wersją rozszerzenia VSIX wcześniejsze niż 1.0.190128.4, ta sekcja zawiera ważne informacje dotyczące uaktualniania tych projektów do pracy z nową wersją. Jeśli nie zaktualizujesz, nadal znajdziesz informacje w tej sekcji przydatne.

Jeśli chodzi o obsługiwane wersje Windows SDK i Visual Studio oraz konfigurację Visual Studio, informacje zawarte w sekcjach dotyczących obsługi C++/WinRT, XAML, rozszerzenia VSIX i pakietu NuGet powyżej dotyczą wcześniejszych wersji rozszerzenia VSIX. W poniższych informacjach opisano ważne różnice dotyczące zachowania i konfiguracji projektów utworzonych przy użyciu wcześniejszych wersji (lub uaktualnionych do pracy z nimi).

Utworzono wcześniej niż 1.0.181002.2

Jeśli projekt został utworzony przy użyciu wersji rozszerzenia VSIX starszej niż 1.0.181002.2, obsługa kompilacji C++/WinRT została wbudowana w tej wersji rozszerzenia VSIX. Projekt ma właściwość <CppWinRTEnabled>true</CppWinRTEnabled> ustawioną w pliku .vcxproj.

<Project ...>
    <PropertyGroup Label="Globals">
        <CppWinRTEnabled>true</CppWinRTEnabled>
...

Projekt można uaktualnić, ręcznie instalując pakiet NuGet Microsoft.Windows.CppWinRT . Po zainstalowaniu (lub uaktualnieniu do) najnowszej wersji rozszerzenia VSIX otwórz projekt w programie Visual Studio, kliknij pozycję Project>Manage NuGet Packages...>W polu wyszukiwania wpisz lub wklej ciąg Microsoft.Windows.CppWinRT , wybierz element w wynikach wyszukiwania, a następnie kliknij przycisk Zainstaluj , aby zainstalować pakiet dla projektu.

Utworzono z (lub uaktualniono do) między 1.0.181002.2 a 1.0.190128.3

Jeśli projekt został utworzony w wersji rozszerzenia VSIX z zakresu od 1.0.181002.2 do 1.0.190128.3 włącznie, wówczas pakiet NuGet Microsoft.Windows.CppWinRT został zainstalowany automatycznie przez szablon projektu. Możesz również uaktualnić starszy projekt, aby użyć wersji rozszerzenia VSIX w tym zakresie. Jeśli tak, to, ponieważ obsługa kompilacji była nadal obecna w wersjach rozszerzenia VSIX w tym przedziale, Twój zaktualizowany projekt może lub nie może mieć zainstalowanego pakietu NuGet Microsoft.Windows.CppWinRT.

Aby uaktualnić projekt, postępuj zgodnie z instrukcjami w poprzedniej sekcji i upewnij się, że projekt ma zainstalowany pakiet NuGet Microsoft.Windows.CppWinRT .

Nieprawidłowe konfiguracje uaktualniania

Zgodnie z najnowszą wersją rozszerzenia VSIX nie jest prawidłowe, aby projekt miał właściwość <CppWinRTEnabled>true</CppWinRTEnabled>, jeśli nie ma również zainstalowanego pakietu Microsoft.Windows.CppWinRT NuGet. Projekt z tą konfiguracją generuje komunikat o błędzie kompilacji"C++/WinRT VSIX nie zapewnia już obsługi kompilacji projektu. Proszę dodać odwołanie do pakietu NuGet Microsoft.Windows.CppWinRT w projekcie.

Jak wspomniano powyżej, projekt C++/WinRT musi teraz mieć zainstalowany pakiet NuGet.

<CppWinRTEnabled> Ponieważ element jest teraz przestarzały, możesz opcjonalnie edytować .vcxprojelement i usunąć go. Nie jest to absolutnie konieczne, ale jest to opcja.

Ponadto, jeśli twój .vcxproj zawiera <RequiredBundles>$(RequiredBundles);Microsoft.Windows.CppWinRT</RequiredBundles>, możesz go usunąć, aby można było kompilować bez konieczności instalowania rozszerzenia VSIX dla języka C++/WinRT.

Obsługa zestawu SDK dla języka C++/WinRT

Mimo że jest teraz uwzględniona tylko ze względów zgodności, od wersji 10.0.17134.0 (Windows 10, wersja 1803), pakiet Windows SDK zawiera standardową bibliotekę C++ opartą na plikach nagłówkowych do korzystania z natywnych interfejsów API systemu Windows (interfejsów API środowiska uruchomieniowego systemu Windows w przestrzeniach nazw systemu Windows). Te nagłówki znajdują się w folderze %WindowsSdkDir%Include<WindowsTargetPlatformVersion>\cppwinrt\winrt. Od wersji 10.0.17763.0 zestawu SDK Windows (Windows 10 w wersji 1809), te nagłówki plików są generowane automatycznie w folderze $(GeneratedFilesDir) Twojego projektu.

Ponownie w celu zapewnienia zgodności zestaw Windows SDK jest również dostarczany z narzędziem cppwinrt.exe . Zalecamy jednak zainstalowanie i użycie najnowszej wersji programu cppwinrt.exe, która jest dołączona do pakietu NuGet Microsoft.Windows.CppWinRT . Ten pakiet i cppwinrt.exe, są opisane w powyższych sekcjach.

Typy niestandardowe w projekcji C++/WinRT

W programowaniu C++/WinRT można używać standardowych funkcji języka C++ oraz standardowych typów danych C++ i C++/WinRT, w tym niektórych typów danych biblioteki standardowej C++. Zauważysz również niektóre niestandardowe typy danych w projekcji i możesz zdecydować się na ich użycie. Na przykład używamy winrt::hstring w przykładzie kodu Szybki Start w Rozpoczynanie Pracy z C++/WinRT.

winrt::com_array to inny typ, którego prawdopodobnie używasz w pewnym momencie. W mniejszym stopniu masz tendencję do bezpośredniego używania typu takiego jak winrt::array_view. Możesz też nie używać go, aby nie mieć żadnego kodu do zmiany, jeśli i gdy odpowiedni typ pojawi się w standardowej bibliotece języka C++.

Ostrzeżenie

Istnieją również typy, które można zobaczyć, jeśli uważnie badasz nagłówki przestrzeni nazw systemu Windows C++/WinRT. Przykładem jest winrt::param::hstring, ale istnieją również przykłady kolekcji. Istnieją one wyłącznie w celu optymalizacji powiązania parametrów wejściowych i zapewniają duże ulepszenia wydajności i sprawiają, że większość wzorców wywołujących "po prostu działa" dla powiązanych standardowych typów i kontenerów języka C++. Te typy są zawsze używane tylko przez projekcję w przypadkach, gdy dodają największą wartość. Są wysoce zoptymalizowane i nie są przeznaczone do użytku ogólnego; nie daj się skusić, żeby używać ich na własną rękę. Nie należy też używać niczego z winrt::impl przestrzeni nazw, ponieważ są to typy implementacji i dlatego mogą ulec zmianie. Należy nadal używać typów standardowych lub typów z przestrzeni nazw winrt.

Zobacz również Przekazywanie parametrów przez granicę ABI.

Ważne interfejsy API