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.
Pomocí C++/WinRT můžete volat rozhraní API prostředí Windows Runtime pomocí typů širokých řetězců ze standardní knihovny C++, jako je std::wstring (poznámka: nikoli pomocí typů úzkých řetězců, jako je std::string). C++/WinRT má vlastní typ řetězce s názvem winrt::hstring (definovaný v základní knihovně C++/WinRT, což je %WindowsSdkDir%Include\<WindowsTargetPlatformVersion>\cppwinrt\winrt\base.h). A to je řetězcový typ, který konstruktory, funkce a vlastnosti rozhraní prostředí Windows Runtime ve skutečnosti přijímají a vracejí. Ale v mnoha případech se díky konverzním konstruktorům a operátorům konverze typu hstring můžete rozhodnout, zda s hstring budete muset ve svém klientském kódu vůbec počítat. Pokud vytváříte rozhraní API, budete pravděpodobně potřebovat znát hstring.
V jazyce C++ existuje mnoho typů řetězců. Varianty existují v mnoha knihovnách kromě std::basic_string ze standardní knihovny C++. C++17 má nástroje pro převod řetězců a std::basic_string_view, které překlenují mezery mezi všemi typy řetězců. winrt::hstring poskytuje převodnost pomocí std:::wstring_view pro zajištění interoperability, pro kterou byl navržen std::basic_string_view .
Použití std::wstring (a volitelně winrt::hstring) s Uri
Windows::Foundation::Uri je vytvořen z winrt::hstring.
public:
Uri(winrt::hstring uri) const;
Ale hstring má konverzní konstruktory, které vám umožňují s ním pracovat, aniž byste o tom museli vědět. Tady je příklad kódu, který ukazuje, jak vytvořit objekt Uri ze širokého řetězcového literálu, ze zobrazení širokého řetězce a z 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 };
}
Přístupová metoda vlastnosti Uri::Domain je typu hstring.
public:
winrt::hstring Domain();
Ale opět platí, že vědět o tomto detailu není nutné díky operátoru převodu typu hstringna 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"
Podobně IStringable::ToString vrátí hstring .
public:
hstring ToString() const;
Uri implementuje rozhraní 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/"
Pomocí funkce hstring::c_str můžete získat standardní široký řetězec z řetězce hstring (stejně jako z řetězce std::wstring).
#include <iostream>
std::wcout << tostringHstring.c_str() << std::endl;
Pokud máte hstring , můžete z něj vytvořit identifikátor URI .
Uri awUriFromHstring{ tostringHstring };
Zvažte metodu, která přebírá řetězec hstring.
public:
Uri CombineUri(winrt::hstring relativeUri) const;
Všechny možnosti, které jste právě viděli, platí i v takových případech.
std::wstring contact{ L"contact" };
contosoUri = contosoUri.CombineUri(contact);
std::wcout << contosoUri.ToString().c_str() << std::endl;
hstring má člen std::wstring_view převodní operátor a převod je dosažen bez nákladů.
void legacy_print(std::wstring_view view);
void Print(winrt::hstring const& hstring)
{
legacy_print(hstring);
}
winrt::hstring – funkce a operátory
Pro winrt::hstring je implementována celá řada konstruktorů, operátorů, funkcí a iterátorů.
hstring je rozsah, takže ho můžete použít v příkazu for založeném na rozsahu nebo s std::for_each. Poskytuje také relační operátory pro přirozené a efektivní porovnávání se svými protějšky ve standardní knihovně C++. A to zahrnuje vše, co potřebujete použít hstring jako klíč pro asociativní kontejnery.
Uvědomujeme si, že mnoho knihoven C++ používá std::string a pracuje výhradně s textem UTF-8. Pro usnadnění poskytujeme pomocné funkce, jako jsou winrt::to_string a winrt::to_hstring, pro převod tam a zpět.
WINRT_ASSERT je definice makra a rozbalí se na _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!");
Další příklady a informace o funkcích a operátorech hstring najdete v referenčním tématu k rozhraní API winrt::hstring .
Odůvodnění winrt::hstring a winrt::param::hstring
prostředí Windows Runtime se implementuje z hlediska wchar_t znaků, ale binární rozhraní aplikace prostředí Windows Runtime (ABI) není podmnožinou toho, co poskytuje std::wstring nebo std::wstring_view. Použití těch by vedlo k významné neefektivitě. Místo toho jazyk C++/WinRT poskytuje winrt::hstring, který představuje neměnný řetězec konzistentní s podkladovým HSTRING a implementovaný za rozhraním podobným rozhraním std::wstring.
Můžete si všimnout, že vstupní parametry C++/WinRT, které by logicky měly přijímat winrt::hstring, ve skutečnosti očekávají winrt::param::hstring. Obor názvů parametrů obsahuje sadu typů používaných výhradně k optimalizaci vstupních parametrů pro přirozeně svázání s typy standardní knihovny jazyka C++ a zabránění kopiím a dalším neektivostem. Tyto typy byste neměli používat přímo. Pokud chcete použít optimalizaci pro vlastní funkce, použijte std::wstring_view. Viz také předávání parametrů přes rozhraní ABI.
Z toho plyne, že můžete do značné míry ignorovat specifika správy řetězců ve prostředí Windows Runtime a jednoduše efektivně pracovat s tím, co už znáte. A to je důležité, vzhledem k tomu, jak silně se řetězce používají v prostředí Windows Runtime.
Formátování řetězců
Jednou z možností pro formátování řetězců je std::wostringstream. Zde je příklad, který formátuje a zobrazuje jednoduchou ladicí trasovací zprávu.
#include <sstream>
#include <winrt/Microsoft.UI.Input.h>
#include <winrt/Microsoft.UI.Xaml.Input.h>
...
void MainPage::OnPointerPressed(winrt::Microsoft::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());
}
Správný způsob nastavení vlastnosti
Vlastnost nastavíte předáním hodnoty funkci setter. Tady je příklad.
// The right way to set the Text property.
myTextBlock.Text(L"Hello!");
Níže uvedený kód je nesprávný. Zkompiluje se, ale vše, co dělá, je upravit dočasné winrt::hstring vrácené funkcí objektu Text() a pak vyhodit výsledek pryč.
// *Not* the right way to set the Text property.
myTextBlock.Text() = L"Hello!";
Důležitá rozhraní API
Windows developer