Procédure pas à pas : création d'un composant Windows Runtime de base à l'aide de WRL

Ce document montre comment utiliser le Bibliothèque de modèles Windows Runtime C++ (WRL) pour créer un composant Windows Runtime de base.Le composant additionne deux nombres et déclenche un événement lorsque le résultat est un nombre premier.Ce document montre également comment utiliser le composant d'une application d' Windows Store utilisant JavaScript.

Composants requis

Pour créer un composant Windows Runtime de base qui additionne deux nombres

  1. Dans Visual Studio, créer un projet WRLClassLibrary Visual C++.Le document Modèle de projet de bibliothèque de classes WRL décrit comment télécharger ce modèle.Nommez le projet Contoso.

  2. Dans Contoso.cpp et Contoso.idl, remplacez toutes les instances de « WinRTClass » par « Calculator ».

  3. Dans Contoso.idl, ajoutez la méthode Add à l'interface ICalculator.

    HRESULT Add([in] int a, [in] int b, [out, retval] int* value);
    
  4. Dans Contoso.cpp, ajoutez la méthode Add à la section public de la classe Calculator.

    HRESULT __stdcall Add(_In_ int a, _In_ int b, _Out_ int* value)
    {
        if (value == nullptr)
        {
            return E_POINTER;
        }
        *value = a + b;
        return S_OK;
    }
    

    Important

    Étant donné que vous créez un composant COM, n'oubliez pas d'utiliser la convention de nommage __stdcall.

    Nous vous recommandons d'utiliser _Out_ et d'autres annotations du langage d'annotation de source (SAL) pour décrire comment une fonction utilise ses paramètres.Les annotations SAL décrivent également des valeurs de retour.Les annotations SAL fonctionnent avec l'outil d'analyse de code C/C++ pour découvrir d'éventuelles erreurs dans le code source C et C++.La plupart des erreurs de code signalées par l'outil sont les dépassements de mémoire tampon, les libérations de mémoire, les déréférencements de pointeur null, les fuites mémoire et les fuites de ressource.

Pour utiliser le composant d'une application Windows Store utilisant JavaScript

  1. Dans Visual Studio, ajoutez un nouveau projet JavaScript Application Vierge à la solution Contoso.Nommez le projet CalculatorJS.

  2. Dans le projet CalculatorJS, ajoutez une référence au projet Contoso.

  3. Dans default.html, remplacez la section d' body avec ces éléments d'interface utilisateur :

    <div>
        <input id="a" />
        <input id="b" />
        <p id="result">Result:</p>
        <button onclick="Add()">Add</button>
    </div>
    
  4. Dans default.js, implémentez la fonction OnClick.

    function Add() {
        "use strict";
    
        var calculator = new Contoso.Calculator();
    
        var a = document.getElementById("a");
        var b = document.getElementById("b");
    
        document.getElementById("result").innerHTML = "Result: " + calculator.add(a.value, b.value);
    }
    

    [!REMARQUE]

    En JavaScript, la première lettre d'un nom de méthode est modifiée en minuscules pour correspondre aux conventions de nommage standard.

Pour ajouter un événement qui se déclenche lorsqu'un nombre premier est calculé

  1. Dans Contoso.idl, avant la déclaration de ICalculator, définissez le type délégué, PrimeNumberEvent, qui fournit un argument de type int.

    [uuid(3FBED04F-EFA7-4D92-B04D-59BD8B1B055E), version(COMPONENT_VERSION)]
    delegate HRESULT PrimeNumberEvent(int primeNumber);
    

    Lorsque vous utilisez le mot clé d' delegate, le compilateur MIDL crée une interface qui contient une méthode d' Invoke qui correspond à la signature de ce délégué.Dans cet exemple, le fichier généré Contoso_h.h définit l'interface d' IPrimeNumberEvent, qui est utilisée ultérieurement dans cette procédure.

    MIDL_INTERFACE("3FBED04F-EFA7-4D92-B04D-59BD8B1B055E")
    IPrimeNumberEvent : public IUnknown
    {
    public:
        virtual HRESULT STDMETHODCALLTYPE Invoke( 
            int primeNumber) = 0;
    
    };
    
  2. Dans l'interface ICalculator, définissez l'évènement PrimeNumberFound.Les attributs eventadd et eventremove spécifient que le consommateur de l'interface ICalculator peut s'abonner et se désabonner de cet événement.

    [eventadd]
    HRESULT PrimeNumberFound(
        [in] PrimeNumberEvent* eventHandler, 
        [out, retval] EventRegistrationToken* eventCookie);
    [eventremove] 
    HRESULT PrimeNumberFound(
        [in] EventRegistrationToken eventCookie);
    
  3. Dans Contoso.cpp, ajoutez une variable membre d' privateMicrosoft::WRL::EventSource pour gérer les abonnés et appeler le gestionnaire d'événements.

    EventSource<IPrimeNumberEvent> m_events;
    
  4. Dans Contoso.cpp, implémentez les méthodes add_PrimeNumberFound et remove_PrimeNumberFound.

    HRESULT __stdcall add_PrimeNumberFound(_In_ IPrimeNumberEvent* event, _Out_ EventRegistrationToken* eventCookie)
    {
        return m_events.Add(event, eventCookie);
    }
    
    HRESULT __stdcall remove_PrimeNumberFound(_In_ EventRegistrationToken eventCookie)
    {
        return m_events.Remove(eventCookie);
    }
    

Pour déclencher l'événement lorsqu'un nombre premier est calculé

  1. Dans Contoso.cpp, ajoutez la méthode IsPrime à la section private de la classe Calculator.

    // Determines whether the input value is prime.
    bool IsPrime(int n)
    {
        if (n < 2)
        {
            return false;
        }
        for (int i = 2; i < n; ++i)
        {
            if ((n % i) == 0)
            {
                return false;
            }
        }
        return true;
    }
    
  2. Modifiez la méthode d' Add d'Calculator pour appeler la méthode d' Microsoft::WRL::EventSource::InvokeAll lorsqu'un nombre premier est calculé.

    HRESULT __stdcall Add(_In_ int a, _In_ int b, _Out_ int* value)
    {
        if (value == nullptr)
        {
            return E_POINTER;
        }
        int c = a + b;
        if (IsPrime(c))
        {
            m_events.InvokeAll(c);
        }
        *value = c;
        return S_OK;
    }
    

Pour gérer l'événement du JavaScript

  1. Dans default.html, modifiez la section body pour inclure une zone de texte contenant des nombres premiers.

    <div>
        <input id="a" />
        <input id="b" />
        <p id="result">Result:</p>
        <p id="primes" style="color:#808080">Primes found:</p>
        <button onclick="Add()">Add</button>
    </div>
    
  2. Dans default.js, modifiez la fonction Add pour gérer l'événement PrimeNumberFound.Le gestionnaire d'événements ajoute le nombre premier à la zone de texte défini par l'étape précédente.

    function Add() {
        "use strict";
    
        var calculator = new Contoso.Calculator();
        calculator.onprimenumberfound = function (ev) {
            document.getElementById("primes").innerHTML += " " + ev.target;
        };
    
        var a = document.getElementById("a");
        var b = document.getElementById("b");
    
        document.getElementById("result").innerHTML = "Result: " + calculator.add(a.value, b.value);
    }
    

    [!REMARQUE]

    En JavaScript, les noms d'événements sont modifiés en minuscules et sont précédés de "on" pour correspondre aux conventions de nommage standards.

L'illustration suivante montre l'application Calculatrice de base.

Application Calculatrice de base utilisant JavaScript

Voir aussi

Concepts

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

Modèle de projet de bibliothèque de classes WRL

Outil d'analyse de code C/C++