비고
winrt::box_value 및 winrt::unbox_value 함수를 사용하여 스칼라 값뿐만 아니라 대부분의 배열(열거형 배열 제외)도 상자로 지정하고 취소할 수 있습니다. winrt::unbox_value_or 함수를 사용하여 스칼라 값만 언박스할 수 있습니다.
IInspectable 인터페이스는 Windows 런타임(WinRT)의 모든 런타임 클래스의 루트 인터페이스입니다. 모든 COM 인터페이스 및 클래스의 루트에 있는 IUnknown
즉, IInspectable 예상하는 함수는 모든 런타임 클래스의 인스턴스를 전달할 수 있습니다. 그러나 이러한 함수에 스칼라 값(예: 숫자 또는 텍스트 값) 또는 배열을 직접 전달할 수는 없습니다. 대신 스칼라 또는 배열 값을 참조 클래스 개체 내부에 래핑해야 합니다. 그 래핑 프로세스는 boxing 값을 처리하는 것으로 알려져 있습니다.
중요합니다
Windows 런타임 API에 전달할 수 있는 모든 형식을 상자로 지정하고 언박스를 해제할 수 있습니다. 즉, Windows 런타임 형식입니다. 숫자 및 텍스트 값(문자열) 및 배열은 위에 제공된 몇 가지 예입니다. 또 다른 예는 IDL에서 당신이 정의하는 struct
입니다. C++ 일반 형식 struct
(IDL에 정의되지 않은 형식)를 객체로 래핑하려고 하면, 컴파일러가 Windows 런타임 형식만 래핑할 수 있음을 상기시켜 줍니다. 런타임 클래스는 Windows 런타임 형식이지만, 물론 런타임 클래스를 별도의 포장 과정 없이 Windows 런타임 API에 전달할 수 있습니다.
C++/WinRT 는 스칼라 또는 배열 값을 받아 이를 IInspectable에 박싱하여 반환하는 winrt::box_value 함수를 제공합니다. IInspectable을 스칼라 또는 배열 값으로 언박싱하려면 winrt::unbox_value 함수를 사용할 수 있습니다. IInspectable을(를) 스칼라 값으로 다시 언박싱할 때도 winrt::unbox_value_or 함수가 있습니다.
값 고정의 예
LaunchActivatedEventArgs::Arguments 접근자 함수는 스칼라 값인 winrt::hstring반환합니다. hstring의 값을 박스 처리하여 IInspectable을(를) 예상하는 함수에 전달할 수 있습니다.
void App::OnLaunched(LaunchActivatedEventArgs const& e)
{
...
rootFrame.Navigate(winrt::xaml_typename<BlankApp1::MainPage>(), winrt::box_value(e.Arguments()));
...
}
XAML 단추콘텐츠 속성을 설정하려면 Button::Content 변경자 함수를 호출합니다. 콘텐츠 속성을 문자열 값으로 설정하려면 이 코드를 사용할 수 있습니다.
Button().Content(winrt::box_value(L"Clicked"));
먼저 hstring 변환 생성자는 문자열 리터럴을 hstring변환합니다. 그런 다음, winrt::box_value의 오버로드 중 hstring를 사용하는 것이 호출됩니다.
IInspectable의 언박싱 예제
IInspectable을(를) 기대하는 사용자 정의 함수 내에서, winrt::unbox_value를 사용하여 값을 언박싱할 수 있으며, winrt::unbox_value_or를 사용하여 기본값으로 값을 언박싱할 수 있습니다. try_as를 사용하여 std::optional로 변환할 수도 있습니다.
void Unbox(winrt::Windows::Foundation::IInspectable const& object)
{
hstring hstringValue = unbox_value<hstring>(object); // Throws if object is not a boxed string.
hstringValue = unbox_value_or<hstring>(object, L"Default"); // Returns L"Default" if object is not a boxed string.
float floatValue = unbox_value_or<float>(object, 0.f); // Returns 0.0 if object is not a boxed float.
std::optional<int> optionalInt = object.try_as<int>(); // Returns std::nullopt if object is not a boxed int.
}
박싱된 값의 유형 확인
포장된 값을 받았을 때 포함된 형식에 확신이 들지 않는 경우(형식을 언박스하려면 해당 형식을 알고 있어야 합니다), 그럴 때는 포장된 값에 대해 IPropertyValue 인터페이스를 쿼리한 다음에, 이를 통해 Type를 호출할 수 있습니다. 다음은 코드 예제입니다.
WINRT_ASSERT
은 매크로 정의이며 _ASSERTE로 확장됩니다.
float pi = 3.14f;
auto piInspectable = winrt::box_value(pi);
auto piPropertyValue = piInspectable.as<winrt::Windows::Foundation::IPropertyValue>();
WINRT_ASSERT(piPropertyValue.Type() == winrt::Windows::Foundation::PropertyType::Single);