C++/WinRT를 사용하면 std::wstring과 같은 C++ 표준 라이브러리 와이드 문자열 형식을 사용하여 Windows 런타임 API를 호출할 수 있습니다(참고: std::string과 같은 좁은 문자열 형식이 아님). C++/WinRT에는 winrt::hstring (C++/WinRT 기본 라이브러리에 정의됨)이라는 사용자 지정 문자열 형식이 있습니다 %WindowsSdkDir%Include\<WindowsTargetPlatformVersion>\cppwinrt\winrt\base.h
. Windows 런타임 생성자, 함수 및 속성이 실제로 사용하고 반환하는 문자열 형식입니다. 그러나 hstring의 변환 생성자 및 변환 연산자 덕분에 대부분의 경우 클라이언트 코드에서 hstring 을 인식할지 여부를 선택할 수 있습니다.
API를 작성하는 경우 hstring에 대해 알아야 할 가능성이 더 높습니다.
C++에는 많은 문자열 형식이 있습니다. 변형은 C++ 표준 라이브러리의 std::basic_string 외에도 많은 라이브러리에 존재합니다. C++17에는 모든 문자열 형식 간의 간격을 메우기 위해 문자열 변환 유틸리티와 std::basic_string_view 있습니다. winrt::hstringstd::wstring_view 변환 기능을 제공하여 std::basic_string_view 상호 운용성을 제공합니다.
Uri와 함께 std::wstring (및 선택적으로 winrt::hstring) 사용
Windows::Foundation::Uri는 winrt::hstring로부터 생성됩니다.
public:
Uri(winrt::hstring uri) const;
하지만 hstring은 인지할 필요 없이 작업할 수 있도록 해주는 변환 생성자를 가지고 있습니다. 와이드 문자열 리터럴, 와이드 문자열 뷰, 그리고
#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();
그러나 다시 말하지만,
// 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;
UriIStringable 인터페이스를 구현합니다.
// 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;
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 함수 및 연산자에 대한 자세한 예제 및 정보는 winrt::hstring API 참조 항목을 참조하세요.
winrt::hstring 및 winrt::param::hstring에 대한 근거
Windows 런타임은 wchar_t 문자로 구현되지만 Windows 런타임의 ABI(애플리케이션 이진 인터페이스)는 std::wstring 또는 std::wstring_view 제공하는 항목의 하위 집합이 아닙니다. 이를 사용하면 상당한 비효율성이 발생할 수 있습니다. 대신, C++/WinRT는 변경할 수 없는 문자열을 나타내는 winrt::hstring을 제공하며, 이는 기본 HSTRING과 일관성이 있고, std::wstring과 유사한 인터페이스 뒤에 구현됩니다.
논리적으로는 winrt::hstring를 수락해야 하는 C++/WinRT 입력 매개변수가 실제로는 winrt::param::hstring를 필요로 합니다. 매개 변수 네임스페이스에는 C++ 표준 라이브러리 형식에 자연스럽게 바인딩하고 복사본 및 기타 비효율성을 방지하기 위해 입력 매개 변수를 최적화하는 데 단독으로 사용되는 형식 집합이 포함되어 있습니다. 이러한 형식을 직접 사용하면 안 됩니다. 고유한 함수에 최적화를 사용하려면 std::wstring_view 사용합니다. 또한 매개변수를 ABI 경계에 전달하는 것을 참조하세요.
Windows 런타임 문자열 관리의 세부 사항을 대부분 무시하고 알고 있는 내용으로 효율성을 높일 수 있습니다. 또한 Windows 런타임에서 문자열이 얼마나 많이 사용되는지를 고려할 때 중요합니다.
문자열 서식 지정
문자열 서식 지정의 한 가지 옵션은 std::wostringstream입니다. 다음은 간단한 디버그 추적 메시지의 서식을 지정하고 표시하는 예제입니다.
#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());
}
속성을 설정하는 올바른 방법
setter 함수에 값을 전달하여 속성을 설정합니다. 다음은 예제입니다.
// The right way to set the Text property.
myTextBlock.Text(L"Hello!");
아래 코드가 잘못되었습니다. 컴파일되지만, Text() 접근자 함수에서 반환된 임시 winrt::hstring을 수정한 후, 결과를 버리는 것뿐입니다.
// *Not* the right way to set the Text property.
myTextBlock.Text() = L"Hello!";