Windows ランタイム C++ テンプレート ライブラリ (WRL)

Windows ランタイム C++ テンプレート ライブラリ (WRL) は、Windows ランタイム コンポーネントを作成および使用するための低レベルの手段を提供するテンプレート ライブラリです。

Note

WRL は、Windows ランタイム API 向けの標準 C++17 言語プロジェクションである C++/WinRT に置き換えられました。 C++/WinRT は、Windows SDK バージョン 1803 (10.0.17134.0) 以降で使用できます。 C++/WinRT は、全体がヘッダー ファイル内に実装され、最新の Windows API に対する最高級のアクセスを提供するように設計されています。

C++/WinRT を使うと、標準に準拠した C++17 コンパイラを使って、Windows ランタイム API の使用と作成の両方を行うことができます。 C++/WinRT は、通常、Windows ランタイム用の他のどの言語オプションより、優れたパフォーマンスを示し、小さなバイナリを生成します。 C++/CX と WRL は引き続きサポートされますが、新しいアプリケーションでは C++/WinRT を使用することを強くお勧めします。 詳細については、「C++/WinRT」を参照してください。

メリット

Windows ランタイム C++ テンプレート ライブラリを使うと、コンポーネント オブジェクト モデル (COM) コンポーネントの実装と使用をより簡単に行うことができます。 それは、オブジェクトの有効期間を管理するための参照カウントや、操作が成功したか失敗したかを判断するための HRESULT 値のテストのような管理技法を提供します。 Windows ランタイム C++ テンプレート ライブラリを適切に使うには、以下の規則や技法に注意深く従う必要があります。

C++/CX は、Windows ランタイム コンポーネントを使用するための、高レベルの言語ベースの方法です。 Windows ランタイム C++ テンプレート ライブラリと C++/CX はどちらも、管理タスクを自動的に実行することで、Windows ランタイム用のコードの記述を容易にします。

Windows ランタイム C++ テンプレート ライブラリと C++/CX では、提供される利点が異なります。 ここでは、C++/CX の代わりに Windows ランタイム C++ テンプレート ライブラリを使用することが望ましいと考えるいくつかの理由を示します。

  • Windows ランタイム C++ テンプレート ライブラリでは、Windows ランタイム アプリケーション バイナリ インターフェイス (ABI) の抽象化はほとんど追加されず、開発者は基になるコードを詳細に制御して、Windows ランタイム API をより適切に作成または使用することができます。

  • C++/CX は、例外として COM HRESULT 値を表します。 COM を使用するコード ベースまたは例外を使用しないコード ベースを継承している場合は、例外を使用する必要がないため、Windows ランタイム C++ テンプレート ライブラリがWindows ランタイムを操作するより自然な方法であることがわかります。

    Note

    Windows ランタイム C++ テンプレート ライブラリは HRESULT 値を使用し、例外をスローしません。 また、Windows ランタイム C++ テンプレート ライブラリは、スマート ポインターと RAII パターンを使用して、アプリケーションのコードが例外をスローしたときにオブジェクトが正しく破棄されることを保証します。 スマート ポインターと RAII について詳しくは、スマート ポインターおよびオブジェクトがリソースを所有する (RAII) に関する記事をご覧ください。

  • Windows ランタイム C++ テンプレート ライブラリの目的と設計は、COM オブジェクトのプログラミングを簡略化するテンプレート ベースの一連の C++ クラスである、Active Template Library (ATL) に基づいています。 Windows ランタイム C++ テンプレート ライブラリは標準 C++ を使用して Windows ランタイムをラップするため、ATL で記述した既存の多くの COM コンポーネントを Windows ランタイムに簡単に移植し、操作することができます。 既に ATL を理解している場合は、Windows ランタイム C++ テンプレート ライブラリのプログラミングの方が容易であると思えるかもしれません。

作業の開始

ここでは、Windows ランタイム C++ テンプレート ライブラリをすぐに使用するために役立ついくつかのリソースを紹介します。

方法: Windows ランタイム コンポーネントをアクティブ化して使用する
Windows ランタイム C++ テンプレート ライブラリを使って Windows ランタイムを初期化する方法と、Windows ランタイム コンポーネントをアクティブ化して使う方法について説明します。

方法: 非同期操作を完了する
Windows ランタイム C++ テンプレート ライブラリを使用して非同期操作を開始し、操作の完了時に処理を実行する方法について説明します。

方法: イベントを処理する
Windows ランタイム C++ テンプレート ライブラリを使用して、Windows ランタイム オブジェクトのイベントをサブスクライブし、そのイベント処理する方法について説明します。

チュートリアル: WRL および Media Foundation を使用した UWP アプリの作成
Microsoft メディア ファンデーションを使用する UWP アプリを作成する方法について説明します。

方法: クラシック COM コンポーネントを作成する
Windows ランタイム C++ テンプレート ライブラリを使用して基本的な COM コンポーネントを作成する方法と、デスクトップ アプリから COM コンポーネントを登録して使用する基本的な方法を示します。

方法: WRL コンポーネントを直接インスタンス化する
Microsoft::WRL::MakeMicrosoft::WRL::Details::MakeAndInitialize 関数を使用して、コンポーネントを定義するモジュールからそのコンポーネントをインスタンス化する方法について説明します。

方法: winmdidl.exe と midlrt.exe を使用して、Windows メタデータから .h ファイルを作成する
.winmd メタデータから IDL ファイルを作成して、WRL からカスタム Windows ランタイム コンポーネントを使用する方法を示します。

チュートリアル: タスクおよび XML HTTP 要求を使用した接続
IXMLHTTPRequest2 および IXMLHTTPRequest2Callback インターフェイスをタスクと共に使用し、UWP アプリ内で HTTP GET および POST 要求を Web サービスに送信する方法を示します。

Bing マップ Trip Optimizer のサンプル
完全な UWP アプリのコンテキストにおいて、「チュートリアル: タスクおよび XML HTTP 要求を使用した接続」で定義されている HttpRequest クラスを使用します。

C++ サンプルを使用したWindows ランタイム DLL コンポーネントの作成
Windows ランタイム C++ テンプレート ライブラリを使用してインプロセス DLL コンポーネントを作成し、C++/CX、JavaScript、C# からそれを使用する方法を示します。

DirectX Marble Maze ゲームのサンプル
Windows ランタイム C++ テンプレート ライブラリを使用して、完全な 3D ゲームのコンテキストで、DirectX やメディア ファンデーションのような COM コンポーネントの有効期間を管理する方法を示します。

デスクトップ アプリからのトースト通知
デスクトップ アプリからトースト通知を送信する方法を示します。

Windows ランタイム C++ テンプレート ライブラリと ATL の比較

Windows ランタイム C++ テンプレート ライブラリは、小規模で高速な COM オブジェクトを作成できる点で、Active Template Library (ATL) に似ています。 Windows ランタイム C++ テンプレート ライブラリと ATL は、モジュール内でのオブジェクトの定義、インターフェイスの明示的な登録、ファクトリを使用した開放型のオブジェクト作成などの概念も共通しています。 ATL に慣れている場合は、Windows ランタイム C++ テンプレート ライブラリを快適に使用できる可能性があります。

Windows ランタイム C++ テンプレート ライブラリは、UWP アプリに必要な COM 機能をサポートしています。 したがって、以下のような COM 機能の直接サポートを省略した ATL とは異なっています。

  • 集計

  • ストックの実装

  • デュアル インターフェイス (IDispatch)

  • 標準的な列挙子インターフェイス

  • 接続ポイント

  • ティアオフ インターフェイス

  • OLE 埋め込み

  • ActiveX コントロール

  • COM+

概念

Windows ランタイム C++ テンプレート ライブラリには、いくつかの基本的な概念を表す型が用意されています。 以下のセクションでは、これらの型について説明します。

ComPtr

ComPtr は、テンプレート パラメーターで指定されたインターフェイスを表す スマート ポインター 型です。 インターフェイスから派生したオブジェクトのメンバーにアクセスできる変数を宣言するには、 ComPtr を使用します。 ComPtr は、基になるインターフェイス ポインターの参照カウントを維持し、参照カウントがゼロになるとそのインターフェイスを自動的に解放します。

RuntimeClass

RuntimeClass は、指定したインターフェイスのセットを継承する、インスタンス化されたクラスを表します。 RuntimeClass オブジェクトは、1 つ以上の Windows ランタイム COM インターフェイスに対するサポートの組み合わせ、つまりコンポーネントへの弱い参照を提供できます。

モジュール

Module は、関連するオブジェクトから成るコレクションを表します。 Module オブジェクトは、オブジェクトを作成するクラス ファクトリと、他のアプリケーションからオブジェクトを使用できるようにする登録を管理します。

コールバック

"Callback (コールバック)" 関数は、メンバー関数がイベント ハンドラー (コールバック メソッド) であるオブジェクトを作成します。 非同期操作を書き込むには、 Callback 関数を使用します。

EventSource

EventSource は、 デリゲート イベント ハンドラーを管理するために使用します。 Windows ランタイム C++ テンプレート ライブラリを使用してデリゲートを実装し、EventSource を使用してデリゲートを追加、削除、起動します。

AsyncBase

AsyncBase は、Windows ランタイムの非同期プログラミング モデルを表す仮想メソッドを提供します。 非同期操作の進行状況を開始、停止、または確認するカスタム クラスを作成するには、このクラス内のメンバーをオーバーライドします。

FtmBase

FtmBase は、フリー スレッドのマーシャラー オブジェクトを表します。 FtmBase は、グローバル インターフェイス テーブル (GIT) を作成し、マーシャリングとプロキシ オブジェクトの管理を支援します。

WeakRef

WeakRef は、アクセス可能またはアクセス不可能のオブジェクトを参照する 弱い参照を表すスマート ポインター型です。 WeakRef オブジェクトを使用できるのは Windows ランタイムのみであり、従来の COM では使用できません。

WeakRef オブジェクトは通常、外部スレッドまたは外部アプリケーションによって存在が制御されるオブジェクトを表します。 たとえば、 WeakRef オブジェクトを使用して、ファイル オブジェクトを参照できます。 そのファイルが開いている場合は、 WeakRef が有効になり、参照先ファイルにアクセスできます。 一方、そのファイルが閉じている場合は、 WeakRef が無効になり、そのファイルにアクセスできません。

カテゴリ別の主要 API
Windows ランタイム C++ テンプレート ライブラリの主要な型、関数、マクロについて取り上げます。

リファレンス
Windows ランタイム C++ テンプレート ライブラリのリファレンス情報を提供します。

クイック リファレンス (C++/CX)
Windows ランタイムをサポートする C++/CX の機能について簡単に説明します。

Visual C++ での Windows ランタイム コンポーネントの使用
C++/CX を使用して基本的な Windows ランタイム コンポーネントを作成する方法を示します。