如何:利用 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 函式不支援使用 /ZW 和 Win32 和 COM Windows 市集應用程式的。 |
包含 (#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 指示詞讓程式碼更容易讀取。
初始化應用程式正在執行的執行緒。每個應用程式必須使用它的執行緒和執行緒模型。這個範例會使用 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 介面的啟動 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 執行階段 提供和包含所需的執行階段類別名稱的字串。
初始化一 **"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 執行階段 建置在作業維護和使用的緩衝資料的複本,然後將控制代碼傳回給它所建立的緩衝區。
請使用 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); }
呼叫 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
*/
編譯程式碼
若要編譯程式碼,請複製並貼到 Visual Studio 專案或貼在名為 wrl-consume-component.cpp 然後在 Visual Studio 命令提示字元視窗中執行下列命令的檔案。
cl.exe wrl-consume-component.cpp runtimeobject.lib