次の方法で共有


方法: WRL を使用して Windows ランタイム コンポーネントをアクティブ化し使用する

このドキュメントに Windows ランタイム を初期化 Windows ランタイム、コンポーネントをアクティブ化して使用するには Windows ランタイム C++ テンプレート ライブラリ (WRL) を使用する方法を示します。

コンポーネントを使用するには、コンポーネントによって実装された型へのインターフェイス ポインターを取得する必要があります。と Windows ランタイム の基になるテクノロジがコンポーネント オブジェクト モデル (COM) であるため、型のインスタンスを保持する COM 規則に従う必要があります。たとえば、型がメモリからいつ削除されている 参照カウントを 保持する必要があります。

Windows ランタイムの使用を単純化するには、WRL が自動的に参照カウントを実行するスマート ポインターのテンプレート、ComPtr<T>を提供します。変数を宣言すると、ComPtr<インターフェイス名>識別子を指定します。インターフェイスのメンバーにアクセスするには、識別子に矢印のメンバー アクセス演算子 (->) を追加します。

重要 : 重要

インターフェイスの関数を呼び出すときに、HRESULT の戻り値を必ずテストします。

Windows のランタイム コンポーネントをアクティブ化して使用します。

次に示すために Windows::Foundation::IUriRuntimeClass のインターフェイスを Windows ランタイム コンポーネントのアクティベーション ファクトリの作成方法を使用してそのコンポーネントのインスタンスを作成して、プロパティ値を取得します。また、Windows ランタイムを初期化する方法を説明します。完全な例を次に示します。

Caution メモ注意

Windows ストア アプリケーションでは、通常 WRL を使用しますが、この例では、図のコンソール アプリケーションで。wprintf_s のような関数を Windows ストア アプリケーションでは使用できません。Windows ストア、アプリケーションで使用できる関数と型の詳細に inforomation については、でサポート /ZW CRT 関数Windows ストア apps の Win32 および COM" "を参照してください。

  1. (必須) #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 ディレクティブを使用することをお勧めします。

  2. アプリケーションが実行されるスレッドを初期化します。すべてのアプリケーションは、スレッドとスレッド モデルを初期化する必要があります。この例では 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 を返します。

  3. 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 ランタイム によって提供され、必須のランタイム クラス名を含む文字列です。

  4. 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 ランタイム は、操作のために作成し、その後作成したバッファーへのハンドルを保持し、バッファーの文字列のコピーを返します。

  5. 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);
    }
    
  6. 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);
    }
    
  7. ドメイン名をコンソールに出力し、を返します。すべての 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

参照

概念

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