如何:使用 WRL 激活和使用 Windows 运行时组件

文档演示如何使用Windows 运行时 C++ 模板库(WRL)初始化Windows 运行时以及激活和使用Windows 运行时组件。

备注

此示例状态内置 Windows 运行时 组件。若要了解如何创建自己可以以类似方式激活的组件,请参见 演练:使用 WRL 创建基本 Windows 运行时组件

为了使用组件,您必须获取接口指针到该组件实现的类型。 此外,因为 Windows 运行时 的基础技术是组件对象模型 (COM) (COM),则必须遵循 COM 规则维护类型的实例。 例如,您确定必须维护的 引用数 类型时从内存删除。

若要简化使用 Windows 运行时,则 WRL 提供的聪明指针模板,ComPtr<T>,自动执行引用计数。 在声明变量时,指定 ComPtr<interface-name> identifier。 若要访问接口成员中,适用于箭头成员访问运算符 (->标识符。)

重要

在调用接口函数时,始终要测试 HRESULT 返回值。

激活和使用 Windows 运行时组件

以下步骤使用 Windows::Foundation::IUriRuntimeClass 接口演示如何创建 Windows 运行时 组件的一个活动,工厂创建该组件实例,并检索属性值。 这些示例还显示如何初始化 Windows 运行时。 下面是完整的示例。

重要

尽管可以在 Windows 应用商店 应用通常使用 WRL,此示例使用图的控制台应用。函数 (如 wprintf_s ) 从 Windows 应用商店 应用不可用。有关在 Windows 应用商店 应用中使用和函数的类型的更多信息,请参见 CRT 函数不支持与 /ZWWin32 和 COM 中存储应用的

激活和使用 Windows 运行时组件

  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. 初始化应用执行的线程。 每个应用必须初始化其线程和线程模型。 此示例使用 Microsoft::WRL::Wrappers::RoInitializeWrapper 类初始化 Windows 运行时 并指定 RO_INIT_MULTITHREADED 为线程模型。 当销毁时,RoInitializeWrapper 类在构造调用 Windows::Foundation::InitializeWindows::Foundation::Uninitialize 方法。

    // Initialize the Windows Runtime.
    RoInitializeWrapper initialize(RO_INIT_MULTITHREADED);
    if (FAILED(initialize))
    {
        return PrintError(__LINE__, initialize);
    }
    

    在第二个语句,RoInitializeWrapper::HRESULT 运算符返回从调用的 HRESULT 设置为 Windows::Foundation::Initialize

  3. 创建 ABI::Windows::Foundation::IUriRuntimeClassFactory 接口的一个活动 activation 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. 初始化表示 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. 使用 IUriRuntimeClassFactory::CreateUri 工厂方法可创建 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
*/

编译代码

若要编译代码,请复制代码并将其粘贴到 项目中或一个名为 parallel-matrix-multiply.cpp 的文件中,然后在命令提示符窗口中运行以下命令。

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

请参见

概念

Windows 运行时 C++ 模板库 (WRL)