Wskazówki: tworzenie podstawowego składnika środowiska wykonawczego systemu Windows za pomocą biblioteki WRL
Ten dokument pokazuje sposób używania Biblioteka szablonów C++ środowiska wykonawczego systemu Windows (WRL) do utworzenia podstawowego Środowisko wykonawcze systemu Windows składnika.Składnik dodaje dwie liczby i wywołuje zdarzenie, gdy wynik jest zachodniej.W tym dokumencie przedstawiono także jak używać składnika z Windows Store aplikacja, która wykorzystuje JavaScript.
Wymagania wstępne
Doświadczenie z obsługi Windows.
Doświadczenia z modelu COM.
Aby utworzyć podstawowe Środowisko wykonawcze systemu Windows składnika, która dodaje dwie liczby
Utwórz Visual C++ w Visual Studio, WRLClassLibrary projektu.Dokument Szablon projektu biblioteki klas WRL w tym artykule opisano sposób pobierania tego szablonu.Nazwa projektu Contoso.
W Contoso.cpp i Contoso.idl należy zastąpić wszystkie wystąpienia "WinRTClass" z "Kalkulatora".
W Contoso.idl, dodać Add metodę w celu ICalculator interfejsu.
HRESULT Add([in] int a, [in] int b, [out, retval] int* value);
W Contoso.cpp, dodać Add metodę w celu public sekcji Calculator klasy.
HRESULT __stdcall Add(_In_ int a, _In_ int b, _Out_ int* value) { if (value == nullptr) { return E_POINTER; } *value = a + b; return S_OK; }
Ważne
Ponieważ tworzysz składnika modelu COM, należy stosować __stdcall konwencji wywoływania.
Firma Microsoft zaleca użycie _Out_ i inne źródła adnotacji języka (SAL) adnotacji do opisywania, jak funkcja wykorzystuje jego parametry.Adnotacje SAL również opisać zwracane wartości.Adnotacje SAL pracować z Narzędzie do analizy kodu C/C++ do wykrywania ewentualnych wad w C i C++ kod źródłowy.Najczęstszych błędów kodowania, które zostały zgłoszone przez narzędzie należą przepełnienia bufora, niezainicjowanej pamięci, rozstrzyga pusty wskaźnik i przecieków pamięci i zasobów.
Aby użyć składnika z Windows Store aplikacja, która wykorzystuje JavaScript
W programie Visual Studio, dodawanie nowego skryptu JavaScript Puste App projekt Contoso rozwiązanie.Nazwa projektu CalculatorJS.
W CalculatorJS projektu, Dodaj odwołanie do Contoso projektu.
W default.html, Zastąp body sekcji z tych elementów interfejsu użytkownika:
<div> <input id="a" /> <input id="b" /> <p id="result">Result:</p> <button onclick="Add()">Add</button> </div>
W default.js, wdrożyć OnClick funkcji.
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); }
[!UWAGA]
W języku JavaScript pierwszej litery nazwy metody ulega zmianie do małe litery, aby dopasować standardowymi konwencjami nazewnictwa.
Aby dodać wydarzenie, które działają, gdy liczba jest obliczana
W Contoso.idl przed deklaracji ICalculator, zdefiniować typ delegata, PrimeNumberEvent, który zapewnia int argument.
[uuid(3FBED04F-EFA7-4D92-B04D-59BD8B1B055E), version(COMPONENT_VERSION)] delegate HRESULT PrimeNumberEvent(int primeNumber);
Podczas korzystania z delegate słowa kluczowego, kompilator MIDL tworzy interfejs, który zawiera Invoke metodę, która pasuje do podpisu to pełnomocnik.Wygenerowany plik Contoso_h.h definiuje w tym przykładzie IPrimeNumberEvent interfejs, który jest używany w dalszej części tej procedury.
MIDL_INTERFACE("3FBED04F-EFA7-4D92-B04D-59BD8B1B055E") IPrimeNumberEvent : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE Invoke( int primeNumber) = 0; };
W ICalculator interfejs, zdefiniuj PrimeNumberFound zdarzenia.eventadd i eventremove atrybuty określić, że konsumenta o ICalculator interfejsu można subskrybować i Anuluj subskrypcję tego zdarzenia.
[eventadd] HRESULT PrimeNumberFound( [in] PrimeNumberEvent* eventHandler, [out, retval] EventRegistrationToken* eventCookie); [eventremove] HRESULT PrimeNumberFound( [in] EventRegistrationToken eventCookie);
W Contoso.cpp, dodać privateMicrosoft::WRL::EventSource zmienną do obsługi subskrybentów zdarzeń i wywołać programu obsługi zdarzeń.
EventSource<IPrimeNumberEvent> m_events;
W Contoso.cpp, wdrożyć add_PrimeNumberFound i remove_PrimeNumberFound metody.
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); }
Aby podnieść zdarzenie, kiedy liczba pierwsza jest obliczana.
W Contoso.cpp, dodać IsPrime metodę w celu private sekcji Calculator klasy.
// 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; }
Modyfikowanie Calculatorw Add metodę wywoływaną w Microsoft::WRL::EventSource::InvokeAll metod, jeżeli liczba jest obliczana.
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; }
Do obsługi zdarzeń z kodu JavaScript
W default.html, zmodyfikuj body sekcji, aby zawierać obszar tekstowy, który zawiera liczby pierwsze.
<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>
Zmodyfikuj w default.js, Add funkcja radzić sobie z PrimeNumberFound zdarzenia.Obsługa zdarzeń dołącza liczba pierwsza do obszaru tekstu, który został zdefiniowany za poprzedni krok.
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); }
[!UWAGA]
W języku JavaScript nazwy zdarzenia są zmieniane na małą i są poprzedzone "on" odpowiadający standardowymi konwencjami nazewnictwa.
Na poniższej ilustracji przedstawiono podstawowe aplikacji Kalkulator.
Zobacz też
Koncepcje
Biblioteka szablonów języka C++ środowiska wykonawczego systemu Windows (WRL)