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
Experiência com Tempo de Execução do Windowso.
Experiência com o.
Para criar um componente básico de Tempo de Execução do Windows que adiciona dois números
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.
Em Contoso.cpp e em Contoso.idl, substituir todas as instâncias de “WinRTClass” por “calculadora”.
Em Contoso.idl, adicione o método de Add à interface de ICalculator .
HRESULT Add([in] int a, [in] int b, [out, retval] int* value);
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
No Visual Studio, adicione um novo projeto de Aplicativo em branco JavaScript à solução de Contoso . O nome do projeto CalculatorJS.
No projeto de CalculatorJS , adicione uma referência ao projeto de Contoso .
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>
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
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; };
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);
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;
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
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; }
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
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>
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.
Consulte também
Conceitos
Biblioteca de Modelos C++ do Tempo de Execução do Windows (WRL)