Windows desktop runtime что это

Национальная библиотека им. Н. Э. Баумана
Bauman National Library

Персональные инструменты

Microsoft Windows Runtime

Windows Runtime
A component of Microsoft Windows
Details
Other names WinRT
Type API
Included with Microsoft Windows Server 2012,
Microsoft Windows 8,
Microsoft Windows RT,
Microsoft Windows 8.1,
Microsoft Windows Server 2012 R2,
Microsoft Windows 10,
Microsoft Windows Server 2016
Related components
Microsoft Windows Store,
Microsoft Windows API

Windows Runtime (WinRT) − модель программирования от Microsoft, впервые введенную в Windows 8 и Windows Server 2012 в 2012 году. WinRT поддерживает разработку на C++ (обычно с использованием расширения языка Component Extensions, C++/CX), управляемых языках C# и VB.NET, а также JavaScript. Компоненты WinRT разработаны с функциональной совместью между несколькими языками и API-интерфейсов, в том числе родной, управляемый и скриптовый языки.

Windows Phone 8.1 использует версию Windows Runtime под названием Windows Phone Runtime. Это позволяет разрабатывать приложения в C# и VB.NET, а также компоненты Windows Runtime в C++/CX. [1]

Содержание

Технология

Новый C++/CX (Component Extensions) язык, который заимствует часть синтаксиса C++/CLI, позволяет писать и использовать компоненты WinRT с меньшим количеством связующего кода, видимого для программиста, по сравнению с классическим COM программированием на C++, и накладывает меньше ограничений по сравнению с C++/CLI при смешении типов. Компонентные Расширения C++/CX рекомендуются для использования только в API-boundary, а не для других целей. Стандартный C++ также может быть использован для программирования с компонентами WinRT, с помощью Windows Runtime C++ Template Library (WRL), которая аналогична по назначению тому, что Active Template Library обеспечивает COM.

WinRT приложения выполняются в песочнице и требуют прямого разрешения пользователя для доступа к критически важным функциям операционной системы и базового оборудования. Доступ к файлам ограничивается несколькими заранее определенными местами, такими как каталоги, документы или изображения.

Сервисы

Метаданные

Метаданные описывает код, написанный для платформы WinRT. Они определяет модель программирования, которая позволяет писать объектно-ориентированный код, который может быть поделен между языками программирования, а также дает возможность предоставлять сервисы, подобные рефлексии.

Герб Саттер, эксперт по C++ в Microsoft, объяснил во время своей сессии по C++ на конференции Build 2011, что метаданные WinRT это метаданные CLI. Машинный код (т.е. машинный код процессора) не может содержать метаданные и поэтому хранится в отдельных WINMD-файлах, которые могут быть отображенны как обычные CLI сборки.

Так как это метаданные CLI, код, написанный на родном языке WinRT можно использовать с управляемыми CLI языками.

Тип системы

Компоненты WinRT

Интерфейсы программирования

В терминологии WinRT, языковая привязка называется языковой проекцией.

C++ (WRL, Component Extensions)

Пользователи, которые взаимодействуют с другим языком должен иметь подпись с типами WinRT или управляемый тип, который конвертируется.

JavaScript

Приложения WinRT также могут быть закодированы с использованием HTML с JavaScript в code-behind, которые выполнены с помощью движка рендеринга Trident и движока Chakra JavaScript, оба из которых также используются Internet Explorer. При кодировании приложения WinRT в JavaScript, его особенности адаптируются, чтобы следовать схемам наименования JavaScript и пространства имен также отображаются на объекты JavaScript.

WinRT поставляется с интерфейсом прикладного программирования (API) в виде библиотеки классов, который предоставляет возможности Windows 8 для разработчиков,как и его многонаправленный интерфейс API. Он доступен и используется из любого поддерживаемого языка.

Классы Runtime

Классы Windows Runtime представляют собой набор пакетов SDK, которые обеспечивают доступ ко всем функциям из из XAML парсера для функции камеры. В SDK реализованы как родные библиотеки C/C++ (неуправляемые).

Схемы наименования

Ограничения и правила

Поскольку Windows Runtime проецируется на различных языках, некоторые ограничения основных типов данных существуют для того, чтобы разместить все эти языки. Программисты должны быть осторожны с поведением этих типов при использовании с открытым доступом (для параметров метода, метод возвращаемых значений, свойств и т.д.)

История версий

Версия Windows
Windows 8 Windows Runtime
Windows 8.1
Windows 10 Universal Windows Platform (UWP)

Windows Phone Runtime

Начиная с Windows Phone 8 можно разрабатывать приложения, используя версию Windows Runtime, под названием Windows Phone Runtime (WPRT). Несмотря на то,что WP8 принес ограниченную поддержку, платформа действительно в конечном счете сходится с Windows 8.1 в Windows Phone 8.1.

Windows Phone 8

Windows Phone 8.1

Поддержка Windows Runtime на Windows Phone 8.1 сходится с Windows 8.1. Релиз привносит на платформу полный API Windows Runtime, включая поддержку среды выполнения Windows Runtime XAML Framework и привязки к языку для C++/CX и HTML5-JavaScript. Существует также тип проекта под названием Универсальные приложения, позволяющие приложениям совместно использовать код через версии 8.1 Windows Phone и Windows.

Обновлена версия Windows Phone 8 Silverlight Framework. Она может использовать некоторые новые функции в среде выполнения Windows.

Windows Phone Runtime использует формат пакета AppX из Windows 10, ранее использовав Silverlight XAP.

Источник

Перенос настольных приложений в Windows Runtime

В этой статье используется предварительная версия Visual Studio 2012. Любая изложенная здесь информация может быть изменена.

Продукты и технологии:

В статье рассматриваются:

• проблемы, связанные с переносом;

• разделение обязанностей;

• рефакторинг для разъединения повторно используемых компонентов;

• создание XAML-представления приложения;

• применение HTML для UI приложения.

Windows 8 воплощает новую философию дизайна для платформ Microsoft. В Windows 8 можно создавать приложения, использующие такие UI-технологии, как XAML и HTML5. Microsoft предоставляет две новые модели приложений: Windows Runtime Library (WRL), которая помогает разрабатывать приложения Windows Store на C#, Visual Basic и C++, и Windows Library for JavaScript (WinJS), которая позволяет создавать приложения с применением HTML5 и JavaScript.

WRL для Windows 8 означает то же, что инфраструктура Microsoft Foundation Classes (MFC) или «C-подобный» Win32 API для настольной среды. Соответственно существующие настольные приложения нужно адаптировать для выполнения под управлением Windows Runtime. Эта проблема возникает в приложениях, которые сильно зависят от MFC, Win32 или других прикладных инфраструктур. Что произойдет с ними, когда вы будете переносить их на Windows Runtime? Что будет впоследствии? Нужно ли поддерживать две кодовые базы — для планшетов и настольных компьютеров?

В этой статье я покажу, как идентифицировать и вычленять значительные части из кодовой базы приложения, которые можно сделать общими для двух сред. Вы увидите, что такой рефакторинг также является возможностью задействовать некоторые новые средства C++11 для большей лаконичности кода и удобства его сопровождения. Преимуществ гораздо больше, чем простое получение новой Windows Store-версии существующего приложения, — вы также сможете модернизировать кодовую базу существующего приложения.

Дилеммы портируемости

Создать приложение, которое должно быть портируемым и к которому предъявляются другие нефункциональные требования, всегда легче с нуля, заранее продумав соответствующую архитектуру. Однако на практике разработчики приложений часто сталкиваются с непредвиденными требованиями, которые формулируются уже после его развертывания. Удовлетворить эти требования на столь поздних этапах может оказаться проблематичным, если архитектура приложения такова, что реализовать новые средства трудно без переписывания больших частей кодовой базы. Вдобавок новые части могут в конечном счете вывести приложение из производственной среды, если они тщательно не тестировались.

Ввиду этого я решил использовать в качестве примера существующее приложение вместо того, чтобы создавать новую демонстрацию. Как вы увидите, я выбрал пример с MFC-калькулятором, опубликованным Microsoft для Visual Studio 2005 (bit.ly/OO494I).

Поначалу возникает соблазн переписать все приложение, потому что хочется избавиться от кода, поддерживать который у вас нет никакого желания: лучше переделать все с начала, но на этот раз как следует. Однако убедить в этом администрацию не удается, так как это сводит на нет возможность окупить вложенные в исходное приложение средства, если только не оставить его в производственной среде для тех платформ, которые не смогут выполнять новое приложение. В таком случае придется поддерживать две сходные кодовые базы, что увеличивает затраты (двойная работа плюс реализация новых средств или исправление ошибок, например).

Маловероятно, что весь изначальный код можно будет повторно использоваться в разных средах (в данном случае — в настольной Windows и Windows Runtime). Однако, чем больше кода удастся сделать общим, тем меньше будут затраты и тем больше в дальнейшем будет прибыль.

Назад к основам: разделение обязанностей

Разделение обязанностей (separation of concerns, SoC) является сегодня основополагающей концепцией, опубликованной во многих книгах по архитектуре ПО. Одно из естественных следствий заключается в том, что код, относящийся к API, четко группируется (если не сказать, скрывается) в хорошо сегментированные компоненты, которые предлагают абстрактный интерфейс остальному коду. Таким образом, конкретное хранилище данных никогда не делается явно доступным коду, который выполняет логику предметной области, презентационную логику и др. Эти компоненты просто «общаются» с абстрактным интерфейсом.

Концепция SoC в настоящее время широко применяется разработчиками. Как следствие взрывного роста Web в конце 90-х, многие автономные приложения были разбиты на модули, которые потом были распределены по уровням и звеньям.

Если у вас есть приложения, разработанные без учета SoC, их можно перенести в современный мир с помощью рефакторинга. Рефакторинг — хорошая практика, вполне осуществимая в наши дни благодаря широкому принятию правил Agile-разработки, которые способствуют созданию простейших модулей, способных работать, прохождению всех тестов, сокращению времени выхода на рынок с готовым продуктом и прочим вещам. Однако динамичность (agility) оставляет не так много пространства для включения новых каналов, пока это не становится потребностью. Вот мы и подошли к сути.

Типичный сценарий переноса

Пример MFC-приложения, о котором я упоминал, — базовый калькулятор, показанный на рис. 1.


Рис. 1. Microsoft MFC Calculator

Этот пример отлично иллюстрирует процесс переноса по следующим причинам:

Исходный калькулятор содержит два класса: CCalcApp и CCalcDlg. CCalcApp моделирует калькулятор как выполняемый процесс, чья функция InitInstance создает экземпляр CCalcDlg (рис. 2). CCalcDlg моделирует основное окно, его элементы управления (панели и кнопки) и связанные события.


Рис. 2. Диаграмма классов исходного калькулятора-примера (незначимые детали опущены)

CCalcDlg наследует от MFC CDialog и реализует все — от базового сопоставления оконных сообщений до функций и логики калькулятора, запускаемых в ответ на события. На рис. 3 показано, что происходит, когда вы щелкаете кнопку «равно» (предполагается, что перед этим вы ввели два операнда и знак операции). На рис. 4 представлены функции CCalcDlg, расширяющие поведение на всех уровнях: реакции на событие, логики предметной области и презентационном уровне.


Рис. 3. Схема последовательности действий для события щелчка кнопки «равно»

User Пользователь
CCalcDlg CCalcDlg
clicks the button ‘=’ щелкает кнопку «=»
+ OnClickedEqual() + OnClickedEqual()
calculates the pending operation вычисляет ожидающую операцию
# PerformOperation() # PerformOperation()
sets the result to IDE_ACCUM in the UI присваивает результат IDE_ACCUM в UI
# UpdateDisplay() # UpdateDisplay()
> >

Рис. 4. CCalcDlg

Так как CCalcDlg связан с MFC, логику, которую я хочу использовать в Windows Store-версии приложения, нельзя перенести в том виде, как она есть сейчас. Мне потребуется выполнить рефакторинг.

Если у вас есть приложения, разработанные без учета SoC, их можно перенести в современный мир с помощью рефакторинга.

Рефакторинг для разъединения повторно используемых компонентов

Чтобы создать Windows Store-версию этого калькулятора, мне не нужно что-либо кодировать заново. Большую часть поведения вроде того, что показано на рис. 4, можно было бы использовать повторно, если бы оно не было столь тесно увязано с CCalcDlg, основанным на MFC. Я выполню рефакторинг этого приложения так, чтобы повторно используемые части (в данном случае — поведение калькулятора) были изолированы от компонентов, специфичных для конкретной реализации.

Я буду предполагать, что вы не только слышали об архитектурном шаблоне Model-View-Controller (MVC), но и применяли его. Поэтому здесь я лишь напомню, что Model состоит из объектов предметной области (как с поддержкой состояния, так и без) и ничего не знает о технологии View (она ему безразлична). View реализуется как одна из технологий взаимодействия с пользователем (HTML, Qt, MFC, Cocoa и др.), подходящих для устройства, на котором работает приложение. Он не знает, как реализована логика предметной области; его функция заключается только в отображении структур данных предметной области или их частей. Controller выступает в роли посредника, захватывая пользовательский ввод для инициации соответствующих операций в предметной области и тем самым заставляя View обновляться и отражать более новое состояние.

На рис. 5 приведена модифицированная версия MFC-приложения.


Рис. 5. Пространство имен Calculator::View консолидирует поведение View в сопоставленном с ним Presentation Model

CalculatorPresentationModel хранит ссылку на это View (моделируется как интерфейс ICalculatorView), потому что, как только обнаруживается, что состояние View изменилось, вызывается функция UpdateDisplay. В MFC-примере таким View является сам CCalcDlg, так как это класс, имеющий дело непосредственно с MFC.

CCalcDlg создает свой Presentation Model в конструкторе:

Смарт-указатели позволяют освобождать объект, на который они ссылаются, когда необходимости в нем больше нет.

Как видите, я использовал здесь смарт-указатель C++11 под названием unique_ptr (детали см. по ссылке bit.ly/KswVGy). Смарт-указатели (smart pointers) позволяют освобождать объект, на который они ссылаются, когда необходимости в нем больше нет. В моем случае смарт-указатель гарантирует, что Presentation Model будет уничтожен по завершении жизненного цикла View. View захватывает оконные события, делегирует ввод в Presentation Model с обработкой или без, как показано на рис. 6.

Рис. 6. Некоторые функции View, показывающие делегирование

Вы найдете эту переработанную версию MFC-примера в папке mfccalc в пакете исходного кода, который можно скачать для этой статьи. Вероятно, вы заметили, что Model нет. В этом примере логика предметной области заключена в классе, содержащем функции для четырех элементарных арифметических операций, и выглядит примерно так, как показано на рис. 7.

Исключение, генерируемое Model, является крайней мерой, когда ничто другое не доступно.

Рис. 7. Чистая реализация, которая включает Calculator «Model»

Я решил опустить Model в этом небольшом примере, оставив его логику в Presentation Model. Это не типично в большинстве случаев, и логику Model нужно реализовать в своем классе или наборе классов. Если хотите, можете в качестве упражнения выполнить рефакторинг этого примера, придерживаясь пуристского подхода. На случай, если решите этим заняться, обращайте особое внимание на реализацию функции CalculatorModel::Divide, так как Model — повторно используемый компонент, который можно было бы вызывать откуда-то автоматически, а не в результате взаимодействия с пользователем. Тогда не имело бы значения, что деление на ноль генерирует исключение; в этот момент это была бы неожиданная ситуация. Но вам не следует удалять из Presentation Model проверку деления на ноль. Предотвращение пересылки ошибочных данных на внутренние уровни всегда является здравой идеей. Исключение, генерируемое Model, является крайней мерой, когда ничто другое не доступно.

Идем дальше. Запустите переработанное решение mfccalc в пакете сопутствующего кода и вы заметите, что оно по-прежнему ведет себя так же, как и раньше. А мне как раз это и нужно: подготовить код к переносу без потери функциональности. В серьезном процессе рефакторинга следует подумать о наборе автоматизированных тестов, чтобы проверять, не было ли как-то затронуто поведение приложения. Модульное тестирование неуправляемого кода доступно в Visual Studio 2012 и всех ее редакциях для разработчиков, включая бесплатную редакцию Express for Windows 8 (которая, однако, не поставляется с MFC или другими инфраструктурами для разработки настольных приложений).

Взгляните на решение Calculator\CalculatorTests в сопутствующем коде. Пространство имен Calculator::Testing содержит класс PresentationModelTest, методы которого тестируют таковые в классе CalculatorPresentationModel, как показано на рис. 8.

Рис. 8. Изоляция ошибок с помощью модульного тестирования неуправляемого кода

Кстати, модульное тестирование — одно из наиболее ценных преимуществ этого шаблона Presentation Model: тесты поведения UI автоматизируются так же, как и для логики предметной области, которую в этом примере я встроил в Presentation Model. Таким образом, вы можете открыть новые каналы для своего приложения (например, Cocoa, Qt, wxWidgets или даже управляемые инфраструктуры вроде HTML5 или Windows Presentation Foundation) с уверенностью, что ошибки, если таковые есть, возникают в новых компонентах для взаимодействия с пользователем, а не в существующих. Вы можете задействовать функцию анализа охвата кода тестами (code coverage feature), чтобы быть уверенным, что все строки кода проверяются хотя бы раз.

Открытие XAML-фасада приложению-калькулятору

После рефакторинга кода я готов создать новый Windows UI для MFC-калькулятора. С этой целью достаточно создать новый View для шаблона Presentation Model, описанного ранее.

Windows 8 предлагает три технологии UI: XAML, HTML и DirectX.

Чтобы создать XAML-представление, я выбрал базовый шаблон Blank App из списка шаблонов Visual C++ для Windows 8 и создал проект XamlCalc.

Этот шаблон содержит пустой файл MainPage.xaml, который я заполню элементами управления, чтобы создать эквивалент для Windows 8 вместо прежнего CCalcDlg в MFC-версии. Это все, что нужно для переноса приложения-калькулятора, потому что оно состоит из одного окна и в нет нужды в средствах навигации. При переносе своего приложения вам стоит подумать о других шаблонах, обеспечивающих механизм навигации между страницами. Соответствующее руководство вы найдете на странице «Designing UX for Apps» (bit.ly/Izbxky).

Вы можете вызывать компоненты на основе C++ из кода на JavaScript.

Пустой шаблон также включает файл App.xaml, аналогичный по назначению классу CCalcApp в MFC-версии (рис. 2). Это стартовый загрузчик, который инициализирует остальные компоненты и передает им управление. Функция CCalcApp::InitInstance создает окно CCalcDlg, которое потом служит в качестве UI. (Все это вы увидите в решении XamlCalc в сопутствующем коде.) В случае XAML App::OnLaunched генерируется по умолчанию в файле отделенного кода, App.xaml.cpp, и инициирует начальный переход в MainPage:

С помощью встроенного в Visual Studio редактора XAML я создаю страницу калькулятора, перетаскивая элементы управления из окна инструментария и выполняя кое-какие операции вручную, связанные, в частности, с пользовательскими стилями, связыванием с данными, сопоставлением событий и т. д. В итоге XAML-код выглядит, как показано на рис. 9, а сам калькулятор — как представлено на рис. 10.

Рис. 9. XAML-версия MFC-калькулятора


Рис. 10. Внешний вид XAML-калькулятора

Я определил стиль кнопок (для цифр и операций) в App.xaml, поэтому мне не нужно заново назначать цвета, шрифты, выравнивание и другие свойства для каждой кнопки. Аналогично я сопоставил обработчики событий со свойством Click каждой кнопки; обработчики являются MainPage-методами, определенными в файле отделенного кода MainPage.xaml.cpp. Ниже я привожу пару примеров (один для нажатых цифр, а другой для операции деления):

Как видите, эти методы на C++/CX в MainPage просто принимают информацию событий и передают ее экземпляру моего класса на стандартном C++, CalculatorPresentationModel, для выполнения реальных действий в UI. Это демонстрирует возможность заимствования логики на стандартном C++ из существующих неуправляемых приложений и ее повторного использования в совершенно новом приложении Windows Store на C++/CX. Такая возможность сокращает расходы на сопровождение обеих версий, так как обе могут использовать любые обновления в общих компонентах — в данном случае в CalculatorPresentationModel.

К компонентам, специфичным для конкретной реализации, можно обращаться из общих компонентов, если они реализуют четко определенные абстрактные интерфейсы. Так, в моем примере CalculatorPresentationModel::UpdateDisplay делегирует реальную работу экземпляру ICalculatorView:

В MFC-версии ICalculatorView реализуется классом CCalcDlg на основе MFC. Взгляните на переработанную схему на рис. 11 и сравните ее с исходной на рис. 3.


Рис. 11. Схема последовательности действий для события щелчка кнопки «равно» в разъединенной MFC-версии

User Пользователь
CCalcDlg CCalcDlg
presentationModel : CalculatorPresentationModel presentationModel : CalculatorPresentationModel
clicks the button ‘=’ щелкает кнопку «=»
+ OnClickedEqual() + OnClickedEqual()
ClickedOperator(OpNone) ClickedOperator(OpNone)
— PerformOperation() — PerformOperation()
# UpdateDisplay() # UpdateDisplay()
+ GetValue() + GetValue()
> >
> >

Чтобы сохранить XAML-версию аналогичной MFC-версии, я не должен был бы реализовать ICalculatorView в MainPage. Вместо этого мне следовало бы реализовать ICalculatorView как отдельный класс, потому что MainPage является классом C++/CX и поэтому не может наследовать от стандартного класса на C++. C++ и его проекция в Windows Runtime (C++/CX) имеют разные системы типов, которые в любом случае корректно взаимодействуют. Реализовать чистый C++-интерфейс ICalculatorView — задача несложная:

Итак, классы стандартного C++ и C++/CX не могут наследовать друг от друга, но могут хранить ссылки друг на друга; в данном случае это закрытый член page_, который является ссылкой на C++/CX MainPage. Чтобы обновить дисплей в XAML-версии, я просто изменяю в MainPage.xaml свойство Text элемента управления TextBlock с именем display_:

На рис. 12 показана схема классов в XAML-калькуляторе.


Рис. 12. Схема классов в приложении-калькуляторе на XAML и C++/CX

На рис. 13 представлена схема, соответствующая последовательности действий при щелчке кнопки «равно» в XAML-версии.


Рис. 13. Схема последовательности действий для события щелчка кнопки «равно» в XAML-версии

User Пользователь
CalcView CalcView
MainPage (C++/CX) MainPage (C++/CX)
presentationModel : CalculatorPresentationModel presentationModel : CalculatorPresentationModel
clicks the button ‘=’ щелкает кнопку «=»
+ ClickedOperator(OpNone) + ClickedOperator(OpNone)
— PerformOperation() — PerformOperation()
+ UpdateDisplay() + UpdateDisplay()
+ GetValue() + GetValue()
> >
> >

Следует отметить, что WRL интенсивно использует асинхронность во всех своих API для обработки событий. Однако мой код синхронный на 100%. Я мог бы сделать его асинхронным, используя Parallel Patterns Library, которая реализует задачи и продолжения на основе концепций асинхронности Windows 8. Это не было бы оправданным в моем маленьком примере, но вам стоит почитать страницу «Asynchronous Programming in C++» в Windows Developer Center (bit.ly/Mi84D1).

Нажмите F5 и запустите приложение, чтобы увидеть XAML-версию в действии. При переносе или создании приложений Windows Store важно проектировать их UI на основе новых проектировочных шаблонов Windows Experience, описанных в Microsoft Dev Center (bit.ly/Oxo3S9). Следуйте рекомендованным шаблонам для поддержки команд, сенсорного ввода, перевернутой ориентации, значков (charms) и прочего, чтобы ваше приложение было интуитивно понятным пользователям-новичкам.

Другой пример: калькулятор с новым Windows UI с применением HTML

Пример с XAML достаточен, чтобы получить начальный пример калькулятора на основе MFC, способный работать в Windows 8. Однако при определенных обстоятельствах (например, с учетом общей квалификации вашей группы или для использования существующих ресурсов) можно подумать о применении для UI вместо XAML пары «HTML-JavaScript».

Проектировочный шаблон Presentation Model, описанный в этой статье, по-прежнему будет полезен, даже если ваш UI содержит логику, написанную на языке, отличном от C++, например на JavaScript. Это чудо возможно благодаря тому, что в среде Windows 8 JavaScript проецируется на Windows Runtime во многом аналогично C++, что позволяет этим языкам взаимодействовать, поскольку они совместно используют систему типов, устанавливаемую WRL.

В сопутствующем коде вы найдете решение HtmlCalc, которое содержит страницу default.html, похожую на MainPage.xaml. На рис. 14 показано описание UI, сравнимое с XAML-версией, представленной на рис. 9.

Рис. 14. HTML-разметка для UI калькулятора

Роль отделенного кода в HTML-страницах играет JavaScript-код. Действительно вы обнаружите такой код в файле js\default.js. Мой CalculatorPresentationModel нельзя напрямую вызывать из JavaScript из-за того, что это класс на стандартном C++, но можно делать это косвенно, через промежуточный компонент на C++/CX — Calculator::View::CalcView.

Чтобы создать экземпляр этого компонента из JavaScript достаточно объявить в default.js следующее:

В качестве примера этого подхода вы увидите, что щелчок кнопки «равно» приводит к вызову следующей JavaScript-функции:

Вызов продвигается в CalcView::equal_click, который «на равных общается» с моим CalculatorPresentationModel на стандартном C++:

В этом конкретном сценарии компонент CalcView на C++/CX просто пересылает каждый запрос в PresentationModel на стандартном C++ (рис. 15). Но избавиться от него на пути к повторно используемому C++-компоненту нельзя.


Рис. 15. Схема последовательности действий для события щелчка кнопки «равно» в гибридной версии HTML-C++

User Пользователь
default page : HTML/JavaScript страница по умолчанию: HTML/JavaScript
nativeBridge : CalcView (C++/CX) nativeBridge : CalcView (C++/CX)
presentationModel : CalculatorPresentationModel presentationModel : CalculatorPresentationModel
Equal_Click() Equal_Click()
ClickedOperator(OpNone) ClickedOperator(OpNone)
PerformOperation() PerformOperation()
get_display() get_display()
GetValue() GetValue()
> >
> >
> >

Так как прокси на C++/CX нужно создать вручную, не следует игнорировать связанные с этим издержки. Тем не менее, издержки можно сбалансировать с преимуществами повторного использования компонентов, как это делаю я в сценарии с CalculatorPresentationModel.

Нажмите F5, чтобы увидеть HTML-версию в действии. Я показал, как повторно использовать существующий код на C++ для его переноса в новейшую инфраструктуру в Windows 8 без отказа от исходных каналов (MFC, в моем случае). Теперь мы готовы сформулировать некоторые заключительные соображения.

«Здравствуй, настоящий мир!»

Мой сценарий переноса является частным случаем, который может не совпасть с вашим, а ваш — с чьим-то еще. Многое из того, что я показал здесь, применимо к сценарию с MFC Calculator, и я мог бы принять другие решения, если бы переносил в WRL другое приложение. Однако можно сделать ряд общих заключений по переносу приложений.

Шаблон Presentation Model отлично подходит для поддержания бесперебойной работы приложений и минимизации расходов на сопровождение.

Пара слов в заключение

Новая Windows Runtime и по-прежнему вездесущая настольная Windows бросают вызов разработчикам, которые не хотят расплачиваться дополнительными издержками на сопровождение отдельных приложений для каждой платформы. На протяжении всей статьи я демонстрировал, что существующие кодовые базы можно использовать не только для открытия новых каналов, но и для их улучшения за счет рефакторинга.

Диего Дагум (Diego Dagum)архитектор ПО и тренер, имеющий более чем двадцатилетний опыт работы в индустрии программного обеспечения. С ним можно связаться по адресу email@diegodagum.com.

Выражаю благодарность за рецензирование статьи экспертам Мариусу Бансилу (Marius Bancila), Анхелю Хесусу Эрнандесу (Angel Jesus Hernandez) и группе Windows 8.

Источник

Понравилась статья? Поделиться с друзьями:

Не пропустите наши новые статьи:

  • Windows desktop gadgets что это
  • Windows deployment tools что это
  • windows deployment services что это
  • Windows defender что это
  • windows defender что это такое

  • Операционные системы и программное обеспечение
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest
    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии