方法: WRL を使用して Windows ランタイム コンポーネントをアクティブ化し使用する
このドキュメントに Windows ランタイム を初期化 Windows ランタイム、コンポーネントをアクティブ化して使用するには Windows ランタイム C++ テンプレート ライブラリ (WRL) を使用する方法を示します。
コンポーネントを使用するには、コンポーネントによって実装された型へのインターフェイス ポインターを取得する必要があります。と Windows ランタイム の基になるテクノロジがコンポーネント オブジェクト モデル (COM) であるため、型のインスタンスを保持する COM 規則に従う必要があります。たとえば、型がメモリからいつ削除されている 参照カウントを 保持する必要があります。
Windows ランタイムの使用を単純化するには、WRL が自動的に参照カウントを実行するスマート ポインターのテンプレート、ComPtr<T>を提供します。変数を宣言すると、ComPtr<インターフェイス名>識別子を指定します。インターフェイスのメンバーにアクセスするには、識別子に矢印のメンバー アクセス演算子 (->) を追加します。
重要 |
---|
インターフェイスの関数を呼び出すときに、HRESULT の戻り値を必ずテストします。 |
Windows のランタイム コンポーネントをアクティブ化して使用します。
次に示すために Windows::Foundation::IUriRuntimeClass のインターフェイスを Windows ランタイム コンポーネントのアクティベーション ファクトリの作成方法を使用してそのコンポーネントのインスタンスを作成して、プロパティ値を取得します。また、Windows ランタイムを初期化する方法を説明します。完全な例を次に示します。
注意 |
---|
Windows ストア アプリケーションでは、通常 WRL を使用しますが、この例では、図のコンソール アプリケーションで。wprintf_s のような関数を Windows ストア アプリケーションでは使用できません。Windows ストア、アプリケーションで使用できる関数と型の詳細に inforomation については、でサポート /ZW CRT 関数Windows ストア apps の Win32 および COM" "を参照してください。 |
(必須) #includeの Windows ランタイム、WRL、または標準 C++ ライブラリのヘッダーを含めます。
#include <Windows.Foundation.h> #include <wrl\wrappers\corewrappers.h> #include <wrl\client.h> #include <stdio.h> using namespace ABI::Windows::Foundation; using namespace Microsoft::WRL; using namespace Microsoft::WRL::Wrappers;
ここでは、コードを読みやすくするために、.cpp ファイルの using namespace ディレクティブを使用することをお勧めします。
アプリケーションが実行されるスレッドを初期化します。すべてのアプリケーションは、スレッドとスレッド モデルを初期化する必要があります。この例では Windows ランタイム を初期化するには Microsoft::WRL::Wrappers::RoInitializeWrapper のクラスを使用し、スレッド モデルとして RO_INIT_MULTITHREADED 指定します。RoInitializeWrapper のクラスは、構造体で破棄されるとき Windows::Foundation::Initialize、および Windows::Foundation::Uninitialize を呼び出します。
// Initialize the Windows Runtime. RoInitializeWrapper initialize(RO_INIT_MULTITHREADED); if (FAILED(initialize)) { return PrintError(__LINE__, initialize); }
2 番目のステートメントでは、RoInitializeWrapper::HRESULT の演算子は使用 Windows::Foundation::Initializeからに HRESULT を返します。
ABI::Windows::Foundation::IUriRuntimeClassFactory のインターフェイスのアクティベーション ファクトリを 作成します。
// Get the activation factory for the IUriRuntimeClass interface. ComPtr<IUriRuntimeClassFactory> uriFactory; HRESULT hr = GetActivationFactory(HStringReference(RuntimeClass_Windows_Foundation_Uri).Get(), &uriFactory); if (FAILED(hr)) { return PrintError(__LINE__, hr); }
Windows ランタイム は型を識別するために完全修飾名を使用します。RuntimeClass_Windows_Foundation_Uri のパラメーターは Windows ランタイム によって提供され、必須のランタイム クラス名を含む文字列です。
URI **"https://www.microsoft.com"**を表す Microsoft::WRL::Wrappers::HString の変数を初期化します。
// Create a string that represents a URI. HString uriHString; hr = uriHString.Set(L"https://www.microsoft.com"); if (FAILED(hr)) { return PrintError(__LINE__, hr); }
Windows ランタイムでは、Windows ランタイム が使用する文字列のメモリはできません。代わりに、Windows ランタイム は、操作のために作成し、その後作成したバッファーへのハンドルを保持し、バッファーの文字列のコピーを返します。
ABI::Windows::Foundation::IUriRuntimeClass のオブジェクトの作成に IUriRuntimeClassFactory::CreateUri ファクトリ メソッドを使用します。
// Create the IUriRuntimeClass object. ComPtr<IUriRuntimeClass> uri; hr = uriFactory->CreateUri(uriHString.Get(), &uri); if (FAILED(hr)) { return PrintError(__LINE__, hr); }
Domain のプロパティの値を取得するには IUriRuntimeClass::get_Domain のメソッドを呼び出します。
// Get the domain part of the URI. HString domainName; hr = uri->get_Domain(domainName.GetAddressOf()); if (FAILED(hr)) { return PrintError(__LINE__, hr); }
ドメイン名をコンソールに出力し、を返します。すべての ComPtr、RAII のオブジェクトがスコープを開き、自動的に解放されます。
// Print the domain name and return. wprintf_s(L"Domain name: %s\n", domainName.GetRawBuffer(nullptr)); // All smart pointers and RAII objects go out of scope here.
WindowsGetStringRawBuffer 関数は、URI 文字列の基になる Unicode 形式を取得します。
完全な例を次に示します。:
// wrl-consume-component.cpp
// compile with: runtimeobject.lib
#include <Windows.Foundation.h>
#include <wrl\wrappers\corewrappers.h>
#include <wrl\client.h>
#include <stdio.h>
using namespace ABI::Windows::Foundation;
using namespace Microsoft::WRL;
using namespace Microsoft::WRL::Wrappers;
// Prints an error string for the provided source code line and HRESULT
// value and returns the HRESULT value as an int.
int PrintError(unsigned int line, HRESULT hr)
{
wprintf_s(L"ERROR: Line:%d HRESULT: 0x%X\n", line, hr);
return hr;
}
int wmain()
{
// Initialize the Windows Runtime.
RoInitializeWrapper initialize(RO_INIT_MULTITHREADED);
if (FAILED(initialize))
{
return PrintError(__LINE__, initialize);
}
// Get the activation factory for the IUriRuntimeClass interface.
ComPtr<IUriRuntimeClassFactory> uriFactory;
HRESULT hr = GetActivationFactory(HStringReference(RuntimeClass_Windows_Foundation_Uri).Get(), &uriFactory);
if (FAILED(hr))
{
return PrintError(__LINE__, hr);
}
// Create a string that represents a URI.
HString uriHString;
hr = uriHString.Set(L"https://www.microsoft.com");
if (FAILED(hr))
{
return PrintError(__LINE__, hr);
}
// Create the IUriRuntimeClass object.
ComPtr<IUriRuntimeClass> uri;
hr = uriFactory->CreateUri(uriHString.Get(), &uri);
if (FAILED(hr))
{
return PrintError(__LINE__, hr);
}
// Get the domain part of the URI.
HString domainName;
hr = uri->get_Domain(domainName.GetAddressOf());
if (FAILED(hr))
{
return PrintError(__LINE__, hr);
}
// Print the domain name and return.
wprintf_s(L"Domain name: %s\n", domainName.GetRawBuffer(nullptr));
// All smart pointers and RAII objects go out of scope here.
}
/*
Output:
Domain name: microsoft.com
*/
コードのコンパイル
コードをコンパイル、配置、Visual Studio のプロジェクトに貼り付けるか、という名前 wrl 実行して component.cpp。、Visual Studio コマンド プロンプト ウィンドウで次のコマンド実行ファイルに貼り付けます。
cl.exe wrl-consume-component.cpp runtimeobject.lib