Поделиться через


Пошаговое руководство. Создание базового компонента среды выполнения Windows с использованием WRL

Это руководство показывает, как использовать Библиотека шаблонов C++ среды выполнения Windows (WRL) для создания базового компонент Среда выполнения Windows.Компонент добавляет 2 числа и порождение события, когда результат основной.Также в документе показано, как использовать компонент из приложения Магазина Windows, использующего JavaScript.

Обязательные компоненты

Создать базовый компонент Среда выполнения Windows, который добавляет 2 числа

  1. В Visual Studio создайте проект Visual C-++ C - WRLClassLibrary.Документ Шаблон проекта библиотеки классов WRL описывает, как загрузить этот шаблон.Назовите проект Contoso.

  2. В Contoso.cpp и Contoso.idl, замените все вхождения "WinRTClass" на "калькулятор".

  3. В Contoso.idl добавьте метод Add к интерфейсу ICalculator.

    HRESULT Add([in] int a, [in] int b, [out, retval] int* value);
    
  4. В 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

  1. В Visual Studio добавьте новый проект Пустого приложения в решение Contoso JavaScript.Назовите проект CalculatorJS.

  2. В проекте CalculatorJS добавьте ссылку на проект Contoso.

  3. В папке default.html, замените раздел body с этими элементами пользовательского интерфейса.

    <div>
        <input id="a" />
        <input id="b" />
        <p id="result">Result:</p>
        <button onclick="Add()">Add</button>
    </div>
    
  4. В файле 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, первая буква имени метода изменена в нижний регистр в соответствии с стандартным соглашениям об именовании.

Добавить событие, которое вызывается, когда простого числа вычисляется

  1. В 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;
    
    };
    
  2. В интерфейсе ICalculator определите событие PrimeNumberFound.Атрибуты eventadd и eventremove указывают, что объект-получатель может интерфейса ICalculator и подписывание и подписки из этого события.

    [eventadd]
    HRESULT PrimeNumberFound(
        [in] PrimeNumberEvent* eventHandler, 
        [out, retval] EventRegistrationToken* eventCookie);
    [eventremove] 
    HRESULT PrimeNumberFound(
        [in] EventRegistrationToken eventCookie);
    
  3. В Contoso.cpp добавьте переменную-член privateMicrosoft::WRL::EventSource для управления подписчиков событий и вызова обработчика событий.

    EventSource<IPrimeNumberEvent> m_events;
    
  4. В 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);
    }
    

События при простое число будет вычислять

  1. В 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;
    }
    
  2. Измените метод 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

  1. В папке 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>
    
  2. В файле 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 " в соответствии с стандартным соглашениям об именовании.

На следующем рисунке показано простое приложение калькулятора.

Основное приложение "Калькулятор", использующее JavaScript

См. также

Основные понятия

Библиотека шаблонов C++ среды выполнения Windows (WRL)

Шаблон проекта библиотеки классов WRL

Средства анализа кода C ИЛИ C-++ C.