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.
A C++/WinRT használatával meghívhat Windows-futtatókörnyezet API-kat Standard C++ adattípusokkal, beleértve néhány C++ Standard Kódtár adattípust is. Szabványos sztringeket adhat át az API-knak (lásd : Sztringkezelés a C++/WinRT-ben), és inicializáló listákat és standard tárolókat adhat át az API-knak, amelyek szemantikailag egyenértékű gyűjteményt várnak.
Lásd még: Paraméterek átadása az ABI-határon keresztül.
Standard inicializáló listák
Az inicializálók listája (std::initializer_list) egy C++ standard kódtár-szerkezet. Inicializáló listákat akkor használhat, ha bizonyos Windows-futtatókörnyezet konstruktorokat és metódusokat hív meg. Meghívhatja például a DataWriter::WriteBytes függvényt egy ilyennel.
#include <winrt/Windows.Storage.Streams.h>
using namespace winrt::Windows::Storage::Streams;
int main()
{
winrt::init_apartment();
InMemoryRandomAccessStream stream;
DataWriter dataWriter{stream};
dataWriter.WriteBytes({ 99, 98, 97 }); // the initializer list is converted to a winrt::array_view before being passed to WriteBytes.
}
Ennek a munkának két része van. Először a DataWriter::WriteBytes metódus winrt::array_view típusú paramétert használ.
void WriteBytes(winrt::array_view<uint8_t const> value) const
winrt::array_view egy egyéni C++/WinRT típus, amely biztonságosan jelöl egy egybefüggő értéksorozatot (ez a C++/WinRT alapkódtárban van definiálva, azaz %WindowsSdkDir%Include\<WindowsTargetPlatformVersion>\cppwinrt\winrt\base.h).
Másodszor: winrt::array_view inicializáló-lista konstruktort tartalmaz.
template <typename T> winrt::array_view(std::initializer_list<T> value) noexcept
Sok esetben eldöntheti, hogy a programozás során számol-e a winrt::array_view-val, vagy sem. Ha úgy dönt, hogy nem tud róla, akkor a C++ standard kódtárban nem lesz módosítható kód, ha és amikor egy ezzel egyenértékű típus jelenik meg.
Az inicializálók listáját átadhatja egy Windows-futtatókörnyezet API-nak, amely gyűjteményparamétert vár. Vegyük például a StorageItemContentProperties::RetrievePropertiesAsync parancsot.
IAsyncOperation<IMap<winrt::hstring, IInspectable>> StorageItemContentProperties::RetrievePropertiesAsync(IIterable<winrt::hstring> propertiesToRetrieve) const;
Ezt az API-t meghívhatja egy ilyen inicializáló listával.
IAsyncAction retrieve_properties_async(StorageFile const storageFile)
{
auto properties{ co_await storageFile.Properties().RetrievePropertiesAsync({ L"System.ItemUrl" }) };
}
Két tényező dolgozik itt. Először is a hívó egy std::vektort hoz létre az inicializáló listából (ez a hívó aszinkron, így képes birtokolni azt az objektumot, amelynek rendelkeznie kell). Másodszor, a C++/WinRT transzparens módon (és másolatkészítés nélkül) kezeli a std::vector típust Windows-futtatókörnyezet-gyűjteményparaméterként.
Standard tömbök és vektorok
winrt::array_viewstd::vector és std::array konverziós konstruktorokkal is rendelkezik.
template <typename C, size_type N> winrt::array_view(std::array<C, N>& value) noexcept
template <typename C> winrt::array_view(std::vector<C>& vectorValue) noexcept
Így ehelyett meghívhatja a DataWriter::WriteBytes függvényt egy std::vector karakterrel.
std::vector<byte> theVector{ 99, 98, 97 };
dataWriter.WriteBytes(theVector); // theVector is converted to a winrt::array_view before being passed to WriteBytes.
Vagy egy std::array használatával.
std::array<byte, 3> theArray{ 99, 98, 97 };
dataWriter.WriteBytes(theArray); // theArray is converted to a winrt::array_view before being passed to WriteBytes.
A C++/WinRT az std::vektort köti Windows-futtatókörnyezet gyűjteményparaméterként. Így átadhat egy std::vector<winrt::hstring elemet>, és a rendszer átalakítja a megfelelő Windows-futtatókörnyezet winrt::hstring gyűjteményre. Ha a hívó aszinkron, további részleteket is figyelembe kell venni. Az adott eset megvalósítási részletei miatt egy rvalue értéket kell megadnia, ezért a vektort másolatként vagy mozgatással kell átadnia. Az alábbi kód példában a vektor tulajdonjogát az aszinkron hívó által elfogadott paramétertípus objektumára helyezzük át (majd óvatosak vagyunk, hogy áthelyezés után ne férjünk hozzá vecH újra). Ha többet szeretne tudni a revalutákról, tekintse meg az Értékkategóriákat és az ezekre mutató hivatkozásokat.
IAsyncAction retrieve_properties_async(StorageFile const storageFile, std::vector<winrt::hstring> vecH)
{
auto properties{ co_await storageFile.Properties().RetrievePropertiesAsync(std::move(vecH)) };
}
De nem adhat át egy std::vector<std::wstring> objektumot ott, ahol Windows-futtatókörnyezet-gyűjteményre van szükség. Ennek az az oka, hogy miután az std::wstring megfelelő Windows-futtatókörnyezet gyűjteményére lett konvertálva, a C++ nyelv nem fogja kényszeríteni a gyűjtemény típusparaméter(ek)ét. Ezért a következő kódpélda nem fog lefordulni (és a megoldás az, hogy helyette egy std::vector<winrt::hstring> értéket kell átadni, ahogy az fentebb látható).
IAsyncAction retrieve_properties_async(StorageFile const storageFile, std::vector<std::wstring> vecW)
{
auto properties{ co_await storageFile.Properties().RetrievePropertiesAsync(std::move(vecW)) }; // error! Can't convert from vector of wstring to async_iterable of hstring.
}
Nyers tömbök és mutatóintervallumok
Figyelembe véve azt a kitételt, hogy a jövőben a C++ standard könyvtárában megjelenhet egy egyenértékű típus, közvetlenül a winrt::array_view típussal is dolgozhat, ha úgy kívánja, vagy ha erre van szüksége.
A winrt::array_view nyers tömbből, valamint T* tartományból (az elemtípusra mutató pointerekből) származó átalakító konstruktorokkal rendelkezik.
using namespace winrt;
...
byte theRawArray[]{ 99, 98, 97 };
array_view<byte const> fromRawArray{ theRawArray };
dataWriter.WriteBytes(fromRawArray); // the winrt::array_view is passed to WriteBytes.
array_view<byte const> fromRange{ theArray.data(), theArray.data() + 2 }; // just the first two elements.
dataWriter.WriteBytes(fromRange); // the winrt::array_view is passed to WriteBytes.
winrt::array_view függvények és operátorok
Számos konstruktor, operátor, függvény és iterátor implementálva van a winrt::array_view. A winrt::array_view tartomány, így tartományalapú forvagy std::for_each használatával is használható.
További példákért és információkért tekintse meg a winrt::array_view API-referenciatémakört.
IVector<T> és standard iterációs szerkezetek
SyndicationFeed.Items egy olyan Windows-futtatókörnyezet API-ra példa, amely IVector<T> típusú gyűjteményt ad vissza (amely a C++/WinRT-ben winrt::Windows::Foundation::Collections::IVector<T> formában jelenik meg). Ezt a típust szabványos iterációs szerkezetekkel, például tartományalapú forszerkezetekkel használhatja.
// main.cpp
#include "pch.h"
#include <winrt/Windows.Web.Syndication.h>
#include <iostream>
using namespace winrt;
using namespace Windows::Web::Syndication;
void PrintFeed(SyndicationFeed const& syndicationFeed)
{
for (SyndicationItem const& syndicationItem : syndicationFeed.Items())
{
std::wcout << syndicationItem.Title().Text().c_str() << std::endl;
}
}
C++ coroutines aszinkron Windows-futtatókörnyezet API-kkal
Az aszinkron Windows-futtatókörnyezet API-k meghívásakor továbbra is használhatja a párhuzamos minták kódtárát (PPL). A C++ coroutines azonban sok esetben hatékony és könnyebben kódolt idiómát biztosít az aszinkron objektumokkal való interakcióhoz. További információkért és kódpéldákért lásd a C++/WinRT egyidejűségi és aszinkron műveleteit.
Fontos API-k
Kapcsolódó témakörök
Windows developer