Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
С помощью C++/WinRT можно вызывать API-интерфейсы среда выполнения Windows с помощью типов строк стандартной библиотеки C++, таких как std::wstring (примечание: не с узкими типами строк, такими как std::string). C++/WinRT имеет настраиваемый тип строки с именем winrt::hstring (определенный в базовой библиотеке C++/WinRT).%WindowsSdkDir%Include\<WindowsTargetPlatformVersion>\cppwinrt\winrt\base.h И это строковый тип, который среда выполнения Windows конструкторы, функции и свойства фактически принимают и возвращают. Но во многих случаях благодаря конструкторам преобразования hstring и операторам преобразования можно выбрать, следует ли учитывать hstring в клиентском коде. Если вы разрабатываете API, то вам, скорее всего, нужно будет знать, что такое hstring.
В C++существует множество типов строк. Варианты существуют во многих библиотеках в дополнение к std::basic_string из стандартной библиотеки C++. C++17 содержит служебные программы преобразования строк и std::basic_string_view, чтобы преодолеть пробелы между всеми типами строк. winrt::hstring поддерживает преобразование в и из std::wstring_view, обеспечивая совместимость, ради которой был разработан std::basic_string_view.
Использование std::wstring (и при необходимости winrt::hstring) с URI
Windows::Foundation::Uri создается из winrt::hstring.
public:
Uri(winrt::hstring uri) const;
Но hstring имеет конструкторы преобразования , которые позволяют работать с ним без необходимости учитывать его. Вот пример кода, показывающий, как создать Uri из широкого строкового литерала, из представления широкой строки и из 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 };
}
Метод доступа к свойству Uri::Domain имеет тип данных hstring.
public:
winrt::hstring Domain();
Но, опять же, знать об этой детали необязательно благодаря оператору преобразования hstringв 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"
Аналогичным образом IStringable::ToString возвращает hstring .
public:
hstring ToString() const;
Uri реализует интерфейс 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/"
Функцию hstring::c_str можно использовать, чтобы получить стандартную широкую строку из hstring (как и из std::wstring).
#include <iostream>
std::wcout << tostringHstring.c_str() << std::endl;
Если у вас есть hstring , вы можете сделать URI из него.
Uri awUriFromHstring{ tostringHstring };
Рассмотрим метод, который принимает hstring.
public:
Uri CombineUri(winrt::hstring relativeUri) const;
Все варианты, которые вы только что видели, также применяются в таких случаях.
std::wstring contact{ L"contact" };
contosoUri = contosoUri.CombineUri(contact);
std::wcout << contosoUri.ToString().c_str() << std::endl;
hstring имеет оператор преобразования std::wstring_view , и преобразование достигается без затрат.
void legacy_print(std::wstring_view view);
void Print(winrt::hstring const& hstring)
{
legacy_print(hstring);
}
Функции и операторы winrt::hstring
Для winrt::hstring реализовано множество конструкторов, операторов, функций и итераторов.
hstring — это диапазон, поэтому его можно использовать с основанным на диапазонах for или с помощью std::for_each. Он также предоставляет операторы сравнения для естественного и эффективного сравнения со своими коллегами в стандартной библиотеке C++. И он содержит всё необходимое для использования hstring в качестве ключа для ассоциативных контейнеров.
Мы понимаем, что многие библиотеки C++ используют std::string и работают исключительно с текстом UTF-8. В качестве удобства мы предоставляем вспомогательные средства, такие как winrt::to_string и winrt::to_hstring, для преобразования обратно и вперед.
WINRT_ASSERT — это определение макроса, и оно расширяется до _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!");
Дополнительные примеры и сведения о функциях и операторах hstring см. в справочном разделе по API winrt::hstring .
Обоснование winrt::hstring и winrt::param::hstring
среда выполнения Windows реализован на основе символов типа wchar_t, но двоичный интерфейс приложения (ABI) среда выполнения Windows не является подмножеством возможностей, предоставляемых std::wstring или std::wstring_view. Использование этих данных приведет к значительной неэффективности. Вместо этого C++/WinRT предоставляет winrt::hstring, которая представляет неизменяемую строку, согласованную с базовым HSTRING, и реализованную за интерфейсом, похожим на std::wstring.
Вы можете заметить, что параметры C++/WinRT, которые по логике должны принимать winrt::hstring, на самом деле имеют тип winrt::param::hstring. Пространство имен param содержит набор типов, используемых исключительно для оптимизации входных параметров, чтобы естественно привязаться к типам стандартной библиотеки C++ и избежать копирования и других неэффективностей. Эти типы не следует использовать напрямую. Если вы хотите использовать оптимизацию для собственных функций, используйте std::wstring_view. См. также раздел "Передача параметров в границу ABI".
В конечном счёте вы можете в значительной степени не вдаваться в особенности управления строками в среда выполнения Windows и просто эффективно работать с тем, что вам уже знакомо. И это важно, учитывая, насколько сильно строки используются в среда выполнения Windows.
Форматирование строк
Одним из вариантов форматирования строк является std::wostringstream. Ниже приведен пример форматирования и отображения простого сообщения трассировки отладки.
#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());
}
Правильный способ установить свойство
Свойство задается путем передачи значения функции задания. Приведем пример.
// The right way to set the Text property.
myTextBlock.Text(L"Hello!");
Приведенный ниже код является неверным. Код компилируется, но всё, что он делает, — это изменяет временную winrt::hstring, возвращаемую методом доступа Text(), а затем просто отбрасывает результат.
// *Not* the right way to set the Text property.
myTextBlock.Text() = L"Hello!";
Важные API
Windows developer