共用方式為


如何:利用 WRL 啟動與使用 Windows 執行階段元件

本文件說明如何使用 Windows 執行階段 C++ 範本庫 (WRL)來初始化 Windows 執行階段,以及如何啟動和使用 Windows 執行階段元件。

若要使用元件,您必須取得元件所實作之類型的介面指標。 由於 Windows 執行階段的基礎技術是元件物件模型 (COM),因此您必須遵循 COM 規則來維護類型的實例。 例如,您必須維護 參考計數 ,以判斷類型何時從記憶體中刪除。

為了簡化 Windows 執行階段 的使用,Windows 執行階段 C++ 範本庫會提供智慧型手機樣本 ComPtr<T>,可自動執行參考計數。 當您宣告變數時,請指定ComPtr<介面名稱>識別碼。 若要存取介面成員,請將箭頭成員存取運算符 (->) 套用至標識符。

重要

當您呼叫介面函式時,請一律測試 HRESULT 傳回值。

啟用和使用 Windows 執行階段元件

下列步驟會Windows::Foundation::IUriRuntimeClass使用 介面來示範如何建立 Windows 執行階段元件的啟用處理站、建立該元件的實例,以及擷取屬性值。 它們也會示範如何初始化 Windows 執行階段。 完整的范例如下。

重要

雖然您通常會在 通用 Windows 平台 (UWP) 應用程式中使用 Windows 執行階段 C++ 範本連結庫,但此範例會使用主控台應用程式來說明。 這類 wprintf_s 功能無法從 UWP 應用程式取得。 如需您可以在 UWP app 中使用的類型和函式的詳細資訊,請參閱 通用 Windows 平台 應用程式不支援 CRT 函式和適用於 UWP 應用程式的 Win32 和 COM。

啟用和使用 Windows 執行階段元件

  1. 包含 (#include) 任何必要的 Windows 執行階段、Windows 執行階段 C++ 範本連結庫,或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. 初始化應用程式執行所在的線程。 每個應用程式都必須初始化其線程和線程模型。 這個範例會使用 Microsoft::WRL::Wrappers::RoInitializeWrapper 類別來初始化 Windows 執行階段,並將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);
    }
    

    在第二個語句中,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"http://www.microsoft.com");
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }
    

    在 Windows 執行階段 中,您不會為 Windows 執行階段 將使用的字串配置記憶體。 相反地,Windows 執行階段 會在它維護並用於作業的緩衝區中建立字串的複本,然後將句柄傳回它所建立的緩衝區。

  5. IUriRuntimeClassFactory::CreateUri使用 Factory 方法來建立 ABI::Windows::Foundation::IUriRuntimeClass 物件。

    // Create the IUriRuntimeClass object.
    ComPtr<IUriRuntimeClass> uri;
    hr = uriFactory->CreateUri(uriHString.Get(), &uri);
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }
    
  6. IUriRuntimeClass::get_Domain呼叫 方法來擷取 屬性的值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"http://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-consume-component.cpp 的檔案中,然後在Visual Studio 命令提示字元視窗中執行下列命令。

cl.exe wrl-consume-component.cpp runtimeobject.lib

另請參閱

Windows 執行階段 C++ 範本庫 (WRL)