共用方式為


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

本文件將示範如何使用 Windows 執行階段 C++ 樣板庫 (WRL) 初始化 Windows 執行階段 和啟動和使用 Windows 執行階段 元件。

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

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

重要事項重要事項

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

啟動並使用 Windows 執行階段元件

下列步驟將示範如何使用 Windows::Foundation::IUriRuntimeClass 介面建立 Windows 執行階段 元件的啟動 Factory,建立元件的執行個體,並擷取屬性值。同時也會說明如何初始化 Windows 執行階段。完整的程式碼範例如下所示。

注意事項警告

雖然您可以在 Windows 市集 應用程式通常會使用 WRL ,這個範例使用圖的主控台應用程式。例如 wprintf_s 函式無法從 Windows 市集 應用程式使用。如需您可以在 Windows 市集 應用程式中使用的型別和函式的詳細 inforomation,請參閱 CRT 函式不支援使用 /ZWWin32 和 COM Windows 市集應用程式的

  1. 包含 (#include) 所有必要的 Windows 執行階段、 WRL或 Standard 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 運算子傳回從呼叫中 HRESULTWindows::Foundation::Initialize

  3. 建立 ABI::Windows::Foundation::IUriRuntimeClassFactory 介面的啟動 Factory 。

    // 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. 初始化一 **"https://www.microsoft.com"**URI 的 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. 請使用 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"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-consume-component.cpp 然後在 Visual Studio 命令提示字元視窗中執行下列命令的檔案。

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

請參閱

概念

Windows Runtime C++ Template Library (WRL)