Comment : activer et utiliser un composant Windows Runtime Component à l'aide de WRL

Ce document montre comment utiliser Bibliothèque de modèles Windows Runtime C++ (WRL) pour initialiser Windows Runtime et pour lancer et utiliser un composant d' Windows Runtime .

Pour utiliser un composant, vous devez entrer un pointeur d'interface vers le type qui est implémenté par le composant.Étant donné que la technologie sous-jacente d' Windows Runtime est le modèle COM (component object model (COM), vous devez suivre les règles COM de gérer une instance du type.Par exemple, vous devez mettre à jour le décompte de références qui détermine si le type est supprimé de la mémoire.

Pour simplifier l'utilisation d' Windows Runtime, WRL fournit le modèle de pointeur intelligent, ComPtr<T>, qui effectue automatiquement le décompte de références.Lorsque vous déclarez une variable, spécifiez ComPtr<interface nom>ID.Pour accéder à un membre d'interface, appliquez l'opérateur d'accès de membre de flèche (->) à l'identificateur.

Important

Lorsque vous appelez une fonction d'interface, testez toujours la valeur de retour d' HRESULT .

Activation et de l'utilisation d'un composant de runtime windows

Les étapes suivantes utilisent l'interface d' Windows::Foundation::IUriRuntimeClass pour montrer comment créer une fabrique de lancement pour un composant d' Windows Runtime, créez une instance de ce composant, et récupèrent une valeur de propriété.Ils montrent également comment initialiser Windows Runtime.Voici un exemple de code complet :

Mise en gardeAttention

Bien que vous utilisez en général WRL dans une application d' Windows Store, cet exemple utilise une application console pour l'illustration.Les fonctions telles qu' wprintf_s sont pas disponibles d'une application d' Windows Store .Pour plus d'inforomation sur les types et des fonctions que vous pouvez utiliser dans une application d' Windows Store, consultez Fonctions CRT non prises en charge avec /ZW et Win32 et COM pour les applications de mémoire windows.

  1. Incluez (#include) tous les Windows Runtimerequis, WRL, ou en-tête standard de bibliothèque 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;
    

    Nous vous recommandons d'utiliser la directive d' using namespace dans votre fichier .cpp pour rendre le code plus lisible.

  2. Initialisez le thread dans lequel l'application s'exécute.Chaque application doit initialiser son thread et le modèle de thread.Cet exemple utilise la classe d' Microsoft::WRL::Wrappers::RoInitializeWrapper pour initialiser Windows Runtime et spécifie RO_INIT_MULTITHREADED en tant que modèle de thread.La classe d' RoInitializeWrapper appelle Windows::Foundation::Initialize à la construction, et Windows::Foundation::Uninitialize lorsqu'elle est perdue.

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

    Dans la deuxième instruction, l'opérateur d' RoInitializeWrapper::HRESULT retourne HRESULT de l'appel à Windows::Foundation::Initialize.

  3. Créez une fabrique de lancement pour l'interface d' 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);
    }
    

    Les noms complets des utilisations d' Windows Runtime pour identifier des types.Le paramètre d' RuntimeClass_Windows_Foundation_Uri est une chaîne fournie par Windows Runtime et contient le nom de classe d'exécution obligatoire.

  4. Initialisez une variable d' Microsoft::WRL::Wrappers::HString qui représente un 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);
    }
    

    Dans Windows Runtime, vous allouez ne pas mémoire pour une chaîne qu' Windows Runtime utilisera.À la place, Windows Runtime crée une copie de votre chaîne dans une mémoire tampon qu'il met à jour et utilise pour les opérations, puis retourne un handle vers la mémoire tampon qu'elle a créée.

  5. Utilisez la méthode de fabrique d' IUriRuntimeClassFactory::CreateUri pour créer un objet d' 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. Appelez la méthode d' IUriRuntimeClass::get_Domain pour récupérer la valeur de la propriété d' Domain .

    // Get the domain part of the URI.
    HString domainName;
    hr = uri->get_Domain(domainName.GetAddressOf());
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }
    
  7. Imprimer le nom de domaine à la console et retournez.Tous les ComPtr et les objets RAII de la portée et est libéré automatiquement.

    // 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 fonction récupère le formulaire sous-jacente Unicode de la chaîne d'URI.

Voici l'exemple complet :

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

Compilation du code

Pour compiler le code, copiez-le puis collez-le dans un projet Visual Studio, ou collez-le dans un fichier nommé wrl-consume-component.cpp puis exécutez la commande suivante dans une fenêtre d'invite de commandes de Visual Studio.

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

Voir aussi

Concepts

Bibliothèque de modèles Windows Runtime C++ (WRL)