文档演示如何使用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 函数不支持与 /ZW 和 Win32 和 COM 中存储应用的。
激活和使用 Windows 运行时组件
包括 (#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 指令使代码更具可读性。
初始化应用执行的线程。 每个应用必须初始化其线程和线程模型。 此示例使用 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 运算符返回从调用的 HRESULT 设置为 Windows::Foundation::Initialize。
创建 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 运行时 提供并需的运行时类名称的字符串。
初始化表示 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 运行时 创建字符串的副本。为操作维护和使用的缓冲区),然后返回该句柄创建的缓冲区。
使用 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); }
调用 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); }
打印到域名控制台并返回。 所有 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