Compartir a través de


Tutorial: Crear un componente básico de Windows en tiempo de ejecución mediante WRL

En este documento se muestra cómo utilizar Biblioteca de plantillas de Windows Runtime C++ (WRL) para crear un componente básico de Windows en tiempo de ejecución.El componente agrega dos números y provoca un evento cuando el resultado es primo.Este documento también muestra cómo utilizar el componente de una aplicación de Tienda Windows que utilice JavaScript.

Requisitos previos

Para crear un componente básico de Windows en tiempo de ejecución que suma dos números

  1. En Visual Studio, cree un proyecto de Visual C++ WRLClassLibrary.El documento Plantilla de proyecto de Biblioteca de clases de WRL describe cómo descargar esta plantilla.Asigne al proyecto Contoso.

  2. En Contoso.cpp y Contoso.idl, reemplace todas las instancias de “WinRTClass” con “Calculator”.

  3. En Contoso.idl, agregue el método de Add a la interfaz de ICalculator.

    HRESULT Add([in] int a, [in] int b, [out, retval] int* value);
    
  4. En Contoso.cpp, agregue el método de Add a la sección de public de la clase de 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;
    }
    
    Nota importanteImportante

    Dado que está creando un componente COM, recuerde utilizar la convención de llamada de __stdcall.

    Se recomienda usar _Out_ y otras anotaciones de (SAL) del lenguaje de anotación de origen para describir cómo una función utiliza sus parámetros.Las anotaciones SAL también describen valores devueltos.Las anotaciones SAL ejecutan Herramienta de análisis de código de C/C++ para detectar posibles defectos en el código fuente de C y C++.Los errores de codificación más comunes que son notificados por las saturaciones del búfer de la herramienta, memoria no inicializada, puntero NULL desreferenciación, así como las pérdidas de memoria y recursos.

Para utilizar el componente de una aplicación de Tienda Windows que utiliza JavaScript

  1. En Visual Studio, agregue un nuevo proyecto de JavaScript Aplicación en blanco a la solución de Contoso.Asigne al proyecto CalculatorJS.

  2. En el proyecto de CalculatorJS, agregue una referencia al proyecto de Contoso.

  3. En default.html, reemplace la sección de body con estos elementos de la interfaz de usuario:

    <div>
        <input id="a" />
        <input id="b" />
        <p id="result">Result:</p>
        <button onclick="Add()">Add</button>
    </div>
    
  4. En default.js, implemente la función de 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);
    }
    

    [!NOTA]

    En JavaScript, la primera letra del nombre de método se cambia a minúsculas para coincidir con las convenciones de nomenclatura estándar.

Para agregar un evento que se desencadena cuando se calcula un número primo

  1. En Contoso.idl, antes de la declaración de ICalculator, defina el tipo de delegado, PrimeNumberEvent, que proporciona un argumento de int.

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

    Cuando se utiliza la palabra clave de delegate, el compilador MIDL crea una interfaz que contiene un método de Invoke que coincida con la firma del delegado.En este ejemplo, el archivo generado Contoso_h.h define la interfaz de IPrimeNumberEvent, que se utiliza más adelante en este procedimiento.

    MIDL_INTERFACE("3FBED04F-EFA7-4D92-B04D-59BD8B1B055E")
    IPrimeNumberEvent : public IUnknown
    {
    public:
        virtual HRESULT STDMETHODCALLTYPE Invoke( 
            int primeNumber) = 0;
    
    };
    
  2. En la interfaz de ICalculator, defina el evento de PrimeNumberFound.Los atributos de eventadd y de eventremove especifican que el consumidor de la interfaz de ICalculator puede suscribir y anular la suscripción de este evento.

    [eventadd]
    HRESULT PrimeNumberFound(
        [in] PrimeNumberEvent* eventHandler, 
        [out, retval] EventRegistrationToken* eventCookie);
    [eventremove] 
    HRESULT PrimeNumberFound(
        [in] EventRegistrationToken eventCookie);
    
  3. En Contoso.cpp, agregue una variable miembro de privateMicrosoft::WRL::EventSource para administrar los suscriptores de evento e invocar el controlador de eventos.

    EventSource<IPrimeNumberEvent> m_events;
    
  4. En Contoso.cpp, implemente los métodos de add_PrimeNumberFound y de 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);
    }
    

Para provocar el evento cuando se calcula un número primo

  1. En Contoso.cpp, agregue el método de IsPrime a la sección de private de la clase de 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. Modifique el método de Add de Calculator para llamar al método de Microsoft::WRL::EventSource::InvokeAll cuando se calcula un número primo.

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

Para controlar el evento JavaScript

  1. En default.html, modifique la sección de body para incluir un área de texto que contiene los números primos.

    <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. En default.js, modifique la función de Add para controlar el evento de PrimeNumberFound.El controlador de eventos anexa el número primo al área de texto que se definió en el paso anterior.

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

    [!NOTA]

    En JavaScript, los nombres de evento cambian en minúsculas y se anteponen con " ON " para coincidir con las convenciones de nomenclatura estándar.

La ilustración siguiente se muestra la aplicación básica Calculator.

La aplicación de calculadora básica usando JavaScript

Vea también

Conceptos

Biblioteca de plantillas de Windows Runtime C++ (WRL)

Plantilla de proyecto de Biblioteca de clases de WRL

Herramienta de análisis de código de C/C++