Postupy: Aktivace a používání komponent prostředí Windows Runtime s použitím knihovny WRL
Tento dokument ukazuje, jak pomocí knihovny šablon jazyka C++ (WRL) prostředí Windows Runtime inicializovat prostředí Windows Runtime a jak aktivovat a používat komponentu prostředí Windows Runtime.
Chcete-li použít komponentu, musíte získat ukazatel rozhraní na typ, který je implementován komponentou. A protože základní technologie prostředí Windows Runtime je model com (Component Object Model), musíte dodržovat pravidla modelu COM, abyste zachovali instanci typu. Musíte například zachovat počet odkazů, který určuje, kdy je typ odstraněn z paměti.
Pro zjednodušení používání prostředí Windows Runtime poskytuje knihovna šablon jazyka C++ prostředí Windows Runtime šablonu inteligentního ukazatele ComPtr<T>, která automaticky provádí počítání odkazů. Když deklarujete proměnnou, zadejte ComPtr<
identifikátor názvu>
rozhraní. Pokud chcete získat přístup k členu rozhraní, použijte u identifikátoru operátor pro přístup k členu šipky (->
).
Důležité
Při volání funkce rozhraní vždy otestujte návratovou hodnotu HRESULT.
Aktivace a použití komponenty prostředí Windows Runtime
Následující kroky používají Windows::Foundation::IUriRuntimeClass
rozhraní k předvedení, jak vytvořit aktivační továrnu pro komponentu prostředí Windows Runtime, vytvořit instanci této komponenty a načíst hodnotu vlastnosti. Také ukazují, jak inicializovat prostředí Windows Runtime. Úplný příklad následuje.
Důležité
I když obvykle používáte prostředí Windows Runtime knihovnu šablon C++ v aplikaci Univerzální platforma Windows (UPW), tento příklad používá konzolovou aplikaci pro ilustraci. Funkce, jako wprintf_s
jsou například, nejsou dostupné z aplikace pro UPW. Další informace o typech a funkcích, které můžete použít v aplikaci pro UPW, najdete v tématu Funkce CRT, které nejsou podporovány v aplikacích pro Univerzální platforma Windows a Win32 a COM pro aplikace pro UPW.
Aktivace a použití komponenty prostředí Windows Runtime
Zahrňte (
#include
) všechny požadované prostředí Windows Runtime, prostředí Windows Runtime knihovnu šablon jazyka C++ nebo hlavičky standardní knihovny jazyka 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;
Doporučujeme použít direktivu
using namespace
v souboru .cpp, aby byl kód čitelnější.Inicializuje vlákno, ve kterém se aplikace spustí. Každá aplikace musí inicializovat svůj model vláken a vláken. Tento příklad používá Třídu Microsoft::WRL::Wrappers::RoInitializeWrapper inicializovat prostředí Windows Runtime a určuje RO_INIT_MULTITHREADED jako model threadingu. Třída
RoInitializeWrapper
voláWindows::Foundation::Initialize
na výstavbu, aWindows::Foundation::Uninitialize
když je zničena.// Initialize the Windows Runtime. RoInitializeWrapper initialize(RO_INIT_MULTITHREADED); if (FAILED(initialize)) { return PrintError(__LINE__, initialize); }
Ve druhém příkazu vrátí operátor
HRESULT
RoInitializeWrapper::HRESULT z volání .Windows::Foundation::Initialize
Vytvořte aktivační továrnu
ABI::Windows::Foundation::IUriRuntimeClassFactory
pro rozhraní.// 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); }
Prostředí Windows Runtime k identifikaci typů používá plně kvalifikované názvy. Parametr
RuntimeClass_Windows_Foundation_Uri
je řetězec, který poskytuje prostředí Windows Runtime a obsahuje požadovaný název třídy modulu runtime.Inicializace proměnné Microsoft::WRL::Wrappers::HString , která představuje identifikátor URI
"https://www.microsoft.com"
.// Create a string that represents a URI. HString uriHString; hr = uriHString.Set(L"http://www.microsoft.com"); if (FAILED(hr)) { return PrintError(__LINE__, hr); }
V prostředí Windows Runtime nepřidělujete paměť pro řetězec, který bude prostředí Windows Runtime používat. Místo toho prostředí Windows Runtime vytvoří kopii řetězce ve vyrovnávací paměti, kterou udržuje a používá pro operace, a poté vrátí popisovač do vyrovnávací paměti, kterou vytvořil.
K vytvoření objektu použijte metodu
IUriRuntimeClassFactory::CreateUri
ABI::Windows::Foundation::IUriRuntimeClass
továrny.// Create the IUriRuntimeClass object. ComPtr<IUriRuntimeClass> uri; hr = uriFactory->CreateUri(uriHString.Get(), &uri); if (FAILED(hr)) { return PrintError(__LINE__, hr); }
IUriRuntimeClass::get_Domain
Volání metody k načtení hodnotyDomain
vlastnosti.// Get the domain part of the URI. HString domainName; hr = uri->get_Domain(domainName.GetAddressOf()); if (FAILED(hr)) { return PrintError(__LINE__, hr); }
Vytiskněte název domény do konzoly a vraťte se. Všechny
ComPtr
objekty a objekty RAII ponechají obor a uvolní se automaticky.// 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.
Funkce WindowsGetStringRawBuffer načte základní formu Unicode řetězce identifikátoru URI.
Tady je úplný příklad:
// 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
*/
Probíhá kompilace kódu
Pokud chcete kód zkompilovat, zkopírujte ho a vložte ho do projektu sady Visual Studio nebo ho vložte do pojmenovaného wrl-consume-component.cpp
souboru a potom v okně příkazového řádku sady Visual Studio spusťte následující příkaz.
cl.exe wrl-consume-component.cpp runtimeobject.lib