Partilhar via


Instruções passo a passo: criando um componente básico de Tempo de Execução do Windows com WRL

Este documento mostra como usar Biblioteca em Tempo de Execução C++ do Tempo de Execução do WindowsWRL() para criar um componente básico de Tempo de Execução do Windows . O componente adiciona dois números e gerencie um evento quando o resultado é principal. Este documento também demonstra como usar o componente de um aplicativo de Windows Store que usa JavaScript.

Pré-requisitos

Para criar um componente básico de Tempo de Execução do Windows que adiciona dois números

  1. No Visual Studio, crie um projeto do Visual C++ WRLClassLibrary . O documento Modelo de projeto de biblioteca de classes WRL descreve como baixar esse modelo. O nome do projeto Contoso.

  2. Em Contoso.cpp e em Contoso.idl, substituir todas as instâncias de “WinRTClass” por “calculadora”.

  3. Em Contoso.idl, adicione o método de Add à interface de ICalculator .

    HRESULT Add([in] int a, [in] int b, [out, retval] int* value);
    
  4. Em Contoso.cpp, adicione o método de Add a seção de public da classe 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;
    }
    

    Importante

    Como você está criando um componente COM, lembre-se de usar __stdcall que chama a convenção.

    Recomendamos que você use _Out_ e outras anotações (SAL) de idioma da anotação de origem para descrever como uma função usará seus parâmetros. As anotações de SAL também descrevem os valores de retorno. As anotações de SAL funcionam com Ferramenta de análise de código C/C++ para descobrir possíveis falhas no código-fonte de 2.0 C e C++. Os erros de codificação comuns que são relatados pela ferramenta incluem excesso de buffer, memória não inicializadas, ponteiro nulo eliminam, e vazamentos de memória e de recurso.

Para usar o componente de um aplicativo de Windows Store que usa JavaScript

  1. No Visual Studio, adicione um novo projeto de Aplicativo em branco JavaScript à solução de Contoso . O nome do projeto CalculatorJS.

  2. No projeto de CalculatorJS , adicione uma referência ao projeto de Contoso .

  3. Em default.html, substitua a seção de body com esses elementos de interface do usuário:

    <div>
        <input id="a" />
        <input id="b" />
        <p id="result">Result:</p>
        <button onclick="Add()">Add</button>
    </div>
    
  4. Em default.js, implemente a função 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);
    }
    

    Dica

    Em JavaScript, a primeira letra do nome do método é alterada para minúsculas para corresponder as convenções de nomenclatura padrão.

Para adicionar um evento acionado quando um número principal é calculado

  1. Em Contoso.idl, antes de declaração de ICalculator, defina o tipo delegado, PrimeNumberEvent, que fornece um argumento de int .

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

    Quando você usa a palavra-chave de delegate , o compilador de MIDL cria uma interface que contém um método de Invoke que corresponde a assinatura de aquele representante. Neste exemplo, o arquivo gerado Contoso_h.h define a interface de IPrimeNumberEvent , que é usada posteriormente neste procedimento.

    MIDL_INTERFACE("3FBED04F-EFA7-4D92-B04D-59BD8B1B055E")
    IPrimeNumberEvent : public IUnknown
    {
    public:
        virtual HRESULT STDMETHODCALLTYPE Invoke( 
            int primeNumber) = 0;
    
    };
    
  2. Na interface de ICalculator , defina o evento de PrimeNumberFound . Os atributos de eventadd e de eventremove especificam que o consumidor da interface de ICalculator pode assinar e cancelar a assinatura do evento.

    [eventadd]
    HRESULT PrimeNumberFound(
        [in] PrimeNumberEvent* eventHandler, 
        [out, retval] EventRegistrationToken* eventCookie);
    [eventremove] 
    HRESULT PrimeNumberFound(
        [in] EventRegistrationToken eventCookie);
    
  3. Em Contoso.cpp, adicione uma variável de membro de privateMicrosoft::WRL::EventSource para gerenciar os assinantes do evento e invocar o manipulador de eventos.

    EventSource<IPrimeNumberEvent> m_events;
    
  4. Em Contoso.cpp, implementar os métodos de add_PrimeNumberFound e 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 gerar o evento quando um número principal é calculado

  1. Em Contoso.cpp, adicione o método de IsPrime a seção de private da classe 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 o método Add de Calculator para chamar o método Microsoft::WRL::EventSource::InvokeAll quando um número primo é calculado.

    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 tratar o evento de JavaScript

  1. Em default.html, modifique a seção de body para incluir uma área de texto que contém números à esquerda.

    <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. Em default.js, modifique a função de Add para tratar o evento de PrimeNumberFound . O manipulador de eventos anexa o número principal à área de texto que foi definido pela etapa 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);
    }
    

    Dica

    Em JavaScript, os nomes de evento são alterados para minúsculas e é pré-anexado com " ON " acordo com as convenções de nomenclatura padrão.

A ilustração a seguir mostra o aplicativo básico de cálculo.

Aplicativo de calculadora básica usando JavaScript

Consulte também

Conceitos

Biblioteca de Modelos C++ do Tempo de Execução do Windows (WRL)

Modelo de projeto de biblioteca de classes WRL

Ferramenta de análise de código C/C++