Compartilhar 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 gera um evento quando o resultado é principal.Este documento também demonstra como usar o componente de um aplicativo de Windows Store que usa o 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 Visual C++ WRLClassLibrary .O documento Modelo de projeto de biblioteca de classes WRL descreve como baixar esse modelo.Nomeie o projeto Contoso.

  2. Em Contoso.cpp e em Contoso.idl, substitua todas as ocorrências de “WinRTClass” a” a “calculadora.

  3. Em Contoso.idl, adicione o método de Add a 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 à 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;
    }
    
    Observação importanteImportante

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

    Recomendamos que você usa _Out_ e outras anotações de (SAL) de linguagem de anotação de origem para descrever como uma função usa seus parâmetros.As anotações de SAL também descrevem valores de retorno.As anotações de SAL funcionam com Ferramenta de análise de código de C/C++ para descobrir defeitos possíveis no código-fonte do c e C++.Erros de codificação comuns que são relatados pela ferramenta incluem estouros de buffer memória, não inicializada, ponteiro zero desreferenciam, e vazamentos de memória e de recurso.

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

  1. No Visual Studio, adicione um novo projeto de Aplicativo em branco Javascript para a solução de Contoso .Nomeie o 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 de 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);
    }
    
    ObservaçãoObservação

    No Javascript, a primeira letra de um nome do método é alterada para minúsculas para combinar as convenções de nomenclatura padrão.

Para adicionar um evento que acione quando um número principal é calculado

  1. Em Contoso.idl, antes da 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 corresponda à assinatura do representante.Nesse exemplo, o arquivo gerado Contoso_h.h define a interface de IPrimeNumberEvent , que é usado 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 .Atributos de eventadd e de eventremove especificam que o consumidor da interface de ICalculator pode assinar a e desinscreva-se desse evento.

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

    EventSource<IPrimeNumberEvent> m_events;
    
  4. Em Contoso.cpp, implementar 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 à 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 manipular o evento do Javascript

  1. Em default.html, modifique a seção de body para incluir uma área de texto que contém 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. Em default.js, modifique a função de Add para manipular o evento de PrimeNumberFound .O manipulador de eventos anexa o número de chave para a área de texto que foi definida 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);
    }
    
    ObservaçãoObservação

    No Javascript, os nomes de evento são alterados para minúsculas e prepended com " ON " coincidir com as convenções de nomenclatura padrão.

A ilustração a seguir mostra o aplicativo básico da calculadora.

O aplicativo Calculadora básico 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 de C/C++