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

  1. 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ší.

  2. 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, a Windows::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

  3. 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.

  4. 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.

  5. K vytvoření objektu použijte metodu IUriRuntimeClassFactory::CreateUriABI::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);
    }
    
  6. IUriRuntimeClass::get_Domain Volání metody k načtení hodnoty Domain vlastnosti.

    // Get the domain part of the URI.
    HString domainName;
    hr = uri->get_Domain(domainName.GetAddressOf());
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }
    
  7. 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

Viz také

Knihovna šablon C++ prostředí Windows Runtime (WRL)