C++/WinRT를 사용해 스칼라 값을 IInspectable로 boxing 및 unboxingBoxing and unboxing scalar values to IInspectable with C++/WinRT

IInspectable 인터페이스는 Windows 런타임(WinRT)에서 모든 런타임 클래스의 루트 인터페이스입니다.The IInspectable interface is the root interface of every runtime class in the Windows Runtime (WinRT). 이는 IUnknown이 모든 COM 인터페이스 및 클래스의 루트에 위치하고, System.Object가 모든 공용 형식 시스템 클래스의 루트에 위치하는 것과 유사합니다.This is an analogous idea to IUnknown being at the root of every COM interface and class; and System.Object being at the root of every Common Type System class.

다시 말해서 IInspectable이 필요한 함수에는 모든 런타임 클래스 인스턴스를 전달할 수 있습니다.In other words, a function that expects IInspectable can be passed an instance of any runtime class. 하지만 숫자나 텍스트 같은 스칼라 값은 이 함수로 직접 전달할 수 없습니다.But you can't directly pass a scalar value, such as a numeric or text value, to such a function. 대신 스칼라 값을 참조 클래스 개체 안에 래핑해야 합니다.Instead, a scalar value needs to be wrapped inside a reference class object. 이 래핑 프로세스에 대해 값을 boxing한다고 합니다.That wrapping process is known as boxing the value.

C++/WinRTwinrt::box_value 함수를 제공합니다. 이 함수는 스칼라 값을 가져와 IInspectable에 boxing되는 값을 반환합니다.C++/WinRT provides the winrt::box_value function, which takes a scalar value and returns the value boxed into an IInspectable. IInspectable을 다시 스칼라 값으로 unboxing하기 위해서 winrt::unbox_valuewinrt::unbox_value_or 함수가 존재합니다.For unboxing an IInspectable back into a scalar value, there are the winrt::unbox_value and winrt::unbox_value_or functions.

값을 boxing하는 예제Examples of boxing a value

LaunchActivatedEventArgs::Arguments 접근자 함수는 스칼라 값으로 winrt::hstring을 반환합니다.The LaunchActivatedEventArgs::Arguments accessor function returns a winrt::hstring, which is a scalar value. hstring 값을 아래와 같이 boxing하여 IInspectable이 필요한 함수에 전달할 수 있습니다.We can box that hstring value and pass it to a function that expects IInspectable like this.

void App::OnLaunched(LaunchActivatedEventArgs const& e)
{
    ...
    rootFrame.Navigate(winrt::xaml_typename<BlankApp1::MainPage>(), winrt::box_value(e.Arguments()));
    ...
}

XAML 단추의 콘텐츠 속성을 설정하려면 Button::Content 변경자 함수를 호출합니다.To set the content property of a XAML Button, you call the Button::Content mutator function. 콘텐츠 속성을 문자열 값으로 설정할 때는 이 코드를 사용할 수 있습니다.To set the content property to a string value, you can use this code.

Button().Content(winrt::box_value(L"Clicked"));

먼저 hstring 변환 생성자가 문자열 리터럴을 hstring으로 변환합니다.First, the hstring conversion constructor converts the string literal into an hstring. 그러면 hstring을 가져오는 winrt::box_value 오버로드가 호출됩니다.Then the overload of winrt::box_value that takes an hstring is invoked.

IInspectable을 unboxing하는 예제Examples of unboxing an IInspectable

IInspectable이 필요한 사용자 고유의 함수에서는 winrt::unbox_value를 사용해 unboxing하거나 winrt::unbox_value_or을 사용해 기본값으로 unboxing할 수 있습니다.In your own functions that expect IInspectable, you can use winrt::unbox_value to unbox, and you can use winrt::unbox_value_or to unbox with a default value.

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.
}

boxing된 값 형식 확인Determine the type of a boxed value

boxing된 값을 받았으나 이 값에 포함된 형식이 무엇인지 확실하지 않은 경우(unboxing하려면 형식을 알아야 함) 해당 IPropertyValue 인터페이스에 대해 boxing된 값을 쿼리하고 Type을 호출할 수 있습니다.If you receive a boxed value and you're unsure what type it contains (you need to know its type in order to unbox it), then you can query the boxed value for its IPropertyValue interface, and then call Type on that. 코드 예제는 다음과 같습니다.Here's a code example.

WINRT_ASSERT는 매크로 정의이며 _ASSERTE로 확장됩니다.WINRT_ASSERT is a macro definition, and it expands to _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);

중요 APIImportant APIs