Exemplarische Vorgehensweise: Erstellen einer Basiskomponente für Windows-Runtime mit WRL
Dieses Dokument, wie Windows Runtime C++ Template Library () verwendet WRL um eine grundlegende Windows-Runtime Komponente zu erstellen.Die Komponente werden zwei Zahlen hinzugefügt und löst ein Ereignis aus, wenn das Ergebnis eine Primzahl ist.Dieses Dokument veranschaulicht auch, wie die Komponente von einer Windows Store-App verwendet, die JavaScript verwendet.
Vorbereitungsmaßnahmen
Erfahrung mit Windows Runtime.
Erfahrung mit COM.
So fügen Sie eine einfache Windows-Runtime Komponente erstellen, die zwei Zahlen hinzu
In Visual Studio erstellen Sie ein Projekt Visual C++ WRLClassLibrary.Das Dokument Projektvorlage für WRL-Klassenbibliothek wird beschrieben, wie diese Vorlage heruntergeladen werden.Nennen Sie das Projekt Contoso.
In Contoso.cpp und in Contoso.idl ersetzen Sie alle Instanzen von "WinRTClass" durch "Computer".
In Contoso.idl fügen Sie die Add-Methode der ICalculator-Schnittstelle hinzu.
HRESULT Add([in] int a, [in] int b, [out, retval] int* value);
In Contoso.cpp fügen Sie die Add-Methode dem public-Abschnitt der Calculator-Klasse hinzu.
HRESULT __stdcall Add(_In_ int a, _In_ int b, _Out_ int* value) { if (value == nullptr) { return E_POINTER; } *value = a + b; return S_OK; }
Wichtig Da Sie eine COM-Komponente erstellen, denken Sie daran, die __stdcall Aufrufkonvention zu verwenden.
Es wird empfohlen, _Out_ und andere Anmerkungen der Quellanmerkungssprache (SAL) verwenden, um zu beschreiben, wie eine Funktion seine Parameter verwendet.SAL-Anmerkungen beschreiben auch Werte.SAL-Anmerkungen arbeiten mit C/C++-Codeanalysetool, um mögliche Fehler in C- und C++-Quellcode zu ermitteln.Allgemeine Codierungsfehler, die durch die Tooleinschließungspufferüberläufe gemeldet werden, nicht initialisierter Speicher, NULL-Zeiger dereferenziert und Speicher- und Ressourcenverluste.
Um die Komponente von einer Windows Store-App verwenden, die JavaScript-Dateien
In Visual Studio fügen Sie ein neues Projekt JavaScript Leere App der Contoso Projektmappe hinzu.Nennen Sie das Projekt CalculatorJS.
Im CalculatorJS Projekt fügen Sie einen Verweis auf Contoso Projekt hinzu.
In default.html ersetzen Sie den body-Abschnitt durch diese Benutzeroberflächenelemente:
<div> <input id="a" /> <input id="b" /> <p id="result">Result:</p> <button onclick="Add()">Add</button> </div>
In default.js implementieren Sie die OnClick-Funktion.
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); }
Hinweis In JavaScript wird der erste Buchstabe des Methodennamens in Kleinbuchstaben geändert, um die Standardnamenskonventionen übereinstimmt.
So fügen Sie einem Ereignis, das ausgelöst wird, wenn eine Primzahl abgeleitet ist
In Contoso.idl vor der Deklaration von ICalculator, definieren Sie den Delegattyp, PrimeNumberEvent, der ein int-Argument bereitstellt.
[uuid(3FBED04F-EFA7-4D92-B04D-59BD8B1B055E), version(COMPONENT_VERSION)] delegate HRESULT PrimeNumberEvent(int primeNumber);
Wenn Sie das Schlüsselwort delegate verwenden, erstellt der MIDL-Compiler eine Schnittstelle, die eine Invoke-Methode enthält, das die Signatur dieses Delegaten Übereinstimmung.In diesem Beispiel wird die generierte Datei Contoso_h.h die IPrimeNumberEvent-Schnittstelle, die weiter unten in dieser Prozedur verwendet wird.
MIDL_INTERFACE("3FBED04F-EFA7-4D92-B04D-59BD8B1B055E") IPrimeNumberEvent : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE Invoke( int primeNumber) = 0; };
In der ICalculator-Schnittstelle definieren Sie das PrimeNumberFound-Ereignis.Die eventadd und eventremove-Attribute geben an, dass der Consumer der ICalculator-Schnittstelle abonnieren und von diesem Ereignis kündigen kann.
[eventadd] HRESULT PrimeNumberFound( [in] PrimeNumberEvent* eventHandler, [out, retval] EventRegistrationToken* eventCookie); [eventremove] HRESULT PrimeNumberFound( [in] EventRegistrationToken eventCookie);
In Contoso.cpp fügen Sie eine Membervariable privateMicrosoft::WRL::EventSource hinzu, um die Ereignisabonnenten zu verwalten und den Ereignishandler aufzurufen.
EventSource<IPrimeNumberEvent> m_events;
In Contoso.cpp implementieren Sie die add_PrimeNumberFound und remove_PrimeNumberFound-Methoden.
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); }
Um das Ereignis auslösen, wenn eine Primzahl abgeleitet ist
In Contoso.cpp fügen Sie die IsPrime-Methode dem private-Abschnitt der Calculator-Klasse hinzu.
// 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; }
Ändern Sie die Add-Methode von Calculator, um die Microsoft::WRL::EventSource::InvokeAll-Methode aufrufen kann, wenn eine Primzahl abgeleitet wird.
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; }
Um das - Ereignis von JavaScript verarbeiten
In default.html ändern Sie den body-Abschnitt, um einen Textbereich einzuschließen, der Primzahlen enthält.
<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>
In default.js ändern Sie die Add-Funktion, um das PrimeNumberFound-Ereignis zu behandeln.Der Ereignishandler fügt die Primzahl den Textbereich an, der vom vorherigen Schritt definiert wurde.
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); }
Hinweis In JavaScript werden die Ereignisnamen in Kleinbuchstaben geändert und mit "on" vorangestellt, um die Standardnamenskonventionen übereinstimmt.
In der folgenden Abbildung wird die grundlegende Rechner-App an.
Siehe auch
Konzepte
Windows Runtime C++ Template Library (WRL)