Condividi tramite


Procedura: attivare e utilizzare un componente Windows Runtime mediante WRL

In questo documento viene illustrato come utilizzare Libreria di modelli di Windows Runtime C++WRL() per inizializzare Windows Runtime e per attivare e utilizzare un componente di Windows Runtime.

Per utilizzare un componente, è necessario acquistare un puntatore a interfaccia al tipo che viene implementato dal componente.E poiché la tecnologia sottostante di Windows Runtime è il Component Object Model (COM), è necessario seguire le regole COM gestire un'istanza del tipo.Ad esempio, è necessario gestire il conteggio dei riferimenti che determina quando il tipo viene eliminato dalla memoria.

Per semplificare l'utilizzo di Windows Runtime, WRL fornisce il modello del puntatore intelligente, ComPtr<T>, che esegue automaticamente il conteggio dei riferimenti.Quando si dichiara una variabile, specificare ComPtr<nome venga gestita>identificatore.Per accedere a un membro di interfaccia, applicare l'operatore di accesso ai membri freccia (->) all'identificatore.

Nota importanteImportante

Quando si chiama una funzione dell'interfaccia, verificare sempre il valore restituito di HRESULT.

Attivando e l'utilizzo di un componente di runtime di Windows

I passaggi seguenti utilizzano l'interfaccia di Windows::Foundation::IUriRuntimeClass per illustrare come creare una factory di attivazione per una parte di Windows Runtime, creare un'istanza del componente e recuperare un valore di proprietà.Viene inoltre illustrato come inizializzare Windows Runtime.Di seguito viene fornito l'esempio completo.

Nota di avvisoAttenzione

Sebbene in genere utilizzato WRL in un'applicazione di Windows Store, questo esempio un'applicazione console per completezza.Funzioni come wprintf_s non sono disponibili da un'applicazione di Windows Store.Per ulteriori inforomation sui tipi e le funzioni che è possibile utilizzare in un'applicazione di Windows Store, vedere Funzioni CRT non supportate con /ZW e Win32 e COM per le applicazioni di archivio di Windows.

  1. Importare ()#includequalsiasi Windows Runtimeobbligatorio, WRL, o intestazioni standard di 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;
    

    Si consiglia di utilizzare la direttiva di using namespace nel file CPP per rendere il codice più leggibile.

  2. Inizializzare il thread in cui viene eseguita l'applicazione.Ogni applicazione deve inizializzare i thread e modello di threading.In questo esempio la classe di Microsoft::WRL::Wrappers::RoInitializeWrapper per inizializzare Windows Runtime e specifica RO_INIT_MULTITHREADED come il modello di threading.La classe di RoInitializeWrapper chiama Windows::Foundation::Initialize alla costruzione e Windows::Foundation::Uninitialize quando viene eliminato.

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

    Nella seconda istruzione, l'operatore di RoInitializeWrapper::HRESULT restituisce HRESULT la chiamata a Windows::Foundation::Initialize.

  3. Creare una factory di attivazione per l'interfaccia di ABI::Windows::Foundation::IUriRuntimeClassFactory.

    // 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);
    }
    

    I nomi completi di utilizzo di Windows Runtime per identificare i tipi.Il parametro di RuntimeClass_Windows_Foundation_Uri è una stringa fornita da Windows Runtime e contiene il nome di classe di runtime richiesto.

  4. Inizializzare una variabile di Microsoft::WRL::Wrappers::HString che rappresenta l'uri "https://www.microsoft.com".

    // Create a string that represents a URI.
    HString uriHString;
    hr = uriHString.Set(L"https://www.microsoft.com");
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }
    

    In Windows Runtime, non viene allocata memoria per una stringa che Windows Runtime utilizzata.Invece, Windows Runtime crea una copia della stringa in un buffer che gestisce e vengono utilizzate per le operazioni e restituisce l'handle per il buffer che hanno creato.

  5. Utilizzare il metodo factory di IUriRuntimeClassFactory::CreateUri per creare un oggetto di 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. Chiamare il metodo di IUriRuntimeClass::get_Domain per recuperare il valore della proprietà di Domain.

    // Get the domain part of the URI.
    HString domainName;
    hr = uri->get_Domain(domainName.GetAddressOf());
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }
    
  7. Stampare nome di dominio nella console e restituire.Qualsiasi ComPtr e gli oggetti RAII consentono all'ambito e vengono eliminati automaticamente.

    // 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 La funzione recupera il form sottostante Unicode di stringa di un URI.

Di seguito è riportato l'esempio completo:

// 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
*/

Compilazione del codice

Per compilare il codice, copiarlo e quindi incollarlo in un progetto di Visual Studio, oppure incollarlo in un file denominato wrl-consume-component.cpp quindi viene eseguito il comando seguente in una finestra del prompt dei comandi di Visual Studio.

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

Vedere anche

Concetti

Libreria di modelli di Windows Runtime C++ (WRL)