Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Met C++/WinRT-kunt u Windows Runtime-API's aanroepen met behulp van tekenreekstypen van C++ Standard Library, zoals std::wstring (opmerking: niet met smalle tekenreekstypen zoals std::string). C++/WinRT heeft een aangepast tekenreekstype met de naam winrt::hstring (gedefinieerd in de C++/WinRT-basisbibliotheek, die is %WindowsSdkDir%Include\<WindowsTargetPlatformVersion>\cppwinrt\winrt\base.h). En dat is het tekenreekstype dat Windows Runtime-constructors, functies en eigenschappen daadwerkelijk aannemen en retourneren. Maar in veel gevallen, dankzij de conversieconstructors en conversieoperators van hstring, kunt u kiezen of u al dan niet op de hoogte wilt zijn van hstring in uw clientcode. Als u ontwikkelt API's, moet u mogelijk meer weten over hstring.
Er zijn veel tekenreekstypen in C++. Er bestaan varianten in veel bibliotheken naast std::basic_string uit de standaardbibliotheek van C++ . C++17 heeft hulpprogramma's voor tekenreeksconversie en std::basic_string_view, om de hiaten tussen alle tekenreekstypen te overbruggen. winrt::hstring biedt converteerbaarheid met std::wstring_view om de interoperabiliteit te bieden waarvoor std::basic_string_view is ontworpen.
Met std::wstring (en optioneel winrt::hstring) en Uri
Windows::Foundation::Uri wordt samengesteld op basis van een winrt::hstring.
public:
Uri(winrt::hstring uri) const;
Maar hstring- heeft conversieconstructors waarmee je er mee kunt werken zonder dat je je daar bewust van hoeft te zijn. Hier volgt een codevoorbeeld waarin wordt getoond hoe u een URI- maakt op basis van een letterlijke tekenreeks, een brede tekenreeksweergave en een std::wstring.
#include <winrt/Windows.Foundation.h>
#include <string_view>
using namespace winrt;
using namespace Windows::Foundation;
int main()
{
using namespace std::literals;
winrt::init_apartment();
// You can make a Uri from a wide string literal.
Uri contosoUri{ L"http://www.contoso.com" };
// Or from a wide string view.
Uri contosoSVUri{ L"http://www.contoso.com"sv };
// Or from a std::wstring.
std::wstring wideString{ L"http://www.adventure-works.com" };
Uri awUri{ wideString };
}
De eigenschapstoegangsfunctie Uri::Domain is van het type hstring.
public:
winrt::hstring Domain();
Maar nogmaals, dat u zich van dat detail bewust bent is optioneel dankzij hstringconversieoperator naar std::wstring_view.
// Access a property of type hstring, via a conversion operator to a standard type.
std::wstring domainWstring{ contosoUri.Domain() }; // L"contoso.com"
domainWstring = awUri.Domain(); // L"adventure-works.com"
// Or, you can choose to keep the hstring unconverted.
hstring domainHstring{ contosoUri.Domain() }; // L"contoso.com"
domainHstring = awUri.Domain(); // L"adventure-works.com"
Op dezelfde manier retourneert IStringable::ToString de hstring.
public:
hstring ToString() const;
Uri- implementeert de interface IStringable.
// Access hstring's IStringable::ToString, via a conversion operator to a standard type.
std::wstring tostringWstring{ contosoUri.ToString() }; // L"http://www.contoso.com/"
tostringWstring = awUri.ToString(); // L"http://www.adventure-works.com/"
// Or you can choose to keep the hstring unconverted.
hstring tostringHstring{ contosoUri.ToString() }; // L"http://www.contoso.com/"
tostringHstring = awUri.ToString(); // L"http://www.adventure-works.com/"
U kunt de functie hstring::c_str gebruiken om een standaard brede tekenreeks op te halen uit een hstring- (net zoals u dat kunt vanuit een std::wstring).
#include <iostream>
std::wcout << tostringHstring.c_str() << std::endl;
Als u een hstring- hebt, kunt u er een URI- van maken.
Uri awUriFromHstring{ tostringHstring };
Overweeg een methode die een hstringontvangt.
public:
Uri CombineUri(winrt::hstring relativeUri) const;
Alle opties die u zojuist hebt gezien, zijn ook van toepassing in dergelijke gevallen.
std::wstring contact{ L"contact" };
contosoUri = contosoUri.CombineUri(contact);
std::wcout << contosoUri.ToString().c_str() << std::endl;
hstring- heeft een lid std::wstring_view een conversieoperator, en de conversie wordt zonder kosten gerealiseerd.
void legacy_print(std::wstring_view view);
void Print(winrt::hstring const& hstring)
{
legacy_print(hstring);
}
winrt::hstring functies en bewerkingen
Een host van constructors, operators, functies en iterators worden geïmplementeerd voor winrt::hstring.
Een is een bereik, zodat u deze kunt gebruiken met bereikgebaseerde forof met std::for_each. Het biedt ook vergelijkingsoperatoren voor natuurlijke en efficiënte vergelijkingen met de tegenhangers in de C++ Standard-bibliotheek. En het bevat alles wat u nodig hebt om hstring- als sleutel voor associatieve containers te gebruiken.
We herkennen dat veel C++-bibliotheken gebruikmaken van std::stringen uitsluitend met UTF-8-tekst werken. Als gemak bieden we helpers, zoals winrt::to_string en winrt::to_hstring, om heen en weer te converteren.
WINRT_ASSERT is een macrodefinitie en wordt uitgebreid naar _ASSERTE.
winrt::hstring w{ L"Hello, World!" };
std::string c = winrt::to_string(w);
WINRT_ASSERT(c == "Hello, World!");
w = winrt::to_hstring(c);
WINRT_ASSERT(w == L"Hello, World!");
Zie het naslagonderwerp winrt::hstring API voor meer voorbeelden en informatie over hstring functies en operators.
De reden voor winrt::hstring en winrt::param::hstring
De Windows Runtime wordt geïmplementeerd in termen van wchar_t tekens, maar de ABI (Application Binary Interface) van Windows Runtime is geen subset van wat std::wstring of std::wstring_view bieden. Het gebruik van deze zou leiden tot aanzienlijke inefficiëntie. In plaats daarvan biedt C++/WinRT winrt::hstring, die een onveranderbare tekenreeks vertegenwoordigt die consistent is met de onderliggende HSTRING-, en wordt geïmplementeerd achter een interface die vergelijkbaar is met die van std::wstring.
U ziet mogelijk dat C++/WinRT-invoerparameters die logisch winrt::hstring zouden moeten accepteren, eigenlijk winrt::param::hstringverwachten. De param naamruimte bevat een set typen die uitsluitend worden gebruikt om invoerparameters te optimaliseren om op natuurlijke wijze te binden aan C++ Standaardbibliotheektypen en kopieën en andere inefficiënties te voorkomen. U mag deze typen niet rechtstreeks gebruiken. Als u een optimalisatie wilt gebruiken voor uw eigen functies, gebruikt u std::wstring_view. Zie ook Het doorgeven van parameters aan de ABI-grens.
Het resultaat is dat u de details van het beheer van Windows Runtime-tekenreeksen grotendeels kunt negeren en efficiënt kunt werken met wat u weet. En dat is belangrijk, gezien hoe intensief tekenreeksen worden gebruikt in Windows Runtime.
Tekenreeksen opmaken
Eén optie voor tekenreeksopmaak is std::wostringstream. Hier is een voorbeeld dat een simpel debugtraceringsbericht formatteert en weergeeft.
#include <sstream>
#include <winrt/Windows.UI.Input.h>
#include <winrt/Windows.UI.Xaml.Input.h>
...
void MainPage::OnPointerPressed(winrt::Windows::UI::Xaml::Input::PointerRoutedEventArgs const& e)
{
winrt::Windows::Foundation::Point const point{ e.GetCurrentPoint(nullptr).Position() };
std::wostringstream wostringstream;
wostringstream << L"Pointer pressed at (" << point.X << L"," << point.Y << L")" << std::endl;
::OutputDebugString(wostringstream.str().c_str());
}
De juiste werkwijze om een eigenschap in te stellen
U stelt een eigenschap in door een waarde door te geven aan een setterfunctie. Hier volgt een voorbeeld.
// The right way to set the Text property.
myTextBlock.Text(L"Hello!");
De onderstaande code is onjuist. Het compileert, maar het enige wat het doet is om de tijdelijke winrt::hstring geretourneerd door de Text() accessor-functie te wijzigen en vervolgens het resultaat weg te gooien.
// *Not* the right way to set the Text property.
myTextBlock.Text() = L"Hello!";