Procedura dettagliata: creazione di un componente Windows Runtime di base mediante WRL
In questo documento viene illustrato come utilizzare Libreria di modelli di Windows Runtime C++ (WRL) per creare un componente di base Windows Runtime.Il componente somma due numeri e genera un evento quando il risultato è un numero primo.Questo documento inoltre illustra come generare eventi e utilizzare il componente da un'applicazione Windows Store che utilizza JavaScript.
Prerequisiti
Esperienza con Windows Runtime.
Esperienza con COM.
Per creare un componente di base Windows Runtime che somma due numeri
In Visual Studio, creare un progetto Visual C++ WRLClassLibrary.Il documento Modello di progetto di libreria di classi di WRL descrive come scaricare questo modello.Nome del progetto Contoso.
In Contoso.cpp e in Contoso.idl, sostituire tutte le istanze di "WinRTClass" con "Calcolatrice".
In Contoso.idl, aggiungere il metodo Add all'interfaccia ICalculator.
HRESULT Add([in] int a, [in] int b, [out, retval] int* value);
In Contoso.cpp aggiungere il metodo Add alla sezione public della 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; }
Importante Poiché si crea un componente COM, è necessario utilizzare la convenzione di chiamata __stdcall.
È consigliabile utilizzare _Out_ e altre annotazioni (SAL) di linguaggio di annotazione di origine per descrivere come una funzione utilizza i parametri.Le annotazioni SAL inoltre descrivono i valori restituiti.Le annotazioni SAL utilizzano Strumento di analisi del codice C/C++ per individuare i possibili errori nel codice sorgente C e C++.Gli errori di codifica più comuni segnalati dallo strumento includono i sovraccarichi del buffer, l'annullamento dell'inizializzazione della memoria, le dereferenziazioni al puntatore null e le perdite di memoria e risorse.
Per utilizzare il componente da un'applicazione Windows Store che utilizza JavaScript
In Visual Studio, aggiungere un nuovo progetto JavaScript Applicazione vuota alla soluzione Contoso.Assegnazione del nome CalculatorJS al progetto.
Nel progetto CalculatorJS, aggiungere un riferimento al progetto Contoso.
In default.html, sostituire la sezione body con questi elementi dell'interfaccia utente:
<div> <input id="a" /> <input id="b" /> <p id="result">Result:</p> <button onclick="Add()">Add</button> </div>
Nel file default.js, implementare la funzione 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]
In JavaScript, la prima lettera del nome di un metodo viene modificata in lettere minuscole per soddisfare le convenzioni di denominazione standard.
Per generare un evento quando un numero primo viene calcolato
In Contoso.idl, prima della dichiarazione di ICalculator, definire il tipo delegato, PrimeNumberEvent, che fornisce un argomento int.
[uuid(3FBED04F-EFA7-4D92-B04D-59BD8B1B055E), version(COMPONENT_VERSION)] delegate HRESULT PrimeNumberEvent(int primeNumber);
Quando si utilizza la parola chiave delegate, il compilatore MIDL crea un'interfaccia contenente un metodo Invoke che corrisponde alla firma del delegato.In questo esempio, il file generato Contoso_h.h definisce l'interfaccia IPrimeNumberEvent, utilizzata più avanti in questa procedura.
MIDL_INTERFACE("3FBED04F-EFA7-4D92-B04D-59BD8B1B055E") IPrimeNumberEvent : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE Invoke( int primeNumber) = 0; };
Nell'interfaccia ICalculator, definire l'evento PrimeNumberFound.Gli attributi eventremove e eventadd specificano che l'utente dell'interfaccia ICalculator può sia iscriversi sia cancellarsi da questo evento.
[eventadd] HRESULT PrimeNumberFound( [in] PrimeNumberEvent* eventHandler, [out, retval] EventRegistrationToken* eventCookie); [eventremove] HRESULT PrimeNumberFound( [in] EventRegistrationToken eventCookie);
In Contoso.cpp, aggiungere una variabile membro privateMicrosoft::WRL::EventSource per gestire gli eventi sottoscritti e invocare il gestore degli eventi.
EventSource<IPrimeNumberEvent> m_events;
In Contoso.cpp, implementare i metodi remove_PrimeNumberFound e add_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); }
Per generare l'evento quando un numero primo viene calcolato
In Contoso.cpp aggiungere il metodo IsPrime alla sezione private della 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; }
Modificare il metodo Calculator’s Add per chiamare il metodo Microsoft::WRL::EventSource::InvokeAll quando un numero primo viene calcolato.
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; }
Per gestire l'evento con JavaScript
In default.html, modificare la sezione body per includere un'area di testo che contenga i numeri primi.
<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>
Nel file default.js, modificare la funzione Add per gestire l'evento PrimeNumberFound.Il gestore eventi aggiunge il numero primo all'area di testo definita nel passaggio precedente.
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]
In JavaScript, i nomi degli eventi vengono convertiti in minuscolo e vengono anteposti da "on" per soddisfare le convenzioni di denominazione standard.
Di seguito viene illustrata l'applicazione di Calculator di base.
Vedere anche
Concetti
Libreria di modelli di Windows Runtime C++ (WRL)