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.
![]() |
---|
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.
![]() |
---|
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. |
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.
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.
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.
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.
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); }
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); }
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