Note
winrt::box_value 関数と winrt::unbox_value 関数を使用して、スカラー値だけでなく、ほとんどの種類の配列 (列挙型の配列を除く) のボックス化とボックス化解除 を 行うことができます。 winrt::unbox_value_or 関数を使用して、スカラー値のみをボックス化解除できます。
IInspectable インターフェイスは、Windows ランタイム (WinRT) 内のすべてのランタイム クラスのルート インターフェイスです。 これは、すべての COM インターフェイスとクラスのルートにある IUnknown に似た考えです。および System.Object は、すべての Common Type System クラスのルートにあります。
つまり、 IInspectable を必要とする関数は、任意のランタイム クラスのインスタンスを渡すことができます。 ただし、このような関数にスカラー値 (数値やテキスト値など) や配列を直接渡すことはできません。 代わりに、スカラー値または配列値を参照クラス オブジェクト内にラップする必要があります。 その折り返し処理は、値 のボックス化 と呼ばれます。
Von Bedeutung
Windows ランタイム API に渡すことができる任意の型をボックス化およびボックス化解除できます。 つまり、Windows ランタイム型です。 数値とテキストの値 (文字列)、および配列は、上記の例です。 もう 1 つの例は、IDL で定義する struct です。 通常の C++ struct (IDL で定義されていないもの) をボックス化しようとすると、コンパイラはWindows ランタイム型のみをボックス化できることを通知します。 ランタイム クラスはWindows ランタイム型ですが、もちろん、ボックス化せずにランタイム クラスを Windows ランタイム API に渡すことができます。
C++/WinRT は winrt::box_value 関数を提供し、スカラー値または配列値を受け取り、 IInspectable にボックス化された値を返します。 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 ミューテーター関数を呼び出します。 content プロパティを文字列値に設定するには、このコードを使用します。
Button().Content(winrt::box_value(L"Clicked"));
最初に、 hstring 変換コンストラクターは、文字列リテラルを hstring に変換します。 その後、hstring を受け取る winrt::box_value のオーバーロードが呼び出されます。
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);
重要な API
Windows developer