Пошаговое руководство. Создание базового компонента среды выполнения Windows с использованием WRL
Это руководство показывает, как использовать Библиотека шаблонов C++ среды выполнения Windows (WRL) для создания базового компонент Среда выполнения Windows.Компонент добавляет 2 числа и порождение события, когда результат основной.Также в документе показано, как использовать компонент из приложения Магазина Windows, использующего JavaScript.
Обязательные компоненты
Взаимодействие с Среда выполнения Windows.
Взаимодействие с модели COM.
Создать базовый компонент Среда выполнения Windows, который добавляет 2 числа
В Visual Studio создайте проект Visual C-++ C - WRLClassLibrary.Документ Шаблон проекта библиотеки классов WRL описывает, как загрузить этот шаблон.Назовите проект Contoso.
В Contoso.cpp и Contoso.idl, замените все вхождения "WinRTClass" на "калькулятор".
В Contoso.idl добавьте метод Add к интерфейсу ICalculator.
HRESULT Add([in] int a, [in] int b, [out, retval] int* value);
В Contoso.cpp добавьте метод Add в раздел public класса 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; }
Важно
Поскольку создании компонентов модели COM, то необходимо использовать соглашение о вызове __stdcall.
Рекомендуется использовать _Out_ и другие заметки (SAL) языка заметки источника, чтобы описать, как функция использует его параметры.Заметки SAL также описываются возвращаемые значения.Заметки SAL работают с Средства анализа кода C ИЛИ C-++ C. для обнаружения возможных дефектов в исходном коде C - C и C-++.Общие ошибки кода, которые включаются в отчеты средством относятся переполнение буфера, использована неинициализированная память, разыменования пустых указателей, а также утечки памяти и ресурсов.
Использовать компонент из приложения Магазина Windows, использующего JavaScript
В Visual Studio добавьте новый проект Пустого приложения в решение Contoso JavaScript.Назовите проект CalculatorJS.
В проекте CalculatorJS добавьте ссылку на проект Contoso.
В папке default.html, замените раздел body с этими элементами пользовательского интерфейса.
<div> <input id="a" /> <input id="b" /> <p id="result">Result:</p> <button onclick="Add()">Add</button> </div>
В файле default.js, реализуйте функцию 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); }
Примечание
В JavaScript, первая буква имени метода изменена в нижний регистр в соответствии с стандартным соглашениям об именовании.
Добавить событие, которое вызывается, когда простого числа вычисляется
В Contoso.idl, перед объявлением ICalculator определите тип делегата PrimeNumberEvent, который предоставляет аргумент int.
[uuid(3FBED04F-EFA7-4D92-B04D-59BD8B1B055E), version(COMPONENT_VERSION)] delegate HRESULT PrimeNumberEvent(int primeNumber);
Если используется ключевое слово delegate, компилятор MIDL создает интерфейс, который содержит метод Invoke, соответствие, сигнатура делегата.В этом примере созданный файл Contoso_h.h определяет интерфейс IPrimeNumberEvent, который используется далее в этой процедуре.
MIDL_INTERFACE("3FBED04F-EFA7-4D92-B04D-59BD8B1B055E") IPrimeNumberEvent : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE Invoke( int primeNumber) = 0; };
В интерфейсе ICalculator определите событие PrimeNumberFound.Атрибуты eventadd и eventremove указывают, что объект-получатель может интерфейса ICalculator и подписывание и подписки из этого события.
[eventadd] HRESULT PrimeNumberFound( [in] PrimeNumberEvent* eventHandler, [out, retval] EventRegistrationToken* eventCookie); [eventremove] HRESULT PrimeNumberFound( [in] EventRegistrationToken eventCookie);
В Contoso.cpp добавьте переменную-член privateMicrosoft::WRL::EventSource для управления подписчиков событий и вызова обработчика событий.
EventSource<IPrimeNumberEvent> m_events;
В Contoso.cpp, реализуйте методы add_PrimeNumberFound и 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); }
События при простое число будет вычислять
В Contoso.cpp добавьте метод IsPrime в раздел private класса 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; }
Измените метод Add класса Calculator для вызова метода Microsoft::WRL::EventSource::InvokeAll, если простого числа вычисляется.
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; }
Обработка события из JavaScript
В папке default.html, измените раздел body для включения текстовой области, содержащего простые числа.
<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>
В файле default.js, измените функцию Add для обработки события PrimeNumberFound.Обработчик событий добавляет простого числа в текстовый участку, определенный предыдущим шагом.
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); }
Примечание
В JavaScript, имена событий изменения в нижний регистр и; их имена предваряются словами с " ON " в соответствии с стандартным соглашениям об именовании.
На следующем рисунке показано простое приложение калькулятора.
См. также
Основные понятия
Библиотека шаблонов C++ среды выполнения Windows (WRL)