Установка на основе пользователя — руководство для разработчиков

Установка на основе пользователя (UDI) помогает упростить развертывание клиентских операционных систем Windows®, таких как Windows 8.1, на компьютерах с помощью функции развертывания операционной системы (OSD) в Майкрософт ® System Center 2012 R2 Configuration Manager. UDI входит в состав набора средств развертывания Майкрософт (MDT).

Введение

Как правило, при развертывании операционных систем с помощью функции OSD необходимо предоставить все необходимые сведения для развертывания операционной системы. Сведения настраиваются в файлах конфигурации или в базах данных (например, в файле CustomSettings.ini или базе данных MDT [MDT DB]). Перед началом развертывания необходимо указать все параметры конфигурации.

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

Целевая аудитория

Это руководство предназначено для разработчиков, которые создают настраиваемые страницы мастера для мастера UDI и пользовательские редакторы страниц мастера для конструктора мастера UDI. В этом руководстве предполагается, что вы знакомы с разработкой приложений Windows с помощью:

  • C++, который используется для создания настраиваемых страниц мастера

  • Майкрософт платформа .NET Framework, который используется для создания пользовательских редакторов страниц мастера

  • Windows Presentation Foundation (WPF), который используется для создания пользовательских редакторов страниц мастера

  • Языки, поддерживаемые WPF, такие как C#, C++ или Майкрософт Visual Basic® .NET, которые используются для создания пользовательских редакторов страниц мастера

Сведения об этом руководстве

В этом руководстве содержатся необходимые справочные сведения, которые помогут вам настроить UTI для организации. В этом руководстве не рассматриваются административные или операционные разделы, такие как установка MDT (включая UDI), настройка UDI для развертывания операционных систем и приложений или выполнение развертываний с помощью мастера UDI. Дополнительные сведения об этих темах см. в разделах UDI в статье Использование набора средств развертывания Майкрософт, который входит в состав MDT.

Обзор разработки UDI

Разработка UDI позволяет расширить возможности, предоставляемые UDI. Как правило, разработка UDI требуется, если требуется собрать дополнительные сведения, используемые процессом развертывания UDI. Эти дополнительные сведения обычно сохраняются в виде переменных последовательности задач, которые последовательности задач в последовательности задач UDI Configuration Manager считываются.

Архитектура UDI

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

На рисунке 1 показана связь между конструктором мастера UDI и мастером UDI.

Рис. 1. Связь между мастером UDI и конструктором мастера UDI рис. 1. Связь между мастером UDI и конструктором мастера UDI

Рис. 1. Связь между мастером UDI и конструктором мастера UDI

На концептуальном уровне разработка UDI включает в себя создание:

  • Настраиваемые страницы мастера. Страницы мастера отображаются в мастере UDI и собирают сведения, необходимые для завершения процесса развертывания. Страницы мастера создаются с помощью C++ в Майкрософт Visual Studio®. Настраиваемые страницы мастера реализуются в виде библиотек DLL, которые считывает мастер UDI. Пакет SDK для UDI содержит пример создания пользовательских страниц мастера.

  • Редакторы страниц пользовательского мастера. Для настройки поведения настраиваемой страницы мастера используются редакторы страницы мастера. Пользовательские редакторы страниц мастера реализуются в виде библиотек DLL, которые считывает конструктор мастера UDI. Редакторы страниц мастера создаются с помощью:

    • WPF версии 4.0

    • Майкрософт Prism версии 4.0

    • Майкрософт Unity Application Block (Unity) версии 2.1

      MDT включает все сборки, необходимые для создания пользовательского редактора страниц мастера для использования в конструкторе мастера UDI. Пакет SDK для UDI содержит пример создания пользовательских редакторов страниц мастера.

    Кроме того, конструктор мастера UDI использует вспомогательные файлы конфигурации редактора страниц мастера. Файлы конфигурации редактора страниц мастера создаются как часть процесса создания настраиваемых страниц мастера и пользовательских редакторов страниц мастера. Конструктор мастера UDI создает необходимые XML-данные в файле конфигурации мастера UDI и соответствующем app-файле.

Подготовка среды разработки UDI

Прежде чем приступить к созданию собственных настраиваемых страниц мастера и редакторов страниц мастера, выполните следующие действия для подготовки среды разработки UDI:

  1. Подготовьте предварительные требования к среде разработки UDI, как описано в разделе Предварительные требования к среде разработки UDI.

  2. Настройте среду разработки UDI, как описано в разделе Настройка среды разработки UDI.

  3. Убедитесь, что среда разработки UDI настроена правильно, как описано в разделе Проверка среды разработки UDI.

Подготовка предварительных требований к среде разработки UDI

Чтобы подготовить предварительные требования к среде разработки UDI, выполните следующие действия.

  1. Подготовьте аппаратные требования среды разработки UDI, как описано в разделе Предварительные требования к оборудованию среды разработки UDI.

  2. Подготовьте требования к программному обеспечению среды разработки UDI, как описано в разделе Предварительные требования к программному обеспечению среды разработки UDI.

Подготовка необходимых компонентов для среды разработки UDI

Предварительные требования к оборудованию среды разработки UDI совпадают с требованиями к оборудованию для выпуска Майкрософт Visual Studio, который вы используете. Дополнительные сведения об этих требованиях см. в разделе Требования к системе для каждого выпуска документации по Visual Studio.

Подготовка программного обеспечения среды разработки UDI

Среда разработки UDI имеет следующие предварительные требования к программному обеспечению:

  • Любая операционная система Windows, которую поддерживает Visual Studio 2010 (рекомендуется Использовать Windows 7 или Windows Server® 2008 R2).

    Вам потребуется операционная система Windows, которая поддерживает архитектуру процессора, для которой требуется разработать. Вы можете выполнить 32-разрядную и 64-разрядную разработку UDI с помощью 64-разрядной операционной системы. Разработка 32-разрядных UDI выполняется только в 32-разрядных операционных системах. По этой причине следует использовать 64-разрядную операционную систему.

    Примечание.

    Версии IntelItanium (IA-64) операционной системы Windows не поддерживаются для сред разработки UDI.

    Дополнительные сведения об операционных системах, поддерживаемых Visual Studio 2010, см. в разделе Требования к системе для каждого выпуска документации по Visual Studio.

  • Майкрософт платформа .NET Framework версии 4.0 (требуется для Visual Studio 2010)

  • Язык C++ (язык, используемый при расширении страниц мастера UDI)

  • Другие языки, поддерживаемые WPF, такие как C#, Visual Basic .NET или C++/common Language Infrastructure, которые используются для расширения редакторов страниц мастера конструктора UDI

    Примечание.

    Пример исходного кода для редакторов страниц мастера конструктора UDI написан на языке C#. Установите язык C#, если вы хотите использовать пример исходного кода.

Настройка среды разработки UDI

После выполнения предварительных требований к среде разработки UDI выполните следующие действия, чтобы настроить среду разработки UDI:

  1. Установите Visual Studio 2010.

    Убедитесь, что установлен язык C++ и любой другой язык, поддерживаемый WPF.

    Примечание.

    Пример исходного кода для страниц редактора мастера UDI написан на языке C#. Установите язык C#, если вы хотите использовать пример исходного кода.

    Дополнительные сведения об установке Visual Studio 2010 см. в статье Установка Visual Studio.

  2. Установите MDT.

    Дополнительные сведения об установке MDT см. в разделе "Установка или обновление до MDT" в документе MDT с помощью набора средств развертывания Майкрософт.

  3. В проводнике Windows создайте local_folder (где local_folder — это любая папка, расположенная на локальном диске компьютера разработки).

  4. Скопируйте папку installation_folder\SDK в local_folder (где installation_folder — это папка, в которой установлен MDT, а local_folder — любая папка, расположенная на локальном диске компьютера разработки ).

    Вы копируете папку SDK в другое расположение, так как MDT установлен в папке Program Files, которую невозможно записать в без повышенных разрешений. Копирование папки SDK в другое расположение позволяет изменять файлы в папке ПАКЕТА SDK, не требуя повышенных разрешений.

  5. Скопируйте папку installation_folder\Templates\Distribution\Tools в local_folder (где installation_folder — это папка, в которой вы установили MDT, а local_folder — это папка, созданная ранее в процессе).

  6. Переименуйте папку local_folder\Tools в local_folder\OSDSetupWizard(где local_folder — это папка, созданная ранее в процессе).

    После завершения структура папок под local_folder должна выглядеть так, как структура папок, показанная на рисунке 2 ( где local_folder — это папка, созданная ранее в процессе, и отображается как UDIDevelopment на рисунке).

    Рис. 2. Структура папок для разработки UDI Рис. 2. Структура папок для разработки UDI

    Рис. 2. Структура папок для разработки UDI

Проверка среды разработки UDI

После настройки среды разработки UDI убедитесь, что среда разработки UDI настроена правильно, убедившись, что примеры проектов правильно создаются в Visual Studio 2010.

Убедитесь, что среда разработки UDI настроена правильно, определив, что:

Проверка правильности сборки проекта SamplePage

Проект SamplePage содержит пример создания настраиваемой страницы мастера для мастера UDI. Дополнительные сведения о проекте SamplePage см. в разделе Обзор решения Visual Studio SamplePage.

Проверка правильности сборки проекта SamplePage

  1. Запустите Visual Studio 2010.

  2. Откройте проект SamplePage.

    Проект SamplePage находится в папке local_folder\SDK\UDI\SamplePage (где local_folder — это папка, созданная ранее в процессе).

  3. В Visual Studio 2010 в Обозреватель решений щелкните правой кнопкой мыши проект SamplePage и выберите пункт Свойства.

    Откроется диалоговое окно Страницы свойств SamplePage .

  4. В диалоговом окне Страницы свойств SamplePage перейдите в раздел Свойства конфигурации/Отладка.

  5. В разделе Свойства отладки в разделе Конфигурация выберите Все конфигурации.

  6. В свойствах отладки в разделе Command введите $(TargetDir)\OSDSetupWizard.exe.

  7. В свойствах отладки в разделе Рабочий каталог введите $(TargetDir).

  8. В диалоговом окне Страницы свойств SamplePage перейдите в раздел Свойства конфигурации/События сборки/Событие после сборки.

  9. В свойствах события после сборки в разделе Командная строка введите следующее:

    copy /y "$(ProjectDir)..\..\..\..\OSDSetupWizard\x86\*.*" "$(TargetDir)"  
    xcopy /y /i "$(ProjectDir)..\..\..\..\OSDSetupWizard\x86\en-us" "$(TargetDir)en-us"  
    copy /y "$(ProjectDir)..\..\..\..\OSDSetupWizard\OSDResults\Images\UDI_Wizard_Banner.bmp" "$(ProjectDir)header.bmp"  
    copy /y "$(ProjectDir)Config.xml" "$(TargetDir)"  
    copy /y "$(ProjectDir)header.bmp" "$(TargetDir)header.bmp"  
    
  10. В диалоговом окне Страницы свойств SamplePage нажмите кнопку ОК.

  11. Сохраните проект.

  12. В меню Отладка щелкните Начать отладку.

    Появится диалоговое окно Майкрософт Visual Studio, в котором указано, что источник устарел, и вы спрашиваете, хотите ли вы создать проект.

  13. В диалоговом окне Visual Studio Майкрософт нажмите кнопку Да.

    Откроется диалоговое окно Нет сведений об отладке , информирующее о том, что сведения об отладке недоступны для OSDSetupWizard.exe.

  14. В диалоговом окне Нет сведений об отладке нажмите кнопку Да.

    Откроется мастер UDI с отображаемой страницей настраиваемого мастера.

  15. Убедитесь, что вы можете выбрать значение в разделе Выбор расположения.

  16. В форме мастера с примером страницы нажмите кнопку Отмена.

    Откроется диалоговое окно Мастер отмены .

  17. В диалоговом окне Мастер отмены нажмите кнопку Да.

  18. Закройте Visual Studio 2010.

Проверка правильности сборки проекта SampleEditor

Проект SampleEditor предоставляет пример создания пользовательского редактора страниц мастера для конструктора мастера UDI. Дополнительные сведения о проекте SampleEditor см. в разделе Обзор решения Visual Studio SamplePage.

Проверка правильности сборки проекта SampleEditor

  1. Запустите Visual Studio 2010.

  2. Откройте проект SampleEditor.

    Проект SampleEditor находится в папке local_folder\SDK\UDI\SampleEditor (где local_folder — это папка, созданная ранее в процессе).

  3. В Visual Studio 2010 в Обозреватель решений выберите проект SampleEditor.

  4. В меню Проект щелкните Добавить ссылку.

    Откроется диалоговое окно Добавление ссылки .

  5. В диалоговом окне Добавление ссылки откройте вкладку Обзор .

  6. На вкладке Обзор перейдите к installation_folder\Bin (где installation_folder — это папка, в которой вы установили MDT). Выберите следующие файлы и нажмите кнопку ОК:

    • Microsoft.Enterprise.UDIDesigner.Common.dll

    • Microsoft.Enterprise.UDIDesigner.DataService.dll

    • Microsoft.Enterprise.UDIDesigner.Infrastructure.dll

    • Microsoft.Practices.Prism.dll

    • Microsoft.Practices.ServiceLocation.dll

    • Microsoft.Practices.Unity.dll

    • RibbonControlsLibrary.dll

    Примечание.

    Вы можете выбрать несколько файлов на вкладке Обзор , удерживая нажатой клавишу CTRL при щелчке файлов.

  7. В Обозреватель решений перейдите в раздел SampleEditor/References.

  8. Убедитесь, что ни одна из ссылок не содержит предупреждений или ошибок.

  9. В Обозреватель решений щелкните правой кнопкой мыши проект SampleEditor и выберите пункт Свойства.

    Откроется диалоговое окно Страницы свойств SampleEditor .

  10. В диалоговом окне Страницы свойств SampleEditor перейдите на вкладку Отладка .

  11. На вкладке Отладка щелкните Запустить внешнюю программу.

  12. В поле Запуск внешней программы введите installation_folder\Bin\UDIDesigner.exe (где installation_folder — это папка, в которой установлен MDT), а затем нажмите кнопку ОК.

    Совет

    Вы можете нажать кнопку с многоточием (...), чтобы перейти к папке и выбрать UDIDesigner.exe.

  13. В меню Файл выберите команду Сохранить все.

  14. Скопируйте файл \SDK\SamplePage\SamplePage.dll.config local_folder в папку installation_folder\Bin\Config (где local_folder — это папка, созданная на компьютере разработки ранее в процессе настройки, аinstallation_folder — папка, в которой вы установили MDT).

  15. В Visual Studio 2010 в меню Отладка щелкните Начать отладку.

    Запускается конструктор мастера UDI.

  16. В конструкторе мастера UDI на ленте нажмите кнопку Открыть.

    Откроется диалоговое окно Открыть .

  17. В диалоговом окне Открытие откройте файл \SDK\SamplePage\SamplePage\Config.xml local_folder (где local_folder — это папка, созданная на компьютере разработки ранее в процессе настройки).

    Откроется файл Config.xml, а в области сведений отобразится пользовательская группа StageGroup .

  18. В области сведений перейдите на вкладку Настройка .

  19. Просмотрите сведения о конфигурации для поля Расположение , в том числе следующие:

    • Кнопка "Разблокирована ", с помощью которой вы включаете или отключаете поле "Расположение "

    • Поле значения по умолчанию, в котором введите значение по умолчанию для отображения в поле Расположение

    • Понятное отображаемое имя отображается на странице сводки, в которой вы вводите заголовок для сведений, отображаемых на странице Сводка

    • Список расположений, включающий список возможных расположений

  20. Закройте конструктор мастера UDI.

  21. Закройте Visual Studio 2010.

Просмотр примеров пакета SDK для UDI

Перед началом разработки ознакомьтесь с примерами, приведенными в пакете SDK для UDI. Используйте сведения, приведенные в этом руководстве, и исходный код в примерах, чтобы создать собственные страницы пользовательского мастера UDI и редакторы страниц мастера.

Ознакомьтесь с примерами пакета SDK для UDI, просмотрев:

Просмотр содержимого папки ПАКЕТА SDK

Во время настройки среды разработки UDI вы скопировали папку SDK из папки, в которой вы установили MDT, в другую созданную папку. В таблице 1 перечислены папки, непосредственно расположенные под папкой SDK, и содержится краткое описание каждой из них.

Таблица 1. Папки в пакете SDK для UDI

Folder Эта папка содержит
Включает следующее Файлы заголовков C++, необходимые для создания настраиваемых страниц мастера для мастера UDI
Libs Файлы библиотеки C++, которые будут связаны с настраиваемой страницей; Существуют 32-разрядные и 64-разрядные версии библиотек статических ссылок. Примечание: Версии библиотек Itanium (IA-64) недоступны.
SampleEditor Проект Visual Studio для создания пользовательского редактора, используемого для редактирования страницы SamplePage в конструкторе мастера UDI, написанного на языке C #
SamplePage Проект Visual Studio для создания настраиваемой страницы мастера UDI, написанной на Visual C++

Просмотр решения Visual Studio SamplePage

Прежде чем приступить к созданию настраиваемых страниц мастера и редакторов страниц мастера, выполните следующие задачи по подготовке среды разработки UDI:

Просмотр жизненного цикла страницы мастера

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

Табл. 2. Методы в жизненном цикле страницы мастера

Метод Описание
OnWindowCreated Этот метод вызывается один раз после создания окна страницы.

Для этого метода напишите код, который инициализирует страницу в первый раз и должен быть выполнен только один раз. Например, используйте этот метод для инициализации полей или для чтения сведений о конфигурации из элементов setter в файле конфигурации мастера UDI.
OnWindowShown Этот метод вызывается каждый раз, когда страница отображается (отображается) в мастере UDI. Он вызывается при первом отображении страницы и при каждом переходе к ней путем нажатия кнопки Далее или Назад в мастере.

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

Для этого метода напишите код, обрабатывающий WM_NOTIFY на основе сообщения уведомления. Например, может потребоваться ответить на события из общего элемента управления, например на события щелчка или двойного щелчка для элемента управления TreeView .
OnUnhandledEvent Этот метод вызывается при возникновении необработанного сообщения окна для страницы мастера. Этот метод предоставляет возможность перехвата и обработки этих необработанных оконных сообщений.

Для этого метода напишите код, обрабатывающий сообщения окна, относящиеся к странице мастера. Как правило, переопределять этот метод не требуется.
OnNextClicked Этот метод вызывается при нажатии кнопки Далее в мастере.

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

Для этого метода напишите код, который выполняет какие-либо действия до скрытия страницы до отображения другой страницы. Как правило, переопределять этот метод не требуется.

Ознакомьтесь с примером SamplePage

Просмотрите пример SamplePage, используя следующий список, который представляет последовательность событий в течение жизненного цикла страницы мастера примера SamplePage:

  1. Мастер UDI, OSDSetupWizard.exe, считывает сведения о конфигурации из файла конфигурации мастера UDI в примере (файл Config.xml), как описано в разделе Шаг 1. Мастер UDI (OSDSetupWizard.exe) считывает файл Config.xml.

  2. Мастер UDI загружает библиотеки DLL, необходимые для каждой страницы мастера, указанной в файле конфигурации мастера UDI, как описано в разделе Шаг 2. Мастер UDI загружает библиотеку DLL для страницы настраиваемого мастера.

  3. Мастер UDI отображает настраиваемую страницу мастера и позволяет взаимодействовать с нужным элементом управления, как описано в разделе Шаг 3. Мастер UDI отображает страницу настраиваемого мастера.

  4. Когда на странице пользовательского мастера собраны сведения, выполните все необходимые задачи, прежде чем нажать кнопку Далее , чтобы перейти к следующему мастеру, как описано в разделе Шаг 4. Нажатие следующей кнопки на странице настраиваемого мастера.

Шаг 1. Мастер UDI (OSDSetupWizard.exe) считывает файл Config.xml

При запуске мастера UDI (OSDSetupWizard.exe) он по умолчанию считывает файл конфигурации мастера UDI, который является UDIWizard_Config.xml файлом — основным файлом конфигурации мастера UDI.

Примечание.

В примере в качестве файла конфигурации используется файл Config.xml. В MDT файл конфигурации по умолчанию — это файл UDIWizard_Config.xml, который находится в папке Scripts в пакете MDT Files для настройки.

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

Элементы верхнего уровня в файле Config.xml :

  • Элемент БИБЛИОТЕК DLL

  • Элемент Style

  • Элемент Pages

  • Элемент StageGroups

    Дополнительные сведения о схеме файла конфигурации мастера UDI и каждом из этих элементов см. в статье Справочник по схеме файла конфигурации мастера UDI.

    Мастер UDI сканирует элемент БИБЛИОТЕК DLL в поисках .dll файлов для загрузки. В этом примере перечислены два .dll файла: SamplePage.dll и SharedPages.dll. Эти .dll файлы должны находиться в той же папке, что и OSDSetupWizard.exe — в папке Tools\platform (где платформа — x86 для 32-разрядной версии или x64 для 64-разрядной версии).

    Мастер UDI сканирует элемент Pages в поисках определенных страниц. В этом примере определены две страницы: Пользовательская и SummaryPage. Атрибут Type элемента Page определяется в файле PageClassIDs.h и уникальным образом определяет тип настраиваемой страницы.

    В этом примере определенным типом является Майкрософт. SamplePage.LocationPage. Чтобы избежать возможных конфликтов с другими страницами, которые могут быть созданы в будущем, замените следующую страницу:

  • Название вашей организации вместо Майкрософт.

  • Имя проекта вместо SamplePage.

  • Имя настраиваемой страницы мастера вместо LocationPage.

Шаг 2. Мастер UDI загружает библиотеку DLL для страницы пользовательского мастера

Когда мастер UDI загружает библиотеку DLL, он вызывает функцию RegisterFactories , которая должна быть реализована в файле .dll. В примере эта функция реализована в файле dllmain.ccp. Каждая созданная страница мастера должна реализовывать функцию RegisterFactories .

Функция RegisterFactories используется для регистрации класса фабрики страницы мастера в реестре фабрики классов для мастера UDI. Фабрики классов — это классы, которые могут создавать экземпляр другого класса. Функция RegisterFactories создает новый экземпляр фабричного класса и передает этот класс в реестр фабрики классов для мастера UDI, что делает этот класс фабрики доступным для мастера. Мастер UDI ищет класс фабрики, зарегистрированный с идентификатором, который соответствует атрибуту Type элемента Page для настраиваемой страницы мастера.

В этом примере идентификатор определяется как ID_Location в файле PageClassIds.h как Майкрософт. SamplePage.LocationPage, соответствующий атрибуту Type элемента Page в файле Config.xml. ID_Location передается в качестве параметра в функции RegisterFactories , реализованной в файле dllmain.ccp.

Вы можете создать функцию с помощью шаблона функции Register_name , чтобы упростить создание нового экземпляра фабрики и зарегистрировать созданный экземпляр. Значение имени , указанное с помощью шаблона функции Register, должно реализовывать интерфейс iClassFactory . Класс ClassFactoryImpl обрабатывает большинство сведений о реализации фабрики классов.

Вы также можете использовать функцию RegisterFactories для регистрации типов задач и типов проверяющего элемента управления. Дополнительные сведения см. в указанных ниже статьях.

Примечание.

В примере содержится и регистрируется только одна настраиваемая страница мастера. В этом примере не содержатся пользовательские задачи или проверяющие элементы и поэтому не регистрируются пользовательские задачи или проверяющие элементы.

Шаг 3. Мастер UDI отображает страницу пользовательского мастера

Настраиваемая страница мастера в примере определяется в файле LocationPage.cpp. Страницы мастера являются производными от классов шаблонов, которые обеспечивают большую часть функциональности страницы. Все страницы мастера должны быть производными от класса шаблона WizardPageImpl, который реализует интерфейс IWizardPage. Каждая страница мастера может реализовывать другие необязательные классы шаблонов и соответствующие интерфейсы в зависимости от потребностей страницы.

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

Список доступных:

  • Классы шаблонов для страниц мастера см. в разделе Вспомогательные классы страниц мастера

  • Интерфейсы для классов шаблонов страниц мастера см. в разделе Интерфейсы страниц мастера.

    Настраиваемая страница мастера в примере является производным от класса шаблона WizardPageImpl и реализует интерфейс IWizardPage. Кроме того, настраиваемая страница мастера реализует интерфейс IFieldCallback . Оба они реализованы в файле LocationPage.cpp.

    Пример страницы настраиваемого мастера переопределяет следующие методы:

  • OnWindowCreated. Метод OnWindowCreated на странице примера мастера вызывает следующие методы:

    • AddField. Этот метод связывает элемент управления IDC_COMBO_LOCATION box в ресурсе IDD_LOCATION_PAGE с элементом Dataс именем Location в файле Config.xml.

      В дополнение к методу AddField можно использовать методы AddRadioGroup и AddToGroup для поддержки других элементов управления и поведения.

      Примечание.

      Перед вызовом метода InitFields обязательно вызовите метод AddField, AddRadioGroup или AddToGroup.

    • InitFields. Используйте этот метод для инициализации полей (элементов управления), добавленных в форму. Указатель страницы является параметром . В примере передается этот указатель, который ссылается на текущую страницу.

      Примечание.

      Для поддержки использования этого указателя необходимо реализовать интерфейс IFieldCallback в дополнение к интерфейсам, которые поддерживает класс шаблона WizardPageImpl .

      Интерфейс IFieldCallback вызывает метод SetFieldDefault , который используется для задания значений по умолчанию для элементов управления, отличных от элементов управления text box и check box. В этом примере метод SetFieldDefault задает начальный индекс элемента управления поле со списком на основе значения по умолчанию, указанного в элементе Default для элемента Field в файле Config.xml.

      Метод OnWindowCreated настраивает контроллер формы с помощью интерфейса IFormController. Дополнительные сведения о настройке контроллера формы см. в разделе Настройка формы.

  • InitLocations. Этот метод заполняет поле со списком расположений в файле Config.xml. Элемент Data и дочерние элементы DataItem Confg.xml файла предоставляют список возможных значений.

  • OnNextClicked. Этот метод выполняет следующие задачи:

    • Обновления переменную последовательности задач TSLocation со значением, выбранным в поле со списком с помощью метода SaveFields.

    • Добавляет сведения, которые будут отображаться на странице Сводка с помощью метода SaveFields

Шаг 4. Нажатие кнопки "Следующая" на странице пользовательского мастера

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

На странице примера настраиваемого мастера переопределение для метода OnNextClicked реализовано в файле LocationPage.ccp. В методе OnNextClicked на странице примера пользовательского мастера вызываются следующие методы:

  1. InitSection. Этот метод инициализирует заголовок (подпись метки) для сводных данных, отображаемых на странице Сводка . Как правило, это значение можно задать с помощью функции DisplayName(). Данные, связанные с этим заголовоком, сохраняются с помощью метода SaveFields .

  2. SaveFields. Этот метод сохраняет значения полей в переменных последовательности задач и в данных, отображаемых на странице Сводка .

Обзор решения Visual Studio SampleEditor

Прежде чем приступить к созданию собственных настраиваемых страниц мастера и редакторов страниц мастера, выполните следующие действия для подготовки среды разработки UDI:

Обзор архитектуры конструктора мастера UDI

Конструктор мастера UDI был разработан с использованием WPF, Prism и Unity. Конструктор UDI используется для изменения файла конфигурации мастера UDI (UDIWizard_Config.xml), который мастер UDI (OSDSetupWizard.exe) считывает во время выполнения. Элемент Pages в файле конфигурации мастера UDI содержит список страниц с отдельным элементом Page для каждой страницы мастера.

При изменении параметров конфигурации для страницы мастера UDI конструктор мастера загружает настраиваемый редактор страниц, соответствующий типу страницы мастера. Редакторы страниц пользовательского мастера разрабатываются как пользовательские элементы управления WPF. На страницах редактора страниц пользовательского мастера используется шаблон конструктора Model–View–ViewModel (MVVM) для WPF.

Шаблон проектирования MVVM помогает отделить пользовательский интерфейс (пользовательский интерфейс; представление) от представляемых данных. Данные являются фасадом над элементом Page в файле конфигурации мастера UDI (файл Config.xml в примере), доступ к которому осуществляется с помощью свойства CurrentPage интерфейса IDataService .

Конструктор мастера UDI использует DependencyAttribute для получения доступа к классу DataService на основе платформы внедрения зависимостей в Unity. Дополнительные сведения о платформе взаимодействия зависимостей в Unity см. в статье Внедрение некоторой жизни в приложения — знакомство с блоком приложений Unity.

Просмотр настраиваемых компонентов страницы мастера UDI

При создании настраиваемой страницы мастера некоторые параметры конфигурации могут быть заданы в коде и не могут быть изменены после компиляции страницы. Однако для других параметров конфигурации необходимо разрешить изменение этих параметров конфигурации с помощью конструктора мастера UDI.

Как правило, параметры конфигурации, которые необходимо настроить с помощью конструктора мастера UDI, сохраняются в файле конфигурации мастера UDI (файл Config.xml в примере). Однако при необходимости можно также создать собственный отдельный файл конфигурации. Одним из примеров использования отдельного файла конфигурации является файл UDIWizard_Config.xml.app, который используется задачей "Обнаружение приложений " и типом страницы мастера ApplicationPage .

Ниже приведен список типичных параметров конфигурации, которыми можно управлять с помощью конструктора мастера UDI.

  • Поле. Поля use позволяют пользователям вводить входные данные. Поля отображаются как элементы Field в файле конфигурации мастера UDI (UDIWizard_Config.xml), который содержит параметры конфигурации для каждого поля. Соответствующий редактор страниц мастера должен предоставить метод для изменения параметров конфигурации поля с помощью Элемента управления FieldElementControl.

  • Properties. Методы задания помогают создавать свойства для сущностей на странице, таких как страницы в элементе Page , поля в элементе Field или данные в элементах Data или DataItem . Вы настраиваете свойства в элементах Setter . Добавьте отдельный элемент Setter для каждого свойства, которое вы хотите определить. Вы изменяете свойства с помощью SetterControl и настраиваете другие элементы Setter с помощью других элементов управления.

  • Данные. Данные используются для хранения сведений, используемых страницей мастера и другими компонентами. Вы можете определить данные для страниц или полей с помощью элементов Data или DataItem . Данные могут быть определены в плоской или иерархической структуре путем правильного использования элементов Data или DataItem . В Config.xml в примере в пакете SDK показано, как создавать структуры неструктурированных данных.

    Создаваемый редактор страниц пользовательского мастера должен иметь возможность управлять этими параметрами конфигурации.

Просмотрите пример EditorPage

Пример EditorPage используется для настройки параметров конфигурации для страницы мастера SamplePage в файле конфигурации мастера UDI. Пример EditorPage содержит следующие основные компоненты:

  • Пользовательский интерфейс для настройки параметров поля со списком "Расположение "

  • Пользовательский интерфейс для добавления или изменения расположения в списке возможных расположений, которые отображаются в поле со списком Расположение

  • Параметры конфигурации, считыванные из файла конфигурации мастера UDI и сохраненные в ней

  • Поддержка кода для других компонентов

    Просмотрите пример EditorPage в Visual Studio, выполнив следующие действия.

  1. Просмотрите, как редактор страницы мастера SampleEditor загружается и инициализируется в конструкторе мастера UDI, как описано в разделе Загрузка и инициализация редактора страниц мастера проверки.

  2. Просмотрите пользовательский интерфейс, используемый для изменения поля со списком Расположение в файлах LocationPageEditor.xaml и LocationPageEditor.xaml.cs, как описано в разделе Просмотр пользовательского интерфейса, используемого для настройки поля со списком расположение.

  3. Просмотрите пользовательский интерфейс, используемый для добавления или изменения расположений в списке в файлах AddEditLocationView.xaml и AddEditLocationView.xaml.cs, как описано в разделе Просмотр пользовательского интерфейса, используемого для изменения списка возможных расположений.

  4. Просмотрите код, используемый для управления сведениями о конфигурации, сохраненными в файле конфигурации мастера UDI, как описано в разделе Просмотр кода, используемого для управления сведениями о конфигурации.

Просмотр мастера загрузки и инициализации редактора страниц

Пользовательские редакторы страниц мастера загружаются в соответствии с требованиями конструктора мастера UDI. Файлы конфигурации конструктора мастера UDI загружаются при запуске конструктора мастера UDI. Конструктор мастера UDI проверяет папку install_folder\Bin\Config (где install_folder — это имя папки, в которой установлен MDT) на наличие файлов с расширением .config.

Во время настройки среды разработки UDI вы скопировали файл SamplePage.dll.confg в папку install_folder\Bin\Config. При запуске конструктора мастера UDI будет найден и загружен файл SamplePage.dll.confg.

Конструктор мастера UDI использует следующие атрибуты элемента Page в файле SamplePage.dll.confg для загрузки и инициализации примера EditorPage:

  • DesignerAssembly. Этот атрибут определяет имя загружаемой библиотеки DLL. Эту библиотеку DLL необходимо поместить в ту же папку, что и файл UDIDesigner.exe, который является папкой install_folder\Bin (где install_folder — это имя папки, в которой установлен MDT).

  • DesignerType. Этот атрибут является Майкрософт имя типа .NET класса, содержащего пользовательский элемент управления WPF.

  • Введите. Используйте этот атрибут для настройки типа страницы настраиваемого мастера, которую загружает мастер UDI. Конструктор мастера UDI использует этот атрибут для поиска соответствующего элемента Page в файле конфигурации мастера UDI.

  • Dll. Используйте этот атрибут для настройки элемента DLL в файле конфигурации мастера UDI, который создает конструктор мастера UDI.

  • Описание. Используйте этот атрибут для предоставления сведений о редакторе страниц мастера. Значение этого атрибута отображается в диалоговом окне Добавление новой страницы в конструкторе мастера UDI, который используется для добавления страницы мастера в "Библиотека страниц".

  • DisplayName. Используйте этот атрибут, чтобы указать имя настраиваемой страницы мастера, которая отображается в конструкторе мастера UDI. Значение этого атрибута отображается в диалоговом окне Добавление новой страницы в конструкторе мастера UDI, который используется для добавления страницы мастера в "Библиотека страниц".

    В этом примере тип страницы настраиваемого мастера SamplePageМайкрософт. SamplePage.LocationPage, который сохраняется в файле Config.xml. Файл Config.xml находится в папке local_folder\SDK\SamplePage\SamplePage в (где local_folder — это папка, созданная на компьютере разработки ранее в процессе настройки).

Просмотрите поле со списком "Пользовательский интерфейс, используемый для настройки расположения"

При загрузке и инициализации редактора страницы мастера SampleEditor загружается, когда страница с типом Майкрософт. SamplePage.LocationPage редактируется. Пользовательский интерфейс редактора страниц хранится в файле LocationPageEditor.xaml.

Если вы изучите пользовательский интерфейс на вкладке Конструктор и код на вкладке XAML , вы увидите связь между графическим пользовательским интерфейсом и элементами и атрибутами в XAML.

Например, если просмотреть элемент Controls:FieldElementControl в XAML, можно увидеть, как это связано с макетом соответствующего пользовательского интерфейса. Используйте элемент Controls:FieldElementControl для определения элемента управления FieldElementControl .

Параметры привязки в XAML-файле привязывают поля в редакторе примеров страниц с информацией в файле конфигурации мастера UDI. Например, следующий код связывает текстовое поле Значение по умолчанию с элементом Default в файле конфигурации мастера UDI (Config.xml в примере):

<TextBox Text="{Binding FieldData.DefaultValue,  
 UpdateSourceTrigger=PropertyChanged,  
 Mode=TwoWay}"/>  

Дополнительные сведения см. в разделе Практическое руководство. Предоставление доступа к данным для привязки в XAML.

Используйте элемент Views:CollectionTControl.ColumnCollectionView в XAML для изменения списка доступных расположений в представлении сетки. Элемент управления CollectionTControl используется для отображения представления сетки и привязки представления сетки к элементу Data с именем Location в файле конфигурации UDI.

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

Пользовательский интерфейс для изменения списка возможных расположений состоит из следующих элементов:

Просмотр контекстно-чувствительных кнопок меню и ленты для изменения списка расположений

При щелчке правой кнопкой мыши в списке со списком расположений отображается контекстное меню. На ленте есть соответствующие кнопки, которые позволяют выполнять те же задачи. Элемент управления Views:CollectionsTControl в файле LocationPageEditor.xaml определяет методы, вызываемые на основе выполненных действий и свойств, заданных следующим образом:

  • SelectedItem. Это свойство с привязкой к данным активируется, когда пользователь выбирает элемент из списка. Это свойство привязано к свойству CurrentLocation в модели представления, которое находится в файле LocationPageEditorViewModel.cs и используется элементом управления CollectionTControl для передачи элемента, выбранного при редактировании или удалении существующего элемента.

  • AddItemAction. Это действие выполняется, когда пользователь нажимает кнопку Добавить элемент в контекстном меню или соответствующие кнопки на ленте. Существует привязка данных к свойству в модели представления, которая возвращает объект AddLocationAction . Этот объект является методом AddLocationCallback , расположенным в файле LocationPageEditorViewModel.cs и отображает диалоговое окно в файле AddEditLocationView.xaml.

  • EditItemAction. Это действие выполняется, когда пользователь щелкает параметр Изменить элемент в контекстном меню. Существует привязка данных к свойству в модели представления, которое возвращает объект EditLocationAction . Этот объект представляет собой метод EditLocationCallback , расположенный в файле LocationPageEditorViewModel.cs и отображающий диалоговое окно в файле AddEditLocationView.xaml.

  • RemoveAction. Это действие выполняется, когда пользователь щелкает параметр Удалить элемент в контекстном меню. Существует привязка данных к свойству в модели представления, которое возвращает объект RemoveAction . Этот объект представляет собой метод EditLocationCallback , расположенный в файле LocationPageEditorViewModel.cs и показывающий сообщение, подтверждающее удаление расположения.

Просмотр диалогового окна добавления или редактирования расположений

Если добавить новое расположение в список расположений или изменить существующее расположение, появится сообщение, которое находится в файле AddEditLocationView.xaml. Сообщение отображается с помощью метода окна ShowDialogWindow в файле LocationPageEditorViewModel.cs.

Пользовательский интерфейс в файле AddEditLocationView.xaml состоит из следующих элементов:

  • Фрейм диалогового окна с именем DialogFrame, который содержит следующие элементы:

    • Заголовок, который настраивается с помощью атрибута DialogTitle фрейма диалогового окна.

    • Кнопка ОК , которая задает для свойства Approved значение True (Состояние возврата проверяется в методе AddLocationCallback в файле LocationPageEditorViewModel.cs, чтобы определить, нажал ли пользователь кнопку ОК).

    • Кнопка Отмена , которая задает для свойства Approved значение False (Состояние возврата проверяется в методе AddLocationCallback в файле LocationPageEditorViewModel.cs, чтобы определить, нажал ли пользователь кнопку "Отмена".)

  • Элемент WPF, содержащий:

    • Метка, настраиваемая с помощью атрибута Content

    • Текстовое поле, привязанное к элементу Data с именем Location в файле конфигурации UDI (файл Config.xml в примере).

Просмотрите код, используемый для управления сведениями о конфигурации

Сведения о конфигурации для страницы настраиваемого мастера хранятся в файле конфигурации мастера UDI, который является следующим:

  • Config.xml файл в примере, предоставленном пакетом SDK для UDI (этот файл содержит только параметры конфигурации для примера.)

  • UDIWizard_Config.xml файл, предоставленный MDT, хранящийся в папке installation_folder\Templates\Distribution\Scripts (где installation_folder — это папка, в которой установлен MDT); этот файл содержит параметры конфигурации для всех встроенных страниц и этапов мастера

    В примере SampleEditor подпрограмма Locations помогает управлять сведениями о конфигурации и находится в файле LocationPageEditorViewModel.cs. Подпрограмма Расположения возвращает список расположений из файла конфигурации мастера UDI. В частности, возвращаемый список содержит элемент для каждого элемента DataItem в файле конфигурации мастера UDI.

Создание пользовательских страниц мастера UDI

Общий процесс создания пользовательских страниц мастера UDI выглядит следующим образом:

  1. Создайте копию решения SamplePage в качестве отправной точки.

  2. Поместите нужные элементы управления (поля) в форму.

  3. Напишите код для выполнения соответствующих задач при загрузке страницы мастера (переопределяет метод OnWindowCreated ), включая следующие действия:

    1. Инициализация формы.

    2. Чтение переменных памяти, переменных последовательности задач, переменных среды или сведений о XML-файле (например, свойства задания ).

  4. Напишите любой код для выполнения соответствующих задач при отображении страницы (переопределения для метода OnWindowShown ), включая следующие действия:

    1. Включение или отключение элементов управления на основе сведений, считываемых при загрузке страницы на шаге 3.

    2. Обновите элементы управления на основе сведений, считываемых при последующей загрузке страницы на шаге 3, например на основе количества элементов управления на основе прочитанных сведений.

  5. Напишите любой код для выполнения соответствующих задач, пока пользователь взаимодействует со страницей мастера.

  6. Напишите любой код для выполнения соответствующих задач, когда пользователь нажимает кнопку Далее в мастере UDI (переопределяет метод OnNextClicked ), включая следующие действия:

    1. Обновите все переменные памяти, переменные последовательности задач, переменные среды или сведения о XML-файле.

    2. Обновление сведений о странице сводки (если не выполняется полями на странице).

  7. Построение решения.

    Убедитесь, что созданная версия библиотеки DLL является той же платформой процессора, что и установка MDT, в частности, платформой процессора для среды предустановки Windows (Windows PE). Мастер UDI может выполняться в следующих приложениях:

    • Существующая операционная система на целевом компьютере. Вы можете запускать 32-разрядные версии страницы мастера в 32-разрядных или 64-разрядных операционных системах Windows. Однако вы можете запускать только 64-разрядные версии страницы мастера в 64-разрядных операционных системах Windows.

    • Среда предустановки Windows на целевом компьютере. Среда предустановки Windows не поддерживает запуск 32-разрядных приложений в 64-разрядной версии Windows PE. Таким образом, необходимо создать версию для страницы мастера для каждой архитектуры процессора Windows PE, которую вы планируете использовать.

  8. Скопируйте библиотеку DLL для страницы настраиваемого мастера в папку installation_folder\Templates\Distribution\Tools\ platform (где installation_folder — это папка, в которой установлен MDT, а платформаx86 для 32-разрядной версии или x64 — для 64-разрядной версии).

  9. Выполните действия по созданию пользовательского редактора страниц.

Создание редакторов страниц пользовательского мастера

Общий процесс создания пользовательских редакторов страниц мастера UDI выглядит следующим образом:

  1. Создайте копию решения SampleEditor в качестве отправной точки.

  2. Создайте пользовательский интерфейс редактора основной страницы в XAML-файле.

  3. Добавьте экземпляры элемента управления FieldElementControl , как это требуется для настройки страницы мастера (при необходимости).

  4. Добавьте экземпляры элемента управления SetterControl , как это требуется для настройки страницы мастера (при необходимости).

  5. Добавьте экземпляры элемента управления CollectionTControl , как это требуется для настройки страницы мастера (при необходимости).

  6. Добавьте интерфейс IDataService .

  7. Напишите соответствующий код, чтобы обновить файл конфигурации мастера UDI на основе параметров конфигурации, которые необходимо настроить с помощью редактора страниц пользовательского мастера.

  8. Создайте дочерние диалоговые окна в XAML-файле и вызовите их из редактора основной страницы с помощью интерфейса IMessageBoxService , как это требуется для настройки страницы мастера.

  9. Добавьте соответствующие интерфейсы на ленту конструктора мастера UDI в зависимости от требований к настроенной странице мастера.

  10. Построение решения.

    Примечание.

    Убедитесь, что созданная версия библиотеки DLL является той же платформой процессора, что и установка MDT. Например, если установить 64-разрядную версию MDT, создайте 64-разрядную версию пользовательского редактора страниц.

  11. Создайте файл конфигурации конструктора мастера UDI, чтобы загрузить необходимые библиотеки DLL и сопоставить редактор страницы мастера с соответствующей страницей мастера (файл SamplePage.dll.config в примере).

    Дополнительные сведения об элементах, необходимых для сопоставления между страницей мастера и редактором страниц мастера, см. в разделе Элемент DesignerMappings , дочерние элементы и соответствующие атрибуты.

  12. Скопируйте файл конфигурации конструктора мастера UDI, созданный на предыдущем шаге, в папку installation_folder\Bin\Config (где installation_folder — это папка, в которой установлена версия MDT).

  13. Скопируйте библиотеку DLL для редактора страниц пользовательского мастера в папку installation_folder\Bin (где installation_folder — это папка, в которой установлен MDT).

Создание пользовательских задач UDI

Задачи UDI — это библиотеки DLL, написанные на C++, которые реализуют интерфейс ITask. Зарегистрируйте библиотеку DLL в библиотеке задач конструктора мастера UDI, создав файл конфигурации конструктора мастера UDI (.config файл) и поместив его в папку installation_folder\Bin\Config (где installation_folder — это папка, в которой вы установили MDT).

Примечание.

Вы можете создать библиотеку DLL, содержащую страницы мастера, задачи и проверяющие элементы в одном файле .dll. Вы также можете создать один файл конфигурации конструктора мастера UDI (.config), содержащий параметры конфигурации для страниц мастера, задач и проверяющих элементов в библиотеке DLL.

Создание пользовательских задач UDI

  1. Напишите код, реализующий интерфейс ITask и следующие методы:

    • Инициализация. Этот метод вызывается для инициализации задачи.

    • Выполнить. Этот метод вызывается для выполнения задачи.

  2. Напишите код, который регистрирует настраиваемую фабрику классов задач в реестре фабрики.

  3. Создайте решение для настраиваемой задачи.

    Примечание.

    Убедитесь, что созданная версия библиотеки DLL является той же платформой процессора, что и установка MDT. Например, если установить 64-разрядную версию MDT, то создайте 64-разрядную версию настраиваемой задачи UDI.

  4. Создайте элемент Task в элементе TaskLibrary в файле конфигурации конструктора мастера UDI, аналогично следующему фрагменту:

    <Task DLL="OSDRefreshWizard.dll" Description="Discovers supported applications for install." Type="Microsoft.OSDRefresh.AppDiscoveryTask" Name="Application Discovery">  
       <TaskItem Type="Setter" Name="Status Bitmap">  
          <Param Name="BitmapFilename"/>  
       </TaskItem>  
       <TaskItem Type="Setter" Name="Log File">  
          <Param Name="log"/>  
       </TaskItem>  
       <TaskItem Type="Setter" Name="Write Configuration File">  
          <Param Name="writecfg"/>  
       </TaskItem>  
       <TaskItem Type="Setter" Name="Read Configuration File">  
          <Param Name="readcfg"/>  
       </TaskItem>  
    </Task>  
    

    Примечание.

    Все элементы Task должны содержать параметр BitmapFilename . Укажите все остальные параметры, как это требуется для задачи. Например, в предыдущем фрагменте параметр log используется для указания параметра для расположения файла журнала.

  5. Скопируйте файл конфигурации конструктора мастера UDI, созданный на предыдущем шаге, в папку installation_folder\Bin\Config (где installation_folder — это папка, в которой установлен MDT).

  6. Скопируйте библиотеку DLL для настраиваемой задачи в папку платформы installation_folder\Templates\Distribution\Tools\ (где installation_folder — это папка, в которой вы установили MDT, а платформаx86 для 32-разрядной версии или x64 — для 64-разрядной версии).

Создание настраиваемых проверяющих элементов UDI

Проверяющие элементы UDI — это библиотеки DLL, написанные на C++, которые реализуют интерфейс IValidator . Вы регистрируете библиотеку DLL в библиотеке проверяющего элемента конструктора мастера UDI, создав файл конфигурации конструктора мастера UDI (.config файл) и поместив его в папку installation_folder\Bin\Config (где installation_folder — это папка, в которой вы установили MDT).

Создание настраиваемых проверяющих элементов UDI

  1. Написание кода, который создает подкласс класса BaseValidator и реализует следующие методы:

    • Init(IControl *pControl, IWizardPageContainer *pContainer, IStringProperties *pProperties). Контроллер формы вызывает элемент Init для инициализации проверяющего элемента. Этот метод должен вызывать метод Init для класса BaseValidator . Обычно он считывает все свойства, заданные для проверяющего элемента управления, из файла конфигурации мастера UDI. Например, проверяющий объект InvalidCharactersValidator извлекает значение свойства InvalidChars с помощью этого метода.

    • IsValid. Контроллер формы вызывает этот метод, чтобы проверить, содержит ли элемент управления допустимый текст. Ниже приведен пример метода IsValid для проверяющего элемента, который проверяет, что поле не пусто.

      BOOL IsValid(LPBSTR pMessage)  
      {  
          __super::IsValid(pMessage);  
      
          _bstr_t text;  
          m_pText->GetText(text.GetAddress());  
          return (text.length() > 0);  
      }  
      
    • Init(IControl *pControl, сообщение LPCTSTR). Контроллер формы вызывает этот элемент для каждого нажатия клавиши и других событий, чтобы проверяющий элемент проверял содержимое элемента управления и обновленные сообщения в нижней части страницы мастера (или очищал их).

      Как правило, это единственные методы, которые необходимо переопределить. Однако в зависимости от проверяющего элемента может потребоваться переопределить другие методы в подклассе создаваемого класса BaseValidator . Дополнительные сведения об этих других методах см. в разделе Класс BaseValidator .

  2. Напишите код, который регистрирует пользовательский класс задач в фабрике реестров.

  3. Создайте решение для настраиваемой задачи.

    Примечание.

    Убедитесь, что созданная версия библиотеки DLL является той же платформой процессора, что и установка MDT. Например, если установить 64-разрядную версию MDT, то создайте 64-разрядную версию настраиваемой задачи UDI.

  4. Создайте элемент Validator в элементе ValidatorLibrary в файле конфигурации конструктора мастера UDI, аналогично следующему фрагменту:

    <Validator   
    <Validator DLL="" Description="Must follow a pre-defined pattern" Type="Microsoft.Wizard.Validation.RegEx" Name="NamedPattern">  
       <Param Description="Enter the message you want displayed when the text in this field doesn't match the pattern:" Name="Message" DisplayName="Message"/>  
       <Param Description="The name of a pre-defined regular expression pattern. Must be Username, ComputerName, or Workgroup" Name="NamedPattern" DisplayName="Named Pattern"/>  
    </Validator>  
    

    Предупреждение

    Все элементы проверяющего элемента должны содержать параметр Message . Укажите все остальные параметры, требуемые проверяемым элементом. Например, в предыдущем фрагменте параметр NamedPattern используется для указания параметра для имени предопределенного шаблона регулярного выражения.

  5. Скопируйте файл конфигурации конструктора мастера UDI, созданный на предыдущем шаге, в папку installation_folder\Bin\Config (где installation_folder — это папка, в которой установлен MDT).

  6. Скопируйте библиотеку DLL для настраиваемой задачи в папку платформы installation_folder\Templates\Distribution\Tools\ (где installation_folder — это папка, в которой вы установили MDT, а платформаx86 для 32-разрядной версии или x64 — для 64-разрядной версии).

Справочник по мастеру UDI

Компоненты страницы мастера

Для создания пользовательских страниц можно использовать любой из нескольких предварительно созданных компонентов.

Создание экземпляров компонентов

Мастер UDI использует фабрики классов для создания новых экземпляров объектов. Эти фабрики регистрируются в реестре фабрики, используя строку в качестве ключа фабрики. Например, компонент WmiRepository определяется строкой "Майкрософт. Wizard.WmiRepository", который доступен в файле заголовка IWmiRepository как ID_WmiRepository.

Если вы написали страницу в качестве подкласса WizardPageImpl, можно создать новый экземпляр WmiRepoistory следующим образом:

PWmiRepository pWmi;  
CreateInstance(Container(), ID_WmiRepository, &pWmi);  

Функция CreateInstance — это типобезопасная функция шаблона для создания новых экземпляров компонентов. PWmiRepository — это интеллектуальный указатель, поэтому он обрабатывает подсчет ссылок.

Создаваемые компоненты

Существует набор компонентов, которые можно зарегистрировать в реестре. Первый набор компонентов всегда регистрируется, так как его предоставляет основной исполняемый файл мастера UDI. Два других набора компонентов предоставляются в "необязательных" библиотеках DLL. Чтобы эти компоненты были доступны, библиотека DLL должна быть указана в разделе библиотеки DLL XML-файла .config. Коду не нужно знать, какой исполняемый файл содержит определенный компонент.

Список идентификаторов компонентов для компонентов (имя компонента совпадает с идентификатором, но без начального ID_), зарегистрированных в заводском реестре (определенных в OSDSetupWizard), показан в таблице 3.

Табл. 3. Идентификаторы компонентов

ИД Описание
ID_ACPowerTask (ITask, IWizardComponent) Предполетная задача, которая гарантирует, что компьютер не работает только от батареи
ID_AppDiscoveryTask (ITask, IWizardComponent) Специализированная задача по обнаружению установленных на компьютере программных элементов
ID_BackgroundTask (IBackgroundTask, IWizardComponent) Может использоваться для выполнения задачи в другом потоке
ID_CopyFilesTask (ITask, IWizardComponent) Задача для копирования одного или нескольких файлов
ID_FormController (IFormController) Вам больше всего нравится не создавать экземпляр самостоятельно, так как ваша страница получает свой собственный экземпляр
ID_InvalidCharactersValidator (IValidator) Гарантирует, что текстовое поле не содержит символов из списка, предоставленного проверяющим.
ID_Logger (ILogger) Вам больше всего нравится не создавать экземпляр самостоятельно, так как ваша страница получает указатель на общий экземпляр.
ID_NonEmptyValidator (IValidator) Проверяющий элемент, гарантирующий, что поле не является пустым.
ID_PasswordValidator (IValidator) Проверяющий элемент, гарантирующий, что два текстовых поля не имеют одинакового содержимого.
ID_Regex (IRegEx) Вычисляет регулярные выражения, ищет совпадения
ID_RegExValidator (IValidator) Проверяющий элемент, проверяющий регулярное выражение или известный шаблон
ID_SimpleStringProperties (IStringProperties, ISimpleStringProperties) Простой способ отправки свойств в задачи без использования XML
ID_ShellExecuteTask (ITask, IWizardComponent) Выполнение внешней программы
ID_SummaryBag (ISummaryBag) Доступно косвенно со страницы с помощью метода Form
ID_TaskManager (ITaskManager, IBackgroundCallback, IWizardComponent) Управляет выполнением набора задач и пользовательского интерфейса
ID_WmiRepository (IWmiRepository, IWizardComponent) Позволяет выполнять запросы инструментария управления Windows (WMI)
ID_IXmlDocument (IXmlDocument) Предоставляет фасад для чтения и записи XML-документов

Определенные OSDRefreshWizard.dll, общие страницы и другие компоненты элемента управления показаны в таблицах 4 и 5.

Табл. 4. Элементы управления каталогом

ИД Описание
ID_Directory (IDirectory) Фасад для получения сведений о каталоге из файловой системы

Табл. 5. Определенные SharedPages.dll

ИД Описание
ID_ADHelper (IADHelper) Предоставляет фасад для ограниченного набора функций в доменных службах Active Directory® (AD DS)
ID_CpuInfo (ICpuInfo) Определяет, является ли ЦП 32 или 64-разрядным.
ID_DomainJoinValidator (IDomainJoinValidator) Имеет некоторые методы для проверки того, разрешено ли набор учетных данных для присоединения к домену
ID_DriveList (IDriveList, IBindableList, IWizardComponent) Использует WMI для получения списка дисков на компьютере
ID_WiredNetworkTask (ITask) Задача, которая проверяет, подключены ли вы к сети с помощью жесткого сетевого адаптера (вместо беспроводного)

Компоненты управления

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

Табл. 6. Компоненты

Типы элементов управления "Диалог" Описание
CONTROL_CHECK_BOX (ICheckBox) Фасад для работы с элементами управления флажками
CONTROL_COMBO_BOX (IComboBox) Фасад для элементов управления со списком
CONTROL_GENERIC (IControl) Позволяет работать с большинством типов элементов управления для управления включением и видимым состоянием
CONTROL_LIST_VIEW (IListView) Фасад, предоставляющий доступ к функциям элемента управления представлением списка.
CONTROL_PROGRESS_BAR (IProgressBar) Фасад для работы с положением элемента управления индикатора выполнения
CONTROL_RADIO_BUTTON (IRadioButton) Фасад для работы с переключателями
CONTROL_STATIC_TEXT (IStaticText) Фасад, предоставляющий разрешение на чтение и запись для текста элемента управления, например метки или текстового поля.
CONTROL_TREE_VIEW (ItreeView) Фасад для работы с элементом управления представлением в виде дерева

Компонент списка изображений

Этот компонент является фасадом элемента управления ImageList на странице. Список изображений создается с помощью интерфейса IListView или ITreeView .

Компонент FormController

Мастер создает этот компонент и передает его на страницу. Доступ к нему со страницы можно получить с помощью метода Form , который реализует базовый класс WizardPageImpl .

Компонент InvalidCharacterValidator

Это тип проверяющего элемента, который можно включить на странице. Идентификатор — ID_InvalidCharactersValidator (определенный в IValidator.h), который имеет текстовое значение "Майкрософт. Wizard.Validation.InvalidChars.

Этот проверяющий элемент ищет одно свойство (элемент Setter в файле .config) с именем InvalidChars, которое представляет собой список недопустимых символов. Он проверяет символы в текстовом поле; Если текст содержит какие-либо символы из этого списка, компонент сообщает о сбое.

Компонент NonEmptyValidator

Это тип проверяющего элемента, который можно включить на странице. Идентификатор ID_NonEmptyValidator (определенный в IValidator.h), который имеет текстовое значение "Майкрософт. Wizard.Validation.NonEmpty.

Этот проверяющий объект сообщает о сбое, если текстовое поле (или любой другой элемент управления, поддерживающий IStaticText) имеет пустое строковое значение.

Компонент PasswordValidator

Это тип проверяющего элемента, который можно включить на странице. Идентификатор ID_PasswordValidator (определенный в IValidator.h), который имеет текстовое значение "Майкрософт. Wizard.Validation.Password.

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

Так как для этого проверяющего элемента управления требуются два элемента управления, его требуется больше, чем для других проверяющих элементов. Настройка может выглядеть примерно так:

Form()->AddToGroup(IDC_EDIT_PASSWORD, IDC_EDIT_PASSWORD2);  
PValidator pValidator;  
Form()->AddValidator(IDC_EDIT_PASSWORD, ID_PasswordValidator, pMessage, &pValidator);  
PStaticText pPassword2;  
GetControlWrapper(View(), IDC_EDIT_PASSWORD2, CONTROL_STATIC_TEXT, &pPassword2);  
pValidator->SetProperty(0, pPassword2);  

Во-первых, вы определяете элемент управления Подтверждение пароля в качестве дочернего элемента управления Password . Таким образом, если контроллер формы отключает элемент управления Пароль , он также отключит элемент управления Подтверждение пароля . Затем добавьте в форму проверяющий элемент управления паролем. Наконец, укажите проверяющий элемент управления "Подтверждение пароля " с интерфейсом.

Из-за требования к двум элементам управления необходимо использовать код для настройки этого проверяющего элемента, а не xml-файла .config.

Компонент RegExValidator

Это тип проверяющего элемента, который можно включить на странице. Идентификатор ID_RegExValidator (определенный в IValidator.h), который имеет текстовое значение "Майкрософт. Wizard.Validation.RegEx."

Этот проверяющий элемент управления сравнивает содержимое текстового элемента управления (поддерживающего IStaticText) с регулярным выражением и завершает работу, если текст не соответствует регулярному выражению.

Кроме того, можно использовать этот проверяющий элемент со стандартным именованным шаблоном. Чтобы использовать регулярное выражение, XML-код должен содержать свойство задания с именем Pattern. Если вы хотите вместо этого использовать именованный шаблон, используйте метод задания с именем NamedPattern , для которого задано одно из значений в таблице 7.

Табл. 7. Именованные методы задания шаблонов

Pattern Описание
Username Проверяет, имеет ли текст форму domain\user или user@domain
Computername Имя должно содержать от 1 до 15 символов и не может содержать набор символов (например, : и ?).
Рабочая группа Имя должно содержать от 1 до 15 символов и не может содержать набор символов (например, =, +и ?).

Компонент FactoryRegistry

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

extern "C" __declspec(dllexport) void RegisterFactories(IFactoryRegistry *factories)  
{  
Register<LocationPageFactory>(ID_LocationPage, factories);  
}  

Компонент средства ведения журнала

Этот компонент доступен для вашей страницы с помощью метода ведения журнала (реализован с помощью WizardPageImpl). Этот метод используется для записи записей в файл журнала. Содержимое файла журнала полезно для диагностики проблем, которые пользователи могли запустить мастер UDI.

Компонент PropertyBag

Контейнер свойств — это контейнер для переменных памяти. Он доступен на странице с помощью Container()->Properties(). Переменные памяти полезны для передачи временных данных между разными страницами.

Компоненты TSVariableBag и TSRepository

Компонент TSVariableBag позволяет считывать и записывать переменные последовательности задач. Значения сохраняются в памяти до тех пор, пока пользователь не нажмет кнопку Готово (по умолчанию). Доступ к контейнеру TSVariable можно получить с помощью метода TSVariables страницы (реализованного базовым классом WizardPageImpl ). Эти компоненты регистрируют все операции чтения и записи переменных последовательности задач.

Компонент WmiRepository

Этот компонент предоставляет интерфейс для работы с запросами WMI. Можно вызвать вспомогательную функцию CreateInstance с ID_WmiRepository , чтобы получить экземпляр этого компонента, который поддерживает интерфейс IWmiRepository . Этот компонент возвращает записи результатов через интерфейс IWmiIterator .

Вспомогательные классы страницы мастера

Пользовательские страницы мастера UDI можно создавать с помощью встроенных вспомогательных классов, предоставляемых пакетом SDK для UDI. В таблице 8 перечислены вспомогательные классы, которые можно использовать для создания настраиваемых страниц мастера.

Табл. 8. Вспомогательные классы

Вспомогательный класс Описание
Класс ClassFactoryImpl Это полезный базовый класс для создания фабрики классов, которую затем можно зарегистрировать в реестре фабрики.
Класс шаблона интерфейса Используйте этот класс шаблона, если требуется создать компонент, реализующий несколько интерфейсов.
Класс помощника пути Этот класс предоставляет общие операции с файлами и каталогами.
Класс шаблона указателя Этот класс предоставляет подсчет ссылок для управления временем существования в com-компонентах. По завершении работы с интерфейсами важно освободить интерфейсы. Этот класс шаблона автоматически обрабатывает время существования.
Класс PUnknown Этот класс является интеллектуальным указателем специально для интерфейса IUnknown. Для всех остальных интерфейсов используйте класс шаблона Указателя.
Вспомогательный класс StringUtil Этот класс предоставляет вспомогательные методы, упрощающие работу со строками.
Класс шаблона SubInterface Этот базовый класс упрощает реализацию компонента, поддерживающего интерфейс, который сам наследуется от другого интерфейса.
Класс шаблона UnknownImpl Этот класс обрабатывает большую часть сведений о создании com-компонента.
Класс шаблона WizardComponent Этот базовый класс используется для создания компонентов, которым требуется доступ к службам мастера, например для создания компонентов и ведения журнала.
Класс шаблона WizardPageImpl Этот базовый класс следует использовать в качестве базового класса для всех настраиваемых страниц мастера.

Класс ClassFactoryImpl

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

Ниже приведен фрагмент файла LocationPage.h в примере проекта для определения класса ClassFactoryImpl .

#pragma once  

#include "ClassFactoryImpl.h"  

class LocationPageFactory :public ClassFactoryImpl  
{  
protected:  
    IUnknown *CreateNewInstance();  
};  

Ниже приведен фрагмент файла LocationPage.cpp на странице примера мастера, используемой для определения фабрики классов для этой страницы.

IUnknown *LocationPageFactory::CreateNewInstance()  
{  
    return static_cast<IWizardPage *>(new LocationPage);  
}  

Класс шаблона интерфейса

Используйте этот класс шаблона, если требуется создать компонент, реализующий несколько интерфейсов, например:

classLocationPage :public Interface<IFieldCallback, WizardPageImpl<IDD_LOCATION_PAGE>>  

Этот код создает цепочку базовых классов, которая поддерживает как IFieldCalback , так и интерфейсы, поддерживаемые WizardPageImpl (это IWizardPage).

Класс помощника пути

Этот класс предоставляет общие операции с файлами и каталогами:

static inline std::wstring GetModulePath(HINSTANCE hModule)  

Он также возвращает полный путь к файлу .exe или .dll с дескриптором экземпляра, который вы предоставляете этому методу:

static inline std::wstring GetModuleFilename(HINSTANCE hModule)  

Класс возвращает полный путь и имя файла .exe и .dll файл с дескриптором экземпляра, который вы предоставляете этому методу:

static inline std::wstring GetDirectoryName(LPCWSTR fullName)  

. . . или только путь при обрезание имени файла:

static inline std::wstring GetFileName(LPCWSTR fullName)  

При указании пути с именем файла вспомогательный класс пути возвращает только имя файла:

static inline std::wstring Combine(LPCWSTR path, LPCWSTR name)  

Наконец, класс возвращает новую строку, которая представляет собой объединенный путь и имя файла (или другой путь).

Класс шаблона указателя

Этот класс определен в Pointer.h. Так как com-компоненты используют подсчет ссылок для управления жизненным циклом, важно всегда выпускать интерфейсы по завершении работы с ними. Майкрософт предоставляет класс шаблона, который автоматически обрабатывает время существования. Например, если требуется интеллектуальный указатель для интерфейса XML, можно написать примерно следующее:

Pointer<IXMLDOMNode> pNewChild  
pXmlDom->CreateNode(NODE_ELEMENT, L"MyElement", L"", &pNewChild);  

Первая строка определяет интеллектуальный указатель. Во второй строке показано получение интеллектуального указателя с помощью другого вызова. Оператор & всегда освобождает существующий интерфейс, если он содержит его, и возвращает адрес для внутреннего указателя. После получения указателя, подобного этому, экземпляр указателя вызывает Release для вас, когда переменная выходит за пределы области. Майкрософт рекомендуется использовать интеллектуальные указатели вместо вызова AddRef и Release вручную.

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

PWizardComponent pComp = pUnknown;  
if (pComp != nullptr)  
    pComp->SetContainer(m_pContainer);  

Первая строка вызывает QueryInterface в фоновом режиме для запроса интерфейса IWizardComponent . Полученный интеллектуальный указатель будет равен nullptr, если компонент не поддерживает этот интерфейс.

Класс PUnknown

Этот класс является интеллектуальным указателем специально для интерфейса IUnknown . Для всех остальных интерфейсов используйте класс шаблона Указателя .

Вспомогательный класс StringUtil

Этот класс определен в Utilities.h и предоставляет вспомогательные методы, упрощающие работу со строками:

static inline int CompareIgnore(LPCWSTR first, LPCWSTR second)  

Этот метод сравнивает две строки, игнорируя регистр (см. таблицу 9).

Табл. 9. Вспомогательный класс StringUtil

Возвращаемое значение Описание
0 Строки совпадают, игнорирование регистра
<0 Первая < секунда
>0 Первая > секунда

Пример:

static inline std::wstring Format(LPCWSTR input, int index, LPCWSTR value)  
static inline std::wstring Format(LPCWSTR input, int index, DWORD value)  

Эти методы немного похожи на методы формата .NET Майкрософт в том смысле, что параметры имеют форму {0}. Однако они не выполняют форматирование входных данных— просто подстановка:

static inline std::wstring Printf(std::wstring format, I val)  
static inline std::wstring Printf(std::wstring format, I val1, J val2)  
static inline std::wstring Printf(std::wstring format, I val1, J val2, K val3)  
static inline std::wstring Printf(std::wstring format, I val1, J val2, K val3, L val4)  

Это оболочки вокруг StringCchPrintf , которые возвращают wstring , поэтому вам не нужно выделять память для строк или буферов самостоятельно.

Класс шаблона SubInterface

Этот базовый класс упрощает реализацию компонента, поддерживающего интерфейс, который сам наследуется от другого интерфейса. Например, интерфейс ICheckBox наследуется от IControl. Вот как этот класс используется для определения CheckBoxWrapper:

classCheckBoxWrapper :public SubInterface<IControl, UnknownImpl<ICheckBox> >  

Базовый интерфейс является первым параметром, а производный интерфейс — вторым.

Класс шаблона UnknownImpl

Этот класс определен в UnknownImpl.h и обрабатывает большинство сведений о создании com-компонента. Ниже приведен пример использования этого базового класса:

classDirectory :public UnknownImpl<IDirectory>  

Этот код определяет класс, поддерживающий интерфейс IDirectory .

Класс шаблона WizardComponent

Этот класс определен в IWizardComponent.h и является полезным базовым классом для создания компонентов, которым требуется доступ к службам мастера, таким как создание компонентов и ведение журнала.

Ниже приведен пример определения компонента CopyFilesTask :

classCopyFilesTask :public WizardComponent<ITask>  
{  
    ...  

Параметр для этого класса шаблона — это основной интерфейс, который вы хотите использовать для компонента, который в случае задач — ITask. Использование WizardComponent означает, что компонент поддерживает интерфейс, предоставляемый вами (ITask в этом примере), и IWizardComponent.

При каждом использовании реестра фабрики классов для создания нового компонента реестр вызывает метод IWizardComponent-SetContainer> компонента, чтобы предоставить компоненту доступ к службам мастера.

Класс шаблона WizardPageImpl

Используйте этот класс в качестве базового класса для пользовательских страниц, например:

class LocationPage :public WizardPageImpl<IDD_LOCATION_PAGE>  

Параметр — это идентификатор ресурса для шаблона диалогового окна.

Интерфейсы страниц мастера

Мастер UDI использует интерфейсы для доступа к различным элементам управления на странице. На странице используется функция GetControlWrapper для получения оболочки элемента управления. Пример:

PStaticText pFormat;  
GetControlWrapper(View(), IDC_CHECK_PARTITION, CONTROL_STATIC_TEXT, &pFormat);  

Здесь PStaticText — это интеллектуальный указатель на интерфейс IStaticText . Интеллектуальные указатели автоматически вызывают метод COM Release() при выходе за пределы области или передаче адреса переменной (например &, pFormat) методу.

Интерфейс IADHelper

__interfaceIADHelper : IUnknown  
{  
    HRESULT Init(ILogger *pLogger);  
    HRESULT ValidLogon(LPCTSTR userName, LPCTSTR password, LPCTSTR domain);  
    HRESULT HasAccess(LPCTSTR username, LPCTSTR password, LPCTSTR domain, LPCTSTR computerName, LPCTSTR accountDomain);  
};  

HRESULT Init(ILogger *pLogger)

Инициализируйте этот компонент, передав его в средство ведения журнала, чтобы он смог записывать в журнал сведения.

HRESULTValidLogon(LPCTSTR userName, пароль LPCTSTR, домен LPCTSTR)

Этот метод проверяет, является ли набор учетных данных допустимым, как показано в таблице 10.

Табл. 10. HResultValidLogon

Hresult Описание
S_OK Учетные данные действительны
S_FALSE Недопустимые учетные данные
E_FAIL Не удалось найти контроллер домена; Проверьте журналы для получения сведений
HRESULT HasAccess(имя пользователя LPCTSTR, пароль LPCTSTR, домен LPCTSTR, имя компьютера LPCTSTR, учетная запись LPCTSTRДомен)

Этот метод проверяет, имеет ли набор учетных данных доступ на чтение и запись к объекту компьютера в AD DS, как показано в таблице 11.

Табл. 11. HResult HasAccess

HRESULT Description
S_OK У пользователя есть доступ
E_FAIL У пользователя нет доступа. Дополнительные сведения см. в файле журнала.

Интерфейс IBackgroundTask

__interface IBackgroundTask : IUnknown  
{  
    HRESULT Init(ITask *pTask, int id, IBackgroundCallback *pCallback);  
    void Start(void);  
    BOOL Running(void);  
    HRESULT Wait(DWORD waitMilliseconds);  
    HRESULT Terminate(DWORD exitCode);  
    HRESULT GetExitCode(LPDWORD pCode, HRESULT *pHresult);  
    HRESULT Close(void);  
};  
Обзор

На странице Ход выполнения этот класс используется для выполнения задач в отдельном потоке. Этот класс также можно использовать, когда требуется выполнять операции в отдельном потоке. Задачи — это любой класс, поддерживающий интерфейс ITask .

Этот интерфейс реализуется ID_BackgroundTask ("Майкрософт. Компонент Wizard.BackgroundTask"), определенный в интерфейсе IBackgroundTask.h.

HRESULT Init(ITask *pTask, int id, IBackgroundCallback *pCallback)

Этот интерфейс инициализирует компонент, как показано в таблице 12.

Табл. 12 HRESULT Init

Параметр Описание
pTask Указатель на класс, содержащий код, который требуется запустить в другом потоке
Id Число, которое можно использовать в методе Finished обратного вызова, чтобы указать, какая задача завершена. Полезно при запуске нескольких задач с помощью одного метода обратного вызова
pCallback Класс, реализующий метод Finished , который вызывается каждый раз, когда задача завершает выполнение; вызов метода Finished будет выполняться в фоновом потоке, а не в потоке пользовательского интерфейса.
void Start(void)

Этот метод запускает задачу в фоновом потоке и возвращает элементы, показанные в таблице 13.

Табл. 13. Возвращаемый фоновый поток

Возвращаемое значение Описание
E_INVALIDARG Задача уже запущена, поэтому ее нельзя запустить прямо сейчас.
E_FAIL Возникла проблема с запуском потока.
S_OK Поток запущен.
BOOL Running()

Этот метод возвращает значение TRUE, если фоновая задача выполняется в данный момент, и false, если она не выполняется.

HRESULT Wait(DWORD waitMilliseconds)

Этот метод ожидает, пока поток не перестанет выполняться или не затрачено количество миллисекунда.

HRESULT Terminate(DWORD exitCode)

Этот метод завершает выполнение потока (см. таблицы 14 и таблицу 15). Этот процесс может занять некоторое время после возврата этого метода.

Таблица 14. Код завершения HRESULT

Параметр Описание
exitCode Код выхода, который будет отправлен в метод обратного вызова Finished, который также будет доступен из метода GetExitCode .

Табл. 15. Коды завершения

Возвращаемое значение Описание
E_FAIL Сбой вызова для завершения.
S_OK Запрос на завершение потока выполнен успешно.
HRESULT GetExitCode(LPDWORD pCode, HRESULT *pHresult)

Используйте этот метод для получения результатов выполнения задачи в фоновом потоке (см. таблицу 16).

Табл. 16. Коды результатов

Параметр Описание
pCode Указатель на DWORD , который будет задан при значении return или nullptr , если возвращаемое значение не требуется. При выходе этот параметр имеет значение STILL_ACTIVE , если поток выполняется, код, возвращенный методом Execute задачи, или значение, переданное методу Terminate , если вы вызвали этот метод.
pHresult Указатель на HRESULT , который будет задан при значении return или nullptr , если значение HRESULT не требуется.
HRESULT Close(void)

Этот метод освобождает фоновый поток. Он возвращает E_INVALIDARG , если поток выполняется в данный момент, и S_OK в противном случае.

Интерфейс ICheckBox

__interface ICheckBox : IControl  
{  
    void Check(BOOL check);  
    BOOL IsButtonChecked();  
};  
void Check(BOOL check)

Установите состояние флажка. Если метод имеет значение TRUE, флажок установлен; Если метод имеет значение FALSE, флажок снят.

BOOL IsButtonChecked()

Этот метод сообщает о текущем состоянии флажка.

Интерфейс IComboBox

__interface IComboBox : IControl  
{  
    HRESULT Bind([in] IBindableList *pList);  
    HRESULT Select(int index);  
    int Selected(void);  
    void Add([in] LPCTSTR caption);  
    HRESULT GetText([out, retval] LPBSTR pText);  
    void Clear();  
};  
Обзор

Этот интерфейс реализуется компонентом CheckBoxWrapper . Экземпляр этого компонента извлекается с помощью вспомогательной функции GetControlWrapper с типом CONTROL_COMBO_BOX.

HRESULT Bind([in] IBindableList *pList)

Используйте этот метод при наличии источника данных, реализующего интерфейс IBindableList . Поле списка инициализирует содержимое субтитрами из этого списка.

HRESULT Select(int index)

Выберите элемент в поле со списком по индексу.

int Selected(void)

Этот метод возвращает индекс выбранного элемента или значение -1 , если ничего не выбрано.

void Add([in] LPCTSTR caption)

Вручную добавьте элемент в поле со списком.

HRESULT GetText([out, retval] LPBSTR pText)

Получите строку выбранного в данный момент элемента в поле со списком.

void Clear()

Удалите все элементы из поля со списком.

Интерфейс IControl

__interface IControl : IUnknown  
{  
    HRESULT SetEnable(BOOL enable);  
    BOOL IsEnabled(void);  
    HRESULT SetVisible(BOOL visible);  
};  
Обзор

Этот интерфейс реализуется компонентом ControlWrapper . Экземпляр этого компонента извлекается с помощью вспомогательной функции GetControlWrapper с типом CONTROL_GENERIC.

HRESULT SetEnable(BOOL enable)

Включите или отключите элемент управления.

BOOL IsEnabled(void)

Возвращает значение TRUE, если элемент управления включен, значение FALSE, если это не так.

HRESULT SetVisible(BOOL visible)

Отображение или скрытие элемента управления.

Интерфейс ICpuInfo

__interface ICpuInfo : IUnknown  
{  
    BOOL Is64Bit(void);  
};  
Обзор

Этот интерфейс можно получить, создав новый компонент ID_CpuInfo . Один метод сообщает, является ли ЦП 32 или 64 бит. Обратите внимание, что при наличии 32-разрядной операционной системы на 64-разрядном компьютере этот метод возвращает значение TRUE, так как он сообщает только о ширине ЦП (не операционной системы).

Интерфейс IDirectory
__interface IDirectory : IUnknown  
{  
    BOOL FileExists(LPCWSTR name);  
    BOOL FindFirst([in] LPCWSTR name);  
    HRESULT FoundName([out, retval] LPBSTR name);  
    DWORD FoundAttributes(void);  
    BOOL FindNext(void);  
    void FinishFind(void);  
};  
Обзор

Компонент Directory , который создается с помощью ID_Directory, предоставляет фасад для работы с каталогами в файловой системе.

BOOL FileExists(LPCWSTR name)

Этот метод возвращает значение TRUE, если файл с указанным именем существует.

BOOL FindFirst([in] имя LPCWSTR)

Этот метод находит первое совпадение для указанного имени. Он поддерживает подстановочные знаки и возвращает имена файлов и каталогов. Метод возвращает значение TRUE, если совпадение найдено, в противном случае — FALSE.

HRESULT FoundName([out, retval] имя LPBSTR)

Этот метод извлекает имя файла, найденного с помощью вызова FindFirst или FindNext.

DWORD FoundAttributes(void)

Этот метод возвращает атрибут для последнего найденного файла или каталога. Чтобы проверить, является ли он каталогом, можно использовать следующий код:

pDirectory->FoundAttributes() & FILE_ATTRIBUTE_DIRECTORY  
BOOL FindNext(void)

Найдите следующий. Этот метод возвращает значение TRUE, если было найдено другое совпадение, в противном случае — FALSE.

void FinishFind(void)

Этот метод освобождает ресурсы, используемые для операции Поиска.

Интерфейс IDomainJoinValidator

__interface IDomainJoinValidator : IUnknown  
{  
    HRESULT Init(ILogger *pLogger, IWizardPageContainer *pContainer, IStaticText *pUsername, IStaticText *pPassword, IStaticText *pComputerName);  
    HRESULT IsUsernameValid(LPCWSTR domainName);  
    BOOL CanModifyComputerAdEntry(LPCWSTR domainName);  
};  
Обзор

Экземпляр этого интерфейса можно получить с помощью ID_DomainJoinValidator значение функции шаблона CreateInstance .

HRESULT Init(ILogger *pLogger, IWizardPageContainer *pContainer, IStaticText *pUsername, IStaticText *pPassword, IStaticText *pComputerName)

Инициализируйте экземпляр, как показано в таблице 17.

Табл. 17. HRESULT Init — инициализация экземпляра

Параметр Описание
pLogger Экземпляр средства ведения журнала, доступный для вашей страницы с помощью метода Logger страницы
pContainer Передает результаты из метода Container страницы
pUsername Текстовое поле, содержащее имя пользователя для проверки.
pPassword Текстовое поле, содержащее пароль для проверки.
PComputerName Текстовое поле, содержащее имя компьютера, который в конечном итоге будет присоединен к домену.
HRESULT IsUsernameValid(LPCWSTR domainName)

Этот метод использует метод IADHelper-ValidLogon> для выполнения работы. Дополнительные сведения см. в этом методе.

BOOL CanModifyComputerAdEntry(LPCWSTR domainName)

Проверьте, имеет ли пользователь права на изменение записи компьютера. Большая часть работы выполняется IADHelper-HasAccess>. Если этот метод возвращает значение FALSE, проверьте файл журнала для получения дополнительных сведений.

Интерфейс IDriveList

__interface IDriveList : IUnknown  
{  
    HRESULT Init(IWmiRepository *pWmi);  
    HRESULT SetWhereClause(LPCTSTR whereClause);  
    HRESULT SetMinimumDriveSize(__int64 size);  
    HRESULT Update(void);  
    HRESULT AddProperty(ENUM_DISK_QUERY_SECTION section, LPCTSTR propName, LPCTSTR propNameReturned);  

    size_t Count(void);  
    HRESULT GetProperty(size_t index, LPCTSTR propName,  LPVARIANT value);  
    HRESULT GetCaption(size_t index,  LPBSTR pCaption);  
}  
HRESULT Init(IWmiRepository *pWmi)

Вызовите этот метод перед вызовом других компонентов. Перед вызовом этого метода необходимо создать новый WmiRepository .

HRESULT SetWhereClause(LPCTSTR whereClause)

Этот метод позволяет добавить текст, который будет отображаться в запросе как предложение where. Например, следующая строка возвращает только USB-диски:

pDrives->SetWhereClause(L"WHERE InterfaceType='USB'");  
HRESULT SetMinimumDriveSize(__int64 размер)

Задайте минимальный размер диска (в байтах) для дисков, которые будут возвращены из запроса.

Обновление HRESULT(void)

Выполните запрос. Список дисков, доступный после вызова этого метода, отсортирован по букве диска.

HRESULT AddProperty(ENUM_DISK_QUERY_SECTION раздел, LPCTSTR propName, LPCTSTR propNameReturned)

Этот метод добавляет имена дополнительных свойств, которые необходимо сделать доступными в результатах запроса. Вызовите этот метод перед вызовом Update. В таблице 18 показаны три полезных свойства.

Табл. 18. HRESULT AddProperty: полезные свойства

Section Свойство Описание
DISKQUERY_LOGICALDISK Размер Размер в байтах, представленный в виде строки
DISKQUERY_DISKPARTITION DiskIndex Номер диска в виде целого числа, начиная с 0
DISKQUERY_LOGICALDISK VolumeName Метка тома
size_t Count(void)

Количество записей, возвращаемых запросом. Вызовите Update перед вызовом этого метода.

HRESULT GetProperty(size_t index, LPCTSTR propName, LPVARIANT value)

Этот метод извлекает значение свойства из результатов запроса, как показано в таблице 19.

Табл. 19. HRESULT GetProperty

Параметр Описание
Индекс; Отсчитываемый от нуля индекс для результирующей записи
propName Имя свойства, например "Размер"
Value (Значение) При возврате этот параметр содержит значение variant свойства.
HRESULT GetCaption(size_t index, LPBSTR pCaption)

Этот метод получает заголовок для записи, которая совпадает со свойством Caption .

Интерфейс IImageList

__interface IImageList  
{  
    HRESULT CreateImageList(int width, int height, UINT flags);  
    HImageList GetImageList(void);  
    int AddImage(HInstance hInstance, int resourceId);  
};  
Обзор

Этот интерфейс реализуется компонентом ImageList . Экземпляр этого компонента извлекается из интерфейса IListView .

HRESULT CreateImageList(ширина int, int height, флаги UINT)

Создайте список образов, которыми управляет этот компонент. Вызовите этот метод только один раз.

HImageList GetImageList(void)

Этот метод возвращает дескриптор для списка изображений на случай, если необходимо выполнить другие операции со списком изображений.

int AddImage(HInstance hInstance, int resourceId)

Добавьте новое изображение в список изображений из ресурса, как показано в таблице 20.

Табл. 20. Интерфейс HRESULT IImageList

Параметр Описание
hInstance Дескриптор экземпляра модуля, содержащего ресурс растрового изображения
resourceId Идентификатор ресурса для загрузки в список изображений

Интерфейс IListView

__interface IListView : IControl  
{  
    int AddItem([in] LPCTSTR text);  
    int AddColumn(int width, [in] LPCTSTR text);  
    HRESULT SetSubItem(int index, int column, [in] LPCTSTR text);  
    int GetWidth(void);  
    void SetExtendedStyle(DWORD style);  
    int GetSelectedItem(void);  
    HRESULT SelectItem(int index);  
    BOOL IsItemChecked(int index);  
    int GetItemCount(void);  
    HRESULT CreateImageList(int width, int height, UINT flags);  
    int AddImage(HINSTANCE hInstance, int resourceId);  
    HRESULT SetImage(int index, int imageIndex);  
    HRESULT Clear(void);  
};  
Обзор

Этот интерфейс реализуется компонентом ControlWrapper . Экземпляр этого компонента извлекается с помощью вспомогательной функции GetControlWrapper с типом CONTROL_LIST_VIEW.

int AddItem([in] текст LPCTSTR)

Добавьте новую строку в список. Метод возвращает индекс только что добавленного элемента.

int AddColumn(int width, [in] текст LPCTSTR)

Добавьте новый столбец в представление списка.

HRESULT SetSubItem(int index, int column, [in] текст LPCTSTR)

Задайте текст в столбце, отличном от первого столбца в списке, как показано в таблице 21.

Табл. 21. HRESULT SetSubItem

Параметр Описание
index Индекс элемента списка, который требуется изменить.
Столбца Индекс столбца, который требуется обновить; первый столбец задается с помощью AddItem, столбцы два и следующие задаются с помощью этого метода
text Строка, отображаемая в столбце
int GetWidth(void)

Этот метод возвращает ширину всего текстового поля.

void SetExtendedStyle(стиль DWORD)

Этот метод позволяет задать расширенные стили в списке, например:

m_pList->SetExtendedStyle(LVS_EX_FULLROWSELECT);  
int GetSelectedItem(void)

Этот метод возвращает индекс выбранного элемента представления списка.

HRESULT SelectItem(int index)

Задайте для выбранного элемента в списке этот индекс.

BOOL IsItemChecked(int index)

Этот метод возвращает значение TRUE, если выбран элемент в списке. Для этого метода требуется вызвать Метод SetExtendedStyle , чтобы задать стиль флажка.

int GetItemCount(void)

Этот метод возвращает количество элементов в представлении списка.

HRESULT CreateImageList(ширина int, int height, флаги UINT)

Создайте список изображений и вложите его в представление списка.

int AddImage(HINSTANCE hInstance, int resourceId)

Добавьте изображение в список изображений представления списка. Сначала необходимо вызвать CreateImageList.

HRESULT SetImage(int index, int imageIndex)

Задайте изображение, которое будет отображаться слева для определенного элемента представления списка.

HRESULT Clear(void)

Удалите все элементы из представления списка.

Интерфейс IProgressBar

__interface IProgressBar : IControl  
{  
    HRESULT SetPercentage(int position);  
    int GetPercentage(void);  
};  
Обзор

Этот интерфейс реализуется компонентом ProgressBarWrapper . Экземпляр этого компонента извлекается с помощью вспомогательной функции GetControlWrapper с типом CONTROL_PROGRESS_BAR.

HRESULT SetPercentage(int position)

Задайте положение индикатора выполнения с помощью числа от 0 до 100. По умолчанию новые индикаторы выполнения Win32® имеют максимальный диапазон 100.

int GetPercentage(void)

Этот метод возвращает текущую позицию индикатора выполнения.

Интерфейс IRadioButton

__interface IRadioButton : IControl  
{  
public:  
    void SetGroup(int firstId, int lastId);  
    void CheckRadio(int id);  
    BOOL IsButtonChecked(int id);  
    void EnableRadio(int id, BOOL enable);  
};  
Обзор

Этот интерфейс реализуется компонентом RadioButtonWrapper . Экземпляр этого компонента извлекается с помощью вспомогательной функции GetControlWrapper с типом CONTROL_RADIO_BUTTON.

void SetGroup(int firstId, int lastId)

Укажите в оболочке диапазон переключателей, которые следует рассматривать как группу. Вызовите этот метод перед вызовом CheckRadio.

void CheckRadio(int id)

Задайте для определенной переключатели одну кнопку в группе выбранных переключателей. Вызовите SetGroup перед вызовом этого метода.

BOOL IsButtonChecked(int id)

Этот метод возвращает значение TRUE, если переключатель выбран, в противном случае — ЗНАЧЕНИЕ FALSE.

void EnableRadio(int id, BOOL enable)

Этот метод включает или отключает переключатель.

Интерфейс IStaticText

__interface IStaticText : IControl  
{  
    HRESULT SetText([in] LPCTSTR pText);  
    HRESULT GetText([out, retval] LPBSTR pText);  
};  
Обзор

Этот интерфейс реализуется компонентом StaticTextWrapper . Экземпляр этого компонента извлекается с помощью вспомогательной функции GetControlWrapper с типом CONTROL_STATIC_TEXT.

HRESULT SetText([in] LPCTSTR pText)

Задайте текст для элемента управления.

HRESULT GetText([out, retval] LPBSTR pText)

Этот метод возвращает текущее значение текста для элемента управления .

Интерфейс ITask

__interface IControl : IUnknown  
{  
    HRESULT Init(IStringProperties *pProperties, ISettingsProperties *pTaskSettings);  
    HRESULT Execute(LPDWORD pReturnCode);  
};  

Реализуйте этот интерфейс, если вы хотите, чтобы компонент был доступен в качестве задачи на странице предварительной проверки или если вы хотите использовать компонент BackgroundTask для выполнения работы в фоновом потоке.

Ниже приведены компоненты, реализующие интерфейс ITask :

  • ID_ShellExecuteTask, L"Майкрософт. Wizard.ShellExecuteTask"

  • ID_CopyFilesTask, L"Майкрософт. Wizard.CopyFilesTask"

  • ID_ACPowerTask, L"Майкрософт. OSDRefresh.ACPowerTask"

  • ID_WiredNetworkTask, L"Майкрософт. SharedPages.WiredNetworkTask"

Инициализация
HRESULT Init(IStringProperties *pProperties, ISettingsProperties *pTaskSettings)  

Если вы пишете задачу для страницы предварительной проверки, вызовите этот метод для инициализации задачи. Файл .config содержит XML-код, который может выглядеть примерно так:

<Task DisplayName="Check Windows Scripting Host" Type="Microsoft.Wizard.ShellExecuteTask">  
  <Setter Property="filename">%windir%\system32\cscript.exe</Setter>  
  <Setter Property="parameters">Preflight\OSDCheckWSH.vbs</Setter>  
  <Setter Property="BitmapFilename">images\WinScriptHost.bmp</Setter>  
  <ExitCodes>  
    <ExitCode State="Success" Type="0" Value="0" Text="" />  
    <ExitCode State="Error" Type="-1" Value="*" Text="Windows Scripting Host not installed." />  
  </ExitCodes>  
</Task>  

Параметр pProperties предоставляет доступ к трем значениям задания, а параметр pTaskSettings предоставляет доступ к элементу Task и дочерним элементам. Большинству задач требуется только чтение данных из параметра pProperties .

Выполнение
HRESULT Execute(LPDWORD pReturnCode)  

Здесь вы пишете код, который выполняет задачу. Этот метод должен возвращать S_OK , если ошибок не было, и может возвращать другой HRESULT , если во время выполнения задачи произошла ошибка. Значения, отличные от S_OK , возвращаемые этим методом, сопоставляются с <элементами Error> в <разделе ExitCodes> , если вы используете страницу предварительной проверки.

Параметр pReturnCode должен быть обновлен числом, сообщающим о состоянии задачи. Эти значения сопоставляются на странице предварительных просмотров с <элементами ExitCode> .

Интерфейс ITreeView

__interface ITreeView : IControl  
{  
    void EnableCheckboxes(void);  
    HRESULT CreateImageList(int width, int height, UINT flags);  
    int AddImage(HINSTANCE hInstance, int resourceId);  

    HTREEITEM AddItem(LPCTSTR text, HTREEITEM hParent = NULL);  
    void SetImage(HTREEITEM item, int image, int expandImage);  

    void Clear(void);  
    BOOL SetFirstVisible(HTREEITEM item);  
    BOOL SelectItem(HTREEITEM item);  
    void CheckItem(HTREEITEM item, UINT checkState);  
    HTREEITEM SelectedItem(void);  
    int SetItemHeight(SHORT height);  
    HRESULT EnableItem(HTREEITEM item, BOOL enable);  
    void Expand(HTREEITEM hItem, BOOL expand);  

    HTREEITEM GetChild(HTREEITEM hParent);  
    HTREEITEM GetParent(HTREEITEM hNode);  
    HTREEITEM GetNextItem(HTREEITEM hPrevious);  

    UINT IsChecked(HTREEITEM item);  
    BOOL IsEnabled(HTREEITEM item);  

    INT_PTR CommonControlEvent(WORD controlId, void* pInfo, BOOL *pCancel);  
    HRESULT SetEventHandler(ITreeViewEvent *pEventHandler);  

    void SetSelectedBackColor(COLORREF color);  
};  
Обзор

Этот интерфейс реализуется компонентом TreeViewWrapper . Экземпляр этого компонента извлекается с помощью вспомогательной функции GetControlWrapper с типом CONTROL_TREE_VIEW.

void EnableCheckboxes(void)

Этот метод включает флажки в элементе управления представление в виде дерева, задав стиль TVS_CHECKBOXES .

HRESULT CreateImageList(ширина int, int height, флаги UINT)

Добавьте новый список изображений в элемент управления представление в виде дерева. Параметр flags передается в вызове функции Win32 ImageList_Create .

int AddImage(HINSTANCE hInstance, int resourceId)

Добавьте изображение в список образов из ресурса (resourceId) в модуле с помощью дескриптора экземпляра hInstance.

HTREEITEM AddItem(LPCTSTR text, HTREEITEM hParent = NULL)

Добавьте узел в представление дерева. Новый узел будет добавлен на верхнем уровне, если hParent имеет значение NULL. В противном случае предоставьте дескриптор родительскому элементу, куда нужно добавить новый элемент. Этот метод возвращает дескриптор новому элементу.

void SetImage(элемент HTREEITEM, int image, int expandImage)

Задайте изображение для использования для элемента представления в виде дерева. Можно задать как обычный, так и развернутый образ.

void Clear(void)

Удалите все элементы из представления дерева.

BOOL SetFirstVisible(элемент HTREEITEM)

Убедитесь, что элемент представления дерева виден. Представление дерева будет прокручиваться, если это необходимо, чтобы сделать этот элемент видимым.

BOOL SelectItem(элемент HTREEITEM)

Задайте для текущего выбранного элемента указанный элемент. После этого можно вызвать SetFirstVisible , чтобы убедиться, что только что выбранный элемент отображается.

void CheckItem(элемент HTREEITEM, UINT checkState)

Метод в основном задает изображение, которое будет отображаться для флажка в представлении дерева. Эти изображения находятся в отдельном элементе управления ImageList , которым управляет представление дерева. По умолчанию этот список изображений содержит три изображения, показанные в таблице 22.

Таблица 22.void CheckItem Image List Default

checkState Описание
0 "Пустой".
1 Очищены
2 Выбрано
HTREEITEM SelectedItem(void)

Этот метод возвращает дескриптор выбранного элемента представления дерева.

int SetItemHeight(SHORT height)

Этот метод задает высоту всех элементов в элементе управления представлением в виде дерева в пикселях. Он возвращает предыдущую высоту в пикселях.

HRESULT EnableItem(элемент HTREEITEM, BOOL enable)

Этот метод включает или отключает один элемент в дереве. Отключение элемента с дочерними элементами не приведет к отключению дочерних элементов.

void Expand(HTREEITEM hItem, BOOL expand)

Этот метод расширяет или сворачивает узел в дереве.

HTREEITEM GetChild(HTREEITEM hParent)

Этот метод возвращает первый дочерний элемент элемента представления дерева или значение NULL, если дочерние элементы отсутствуют.

HTREEITEM GetParent(HTREEITEM hNode)

Этот метод возвращает дескриптор родительского узла в представлении дерева или значение NULL, если узел находится на верхнем уровне.

HTREEITEM GetNextItem(HTREEITEM hPrevious)

Этот метод можно вызвать с помощью дескриптора, который GetChild возвращает для итерации всех дочерних элементов узла. Этот метод возвращает следующий одноуровневый элемент в дереве, который использует один и тот же родительский элемент.

UINT IsChecked(элемент HTREEITEM)

Этот метод возвращает значение 0 , если узел представления дерева не выбран, и 1 , если он имеет значение .

BOOL IsEnabled(элемент HTREEITEM)

Этот метод возвращает значение TRUE, если узел представления дерева включен, в противном случае — ЗНАЧЕНИЕ FALSE.

INT_PTR CommonControlEvent(WORD controlId, void* pInfo, BOOL *pCancel)

Этот метод предназначен только для внутреннего использования.

HRESULT SetEventHandler(ITreeViewEvent *pEventHandler)

Вызовите этот метод, если вы хотите получать уведомление при изменении выбранного элемента или изменения пользователем состояния проверки элемента представления дерева. Для получения этих обратных вызовов необходимо реализовать ITreeViewEvent в компоненте.

void SetSelectedBackColor(COLORREF color)

Задайте цвет фона, используемый для выбранного элемента.

Интерфейс IWmiIteration

__interface IWmiIterator : IUnknown  
{  
    HRESULT Next(void);  
    HRESULT GetProperty(LPCTSTR propertyName, [out] LPVARIANT pValue);  
};  
Обзор

Этот интерфейс обычно используется вместе с IWmiRepository при работе с вызовами WMI. Интерфейс IWmiIteration позволяет выполнять итерацию значений, возвращаемого запросом.

HRESULT Next(void)

Перейдите к следующему элементу в результатах запроса, как показано в таблице 23.

Табл. 23. HRESULT Next(void) Query Returns

HRRESULT Описание
S_OK Перемещен к следующему результату; Для получения свойств этого результата можно использовать GetProperty .
S_FALSE В списке больше нет элементов.
E_NOT_SET Нет результатов запроса
HRESULT GetProperty(LPCTSTR propertyName, [out] LPVARIANT pValue)

Этот метод извлекает значение свойства из текущей записи результата, как показано в таблицах 24 и 25.

Табл. 24. HRESULT GetProperty

Параметр Описание
propertyName Имя свойства, которое требуется извлечь
pValue Указывает на структуру VARIANT, которая при возврате содержит значение свойства

Табл. 25. HRESULT GetProperty Result

HRESULT Описание
S_OK Было извлечено значение свойства.
WBEM_E_NOT_FOUND Свойство с именем отсутствует.
E_NOT_VALID_STATE Отсутствует текущая запись.

Примечание.

Метод GetProperty может возвращать другие коды ошибок WMI, отличные от перечисленных в таблице 25. Перечисленные значения являются общими возвращаемыми результатами.

Интерфейс IWmiRepository

__interface IWmiRepository : IUnknown  
{  
    HRESULT SetNamespace(LPCWSTR namespaceName);  
    HRESULT ExecQuery(LPCWSTR query, [out] IWmiIterator **ppIterator);  
};  
Обзор

Этот интерфейс реализуется компонентом WmiRepository (ID_WmiRepository).

HRESULT SetNamespace(LPCWSTR namespaceName)

Этот метод задает пространство имен WMI, которое будет использоваться для запроса. Вызовите этот метод перед вызовом ExecQuery. Если не вызвать этот метод, пространство имен будет иметь значение root\cimv2. Этот метод всегда возвращает S_OK.

HRESULT ExecQuery(LPCWSTR query, [out] IWmiIterator **ppIterator)

Выполните запрос к набору пространства имен WMI с вызовом SetNamespace, как показано в таблицах 26 и 27.

Табл. 26. HRESULT ExecQuery

Параметр Описание
Query Строка для запроса WMI, который требуется выполнить.
ppIterator Передайте указатель на указатель интерфейса, который при возврате будет заполнен интерфейсом, предоставляя доступ к результатам запроса.

Табл. 27. Результат запроса HRESULT

HRESULT Описание
S_OK Запрос выполнен успешно
Other Если запрос не выполнен, возвращает WMI HRESULT.

Интерфейс IFormController

__interface IFormController : IUnknown  
{  
    Init(IWizardPageView *pView, IWizardPageContainer *pContainer);  
    SetPageInfo(ISettingsProperties *pPageInfo);  

    Validate(void);  

    AddToGroup(int groupControlId, int controlId);  
    UpdateCheckGroup(int groupControlId);  
    AddValidator(int controlId, IValidator *pValidator, IControl *pCOntrol = 0);  

    AddValidator(int controlId, LPCWSTR validatorId, LPCWSTR message, IValidator **ppValidator = nullptr);  
    DisableValidation(int controlId, BOOL disable);  

    AddField(LPCWSTR fieldName, int controlId, BOOL suppressLog, DialogControlTypes type);  
    AddRadioGroup(LPCWSTR groupName, int radioControlId);  
    EnableRadioGroup(LPCWSTR groupName, BOOL enable);  
    InitFields(IFieldCallback *pFieldCallback = nullptr);  
    SaveFields(IFieldCallback *pFieldCallback = nullptr);  
    BOOL IsFieldDisabled(int controlId);  

    InitSection(LPCWSTR key, LPCWSTR sectionCaption);  
    AddSummaryItem(LPCWSTR first, LPCWSTR second);  
    SuppressLogValue(LPCWSTR tsVariableName);  
    SaveText(int controlId, LPCWSTR tsVariableName, LPCWSTR summaryCaption);  
    LoadText(int controlId, LPCWSTR tsVariableName);  

    void ControlEvent(WORD eventId, WORD controlId);  
    BOOL IsValid(void);  
 };  
Обзор

Каждая страница мастера UDI имеет собственный контроллер формы, реализующий этот интерфейс. Этот контроллер используется для подключения данных полей в XML-файле .config к элементам управления на странице. Затем контроллер формы обрабатывает многие сведения.

Настройка формы

Как правило, настройте контроллер формы в методе OnWindowCreated вашей страницы. Это обычно включает вызов методов, показанных в таблице 28.

Табл. 28. Метод OnWindowCreated

Метод Описание
Инициализация Инициализирует контроллер формы
AddField Обеспечивает соединение между полем в XML-файле .config, которое является строковым именем, и элементом управления в диалоговом окне страницы, который является идентификатором.
AddRadioGroup Используется для подключения переключателя к группе и элементу управления в диалоговом окне
AddToGroup Позволяет использовать дочерние элементы управления, которые включены или отключены вместе с родительскими элементами или в зависимости от выбранного переключателя.
InitFields Вызовите после вызова всех методов Add для настройки формы
Validate Выполняет начальную проверку
Обработка событий формы

Добавьте следующий вызов в метод OnControlEvent :

Form()->ControlEvent(eventId, controlId);  

Этот вызов передает события в контроллер формы, чтобы он смог обрабатывать события, связанные с формой.

Сохранение данных формы

В методе OnNextClicked вызовите методы формы, показанные в таблице 29.

Табл. 29. Метод OnNextClicked

Метод Описание
InitSection Предоставляет имя раздела, который будет отображаться на странице Сводка для этой страницы.
SaveFields Сохранение значений полей в переменных последовательности задач и на странице Сводка
Инициализация
HRESULT Init(IWizardPageView *pView, IWizardPageContainer *pContainer)  

Обычно этот метод вызывается рядом с началом метода OnWindowCreated вашей страницы. Команда должна выглядеть примерно так:

Form()->Init(View(), Container());  
SetPageInfo
HRESULT SetPageInfo(ISettingsProperties *pPageInfo)  

Этот метод вызывается внутренне, и не следует вызывать его самостоятельно. Он предоставляет xml-код страницы контроллеру формы.

Проверка
HRESULT Validate(void)  

Этот метод выполняет все проверяющие элементы, присоединенные к элементам управления. Если проверяющий элемент не проходит, контроллер формы отображает предупреждающее сообщение и отключает кнопку Далее , а затем останавливает обработку проверяющих элементов. Как правило, этот метод необходимо вызвать только в конце метода OnWindowCreated . он всегда возвращает S_OK.

AddToGroup
AddToGroup(int groupControlId, int controlId)  

Этот метод добавляет элемент управления в качестве "дочернего" флажка или переключателя, как показано в таблице 30. Все такие дочерние элементы управления будут отключены, если родительский элемент управления не выбран. Метод всегда возвращает S_OK.

Табл. 30. AddToGroup

Параметр Описание
groupControlId Идентификатор флажка или переключателя, которые будут управлять состоянием включения дочернего элемента управления.
Контролируемый Идентификатор элемента управления, который вы хотите добавить в качестве дочернего элемента управления.
UpdateCheckGroup
HRESULT UpdateCheckGroup(int groupControlId)  

Этот метод обновляет состояние включения или отключения дочерних элементов управления группы на основе состояния родительского элемента управления. Как правило, вам не нужно вызывать этот метод самостоятельно, так как контроллер формы вызывает его за вас.

AddValidator
HRESULT AddValidator(int controlId, IValidator *pValidator, IControl *pControl = 0)  

Вызывайте этот метод, только если у вас есть проверяющий элемент, который вы хотите создать в коде, а не с xml. Этот метод всегда возвращает S_OK.

AddValidator
HRESULT AddValidator(int controlId, LPCWSTR validatorId, LPCWSTR message, IValidator **ppValidator = nullptr)  

Вызывайте этот метод, только если у вас есть проверяющий элемент, который вы хотите создать в коде, а не с xml.

DisableValidation
HRESULT DisableValidation(int controlId, BOOL disable)  

Вызовите этот метод, чтобы явно отключить проверяющий элемент управления или восстановить обычную проверку, как показано в таблице 31. Этот метод полезен, например, если у вас есть правила включения и отключения для элементов управления, которые не охвачены проверкой формы, и вам нужно отключить проверку для элемента управления. Другими словами, этот метод обычно не вызывается. Этот метод всегда возвращает S_OK.

Табл. 31. HRESULT DisableValidation

Параметр Описание
Controlid Элемент управления, для которого требуется включить или отключить проверку.
Disable Задайте значение TRUE, чтобы отключить проверку, и значение FALSE, чтобы восстановить обычную проверку.
AddField
HRESULT AddField(LPCWSTR fieldName, int controlId, BOOL suppressLog, DialogControlTypes type)  

Добавьте сопоставление элемента управления между именем в элементе Field XML-файла .config и идентификатором элемента управления в диалоговом окне страницы, как показано в таблице 32. Этот метод необходимо вызвать перед вызовом InitFields, так как InitFields использует эти сведения. Этот метод всегда возвращает S_OK.

Таблица 32. HRESULT AddField

Параметр Описание
Fieldname Имя поля, отображаемого в XML-коде страницы
Controlid Идентификатор элемента управления в шаблоне диалогового окна страницы
suppressLog Задайте значение TRUE, если значения из этого поля не записываются в файл журнала; всегда присвойте этому параметру значение TRUE для полей пароля или ПИН-кода.
Тип Тип элемента управления, который является одним из следующих:

- CONTROL_STATIC_TEXT
- CONTROL_COMBO_BOX
- CONTROL_LIST_VIEW
- CONTROL_PROGRESS_BAR
- CONTROL_GENERIC
- CONTROL_RADIO_BUTTON
- CONTROL_CHECK_BOX
- CONTROL_TREE_VIEW
AddRadioGroup
HRESULT AddRadioGroup(LPCWSTR groupName, int radioControlId)  

Этот метод добавляет элемент управления в именованную группу переключателей, как показано в таблице 33. Его необходимо вызвать перед методом InitFields , так как этот метод использует атрибуты элемента RadioGroup для управления параметрами для всех элементов управления переключателями в группе. Группы радиосвязи можно заблокировать, например, чтобы все переключатели были отключены, но дочерние элементы управления включены или отключены только в зависимости от выбранного переключателя. Этот метод всегда возвращает S_OK.

Таблица 33. HRESULT AddRadioGroup

Параметр Описание
Groupname Строка, определяющая группу переключателей на этой странице.
radioControlId Идентификатор одного переключателя, добавляемого в эту группу
EnableRadioGroup
HRESULT EnableRadioGroup(LPCWSTR groupName, BOOL enable)  

Этот метод позволяет включить или отключить всю группу переключателей. Отключение группы переключателей отключает все элементы управления переключателями в группе, а также все дочерние элементы переключателей, добавленных с помощью AddToGroup. См. таблицу 34 и таблицу 35.

Таблица 34. EnableRadioGroup

Параметр Описание
Groupname Имя группы переключателей, которая уже определена при вызове AddRadioGroup
Enable Задайте значение TRUE, чтобы включить группу переключателей, и значение FALSE, чтобы отключить группу.

Таблица 35. HRESULT EnableRadioGroup

HRESULT Описание
S_OK Группа включена или отключена
E_INVALIDARG Отсутствует группа переключателей с указанным именем
InitFields
HRESULT InitFields(IFieldCallback *pFieldCallback = nullptr)  

Перед вызовом этого метода вызовите AddField для каждого поля, которым может управлять XML-код. Этот метод всегда возвращает S_OK.

Параметр pFieldCallback является необязательным. Если он указан, контроллер формы вызывает SetFieldDefault для элементов управления, которые не являются CONTROL_STATIC_TEXT или CONTROL_CHECK_BOX. Это позволяет извлечь значение по умолчанию из XML-кода и самостоятельно задать его в элементе управления.

SaveFields
HRESULT SaveFields(IFieldCallback *pFieldCallback = nullptr)  

Этот метод сохраняет значения полей в переменных последовательности задач и в сводных данных, которые будут отображаться на странице Сводка . Предоставление указателя в pFieldCallback позволяет обрабатывать сохранение значений для элементов управления, которые не поддерживают CONTROL_STATIC_TEXT.

IsFieldDisabled
BOOL IsFieldDisabled(int controlId)  

Этот метод позволяет определить, отключено ли поле в XML-коде.

InitSection
HRESULT InitSection(LPCWSTR key, LPCWSTR sectionCaption)  

Этот метод инициализирует сводные данные, которые будут отображаться на странице Сводка , как показано в таблице 36. Вызовите этот метод в методе OnNextClicked перед вызовом SaveFields. Этот метод всегда возвращает S_OK.

Таблица 36. HRESULT InitSection

Параметр Описание
Ключ Этот параметр должен быть уникальным для вашей страницы. Он используется для того, чтобы убедиться, что каждая страница содержит собственные сводные сведения.
sectionCaption Заголовок, который будет отображаться на странице Сводка для сводных сведений этой страницы. Как правило, в качестве значения этого параметра используется DisplayName().
AddSummaryItem
HRESULT AddSummaryItem(LPCWSTR first, LPCWSTR second)  

Этот метод позволяет добавлять элементы сводки на страницу Сводка над элементами, заданными в XML-коде, и за их пределами. См. таблицу 37.

Таблица 37. HRESULT AddSummaryItem

Параметр Описание
First Заголовок для элемента сводки, который отображается слева
Second Значение, которое будет отображаться справа
SuppressLogValue
HRESULT SuppressLogValue(LPCWSTR tsVariableName)  

Вызовите этот метод для переменных последовательности задач, для которых значения не должны записываться в файл журнала. Вызовите этот метод для переменных последовательности задач, которые хранят пароли, ПИН-коды или другие конфиденциальные значения, которые может ввести пользователь.

SaveText
HRESULT SaveText(int controlId, LPCWSTR tsVariableName, LPCWSTR summaryCaption)  

Этот метод сохраняет значение текстового элемента управления как в переменной последовательности задач, так и в разделе сводки. Как правило, вам не нужно вызывать этот метод самостоятельно, так как контроллер формы делает это для всех полей. См. таблицу 38.

Таблица 38. HRESULT SaveText

Параметр Описание
Controlid Идентификатор текстового поля, содержащего значение, которое требуется сохранить (или любой другой элемент управления, который может возвращать текст).
tsVariableName Имя переменной последовательности задач, которую требуется изменить
summaryCaption Заголовок на странице Сводка для этого значения
LoadText
HRESULT LoadText(int controlId, LPCWSTR tsVariableName)  

Этот метод считывает значение переменной последовательности задач и задает это значение в текстовом поле.

ControlEvent
void ControlEvent(WORD eventId, WORD controlId)  

Вызовите этот метод в методе OnControlEvent , чтобы убедиться, что контроллер формы может обрабатывать события управления, что ему необходимо сделать для правильной работы. Значения, передаваемые этому методу, являются теми же значениями, которые передаются методу OnControlEvent .

IsValid
BOOL IsValid(void)  

Этот метод возвращает состояние последней проверки формы. Если какой-либо из проверяющих элементов управления сообщил об ошибке, этот метод возвращает значение FALSE. Иными словами, он возвращает значение TRUE, только если все элементы управления на странице являются допустимыми.

Интерфейс IValidator

__interface IValidator : IUnknown  
{  
    HRESULT Init(IControl *pControl, LPCTSTR message);  
    HRESULT Init(IControl *pControl, IWizardPageContainer *pContainer, IStringProperties *pProperties);  
    BOOL, IsValid(LPBSTR pMessage);  
    HRESULT SetProperty(int propertyId, LPVARIANT pValue);  
    HRESULT SetProperty(int propertyId, IUnknown *pUnknown);  
    HRESULT SetProperty)(int propertyId, LPCTSTR pValue);  
};  
Обзор

Проверяющие элементы — это компоненты, которые могут проверять один элемент управления на странице. Самый простой способ реализовать проверяющий элемент — сделать его подклассом класса BaseValidator , который определен в файле заголовка BaseValidator.h.

HRESULT Init(IControl *pControl, сообщение LPCTSTR)

При создании проверяющего элемента в коде можно вызвать этот метод для инициализации проверяющего элемента. См. таблицу 39.

Таблица 39. HRESULT Init

Параметр Описание
pControl Элемент управления, который должен проверить проверяющий элемент управления
Сообщение Сообщение, отображаемое на странице, если элемент управления недопустим
HRESULT Init(IControl *pControl, IWizardPageContainer *pContainer, IStringProperties *pProperties)

Контроллер формы вызывает этот метод для инициализации проверяющих элементов, создаваемых на основе XML-кода страницы. См. таблицу 40.

Таблица 40. Метод HRESULT Init

Параметр Описание
pControl Элемент управления, который должен проверить проверяющий элемент управления
pContainer В случае, если проверяющий элементу требуется доступ к средству ведения журнала или требуется создать другие компоненты
pProperties Предоставляет доступ к свойствам (элементам задания) для проверяющего элемента
BOOL, IsValid(LPBSTR pMessage)

Этот метод возвращает значение TRUE, если элемент управления действителен, или FALSE, если элемент управления недопустим. После возврата pMessage должен быть заполнен новым BSTR , который содержит сообщение для отображения, если элемент управления недопустим.

HRESULT SetProperty(int propertyId, LPVARIANT pValue)

Этот метод можно реализовать, если требуются дополнительные значения, которые не указаны в XML-коде.

HRESULT SetProperty(int propertyId, IUnknown *pUnknown)

Этот метод можно реализовать, если требуются дополнительные значения, которые не указаны в XML-коде.

HRESULT SetProperty)(int propertyId, LPCTSTR pValue)

Этот метод можно реализовать, если требуются дополнительные значения, которые не указаны в XML-коде.

Интерфейс IRegEx

__interface IRegEx : IUnknown  
{  
    BOOL MatchesRegex(LPCTSTR input, LPCTSTR regex);  
    HRESULT GetMatch(size_t index, LPBSTR pValue);  
};  

Этот метод реализуется компонентом ID_Regex (IRegex.h) и обеспечивает поддержку обработки регулярных выражений.

BOOL MatchesRegex(LPCTSTR input, LPCTSTR regex)

Этот метод выполняет регулярное выражение для входного текста. Для выполнения фактической работы используется функция regex_match стандартной библиотеки C++. Метод возвращает значение TRUE, если были совпадения, false — в противном случае.

HRESULT GetMatch(size_t index, LPBSTR pValue)

Этот метод позволяет получить совпадения из последнего вызова MatchesRegex . Обратите внимание, что в этом методе нет обработки ошибок, и он либо возвращает S_OK , либо создает исключение.

Интерфейс ISummaryInfo

__interface ISummaryInfo : IUnknown  
{  
    size_t Count(void);  
    HRESULT Clear(void);  
    HRESULT AddInfo(LPCTSTR pFirst, LPCTSTR pSecond);  
    HRESULT GetInfo(size_t index, LPBSTR pFirst, LPBSTR pSecond);  
    HRESULT GetCaption(LPBSTR pCaption);  
    HRESULT SetCaption(LPCTSTR caption);  
};  

Вам не нужно использовать этот интерфейс напрямую. Вместо этого используйте IFormController.

ISummaryBag

__interface ISummaryBag : IUnknown  
{  
    size_t Count(void);  
    HRESULT GetInfoByIndex(size_t index, [out] ISummaryInfo **ppSummary);  
    HRESULT GetInfoByKey(LPCTSTR key, [out] ISummaryInfo **ppSummary);  
};  

Вам не нужно использовать этот интерфейс напрямую. Вместо этого используйте IFormController.

Интерфейс ITSVariableBag

__interface ITSVariableBag : IUnknown  
{  
    void GetValue([in] LPCTSTR variableName, [out] LPBSTR pValue);  
    void SetValue([in] LPCTSTR variableName, [in] LPCTSTR pValue);  
    void Clear(void);  
    HRESULT Remove([in] LPCTSTR variableName);  
    HRESULT SuppressLogValue([in] LPCTSTR variableName);  
    void Save(void);  
};  

Этот интерфейс предоставляет доступ к переменным последовательности задач. Доступ к этому интерфейсу можно получить с помощью метода TSVariables() страницы .

void GetValue([in] LPCTSTR variableName, [out] LPBSTR pValue)

Этот метод считывает значение переменной последовательности задач.

Примечание.

Значения кэшируются после первого чтения.

void SetValue([in] LPCTSTR variableName, [in] LPCTSTR pValue)

Этот метод задает значение переменной последовательности задач. Это значение сохраняется в памяти. Значения последовательности задач записываются после нажатия кнопки Готово в мастере UDI.

void Clear(void)

Этот метод удаляет все значения последовательности задач, сохраненные в памяти.

HRESULT Remove([in] LPCTSTR variableName)

Этот метод удаляет определенное значение последовательности задач из памяти. При следующем вызове GetValue с тем же именем последовательности задач метод пытается извлечь его из последовательности задач.

HRESULT SuppressLogValue([in] LPCTSTR variableName)

При записи переменных последовательности задач, например при нажатии кнопки Готово в мастере UDI, имена и значения записываются в файл журнала. Вызовите этот метод, чтобы отключить ведение журнала конфиденциальных значений, таких как пароли или ПИН-коды, для определенной переменной последовательности задач.

void Save(void)

Этот метод сохраняет все значения последовательности задач, заданные с помощью вызовов SetValue.

Интерфейс ITSVariableRepository

__interface ITSVariableRepository : IUnknown  
{  
    void GetValue([in] LPCTSTR variableName, BOOL logValue, [out] LPBSTR pValue);  
    void SetValue([in] LPCTSTR variableName, BOOL logValue, [in] LPCTSTR value);  
};  

Этот интерфейс предназначен для внутреннего использования TSVariableBag для чтения и записи переменных последовательности задач.

Интерфейс IWizardFinish

__interface IWizardFinish : IUnknown  
{  
    HRESULT Canceled(void);  
    HRESULT Finished(void);  
};  

Этот интерфейс полезен в сложных сценариях, когда требуется выполнить дополнительную обработку при нажатии кнопки Готово или Отмена в мастере UDI. Мастер UDI содержит задачу Finish , которая сохраняет переменные последовательности задач при нажатии кнопки Готово. При отмене мастера задача задает только для переменной последовательности задач OSDSetupWizCancelled значение TRUE и не сохраняет изменения в других переменных последовательности задач.

При создании собственного готового компонента необходимо зарегистрировать его с помощью следующего кода:

Register<MyFinishTaskFactory>(ID_MyFinishTask, pRegistry);  

PWizardFinish pFinish;  
CreateInstance(pRegistry, ID_MyFinishTask, &pFinish);  

PWizardFinishService pService;  
GetService<IWizardFinishService>(pRegistry, &pService);  

pService->Register(pFinish);  

Интерфейс IBindableList

__interface IBindableList : IUnknown  
{  
    size_t Count(void);  
    HRESULT GetCaption(size_t index, LPBSTR pCaption);  
};  

Реализуйте этот интерфейс, если у вас есть компонент источника данных, который требуется привязать к поле со списком, вызвав его метод Bind .

size_t Count(void)

Этот метод возвращает количество элементов в списке.

HRESULT GetCaption(size_t index, LPBSTR pCaption)

Этот метод возвращает заголовок элемента по определенному индексу.

Интерфейс IDataNodes

__interface IDataNodes : IUnknown  
{  
    size_t Count();  
    HRESULT SetCaptionProperty(LPCTSTR captionProperty);  
    HRESULT GetProperty(size_t index, LPCTSTR propertyName, [out] LPBSTR propertyValue);  
    HRESULT GetNode(size_t index, [out] ISettingsProperties **ppNode);  
};  

Этот интерфейс предоставляет доступ к иерархическим данным, которые можно сохранить на странице. Этот интерфейс можно получить с помощью методов в интерфейсе ISettingsProperties , который доступен для вашей страницы с помощью метода Settings .

Данные в XML-коде страницы могут выглядеть примерно так:

      <Data Name="Network">  
        <DataItem>  
          <Setter Property="DisplayName">Public</Setter>  
          <Setter Property="Share">\\servername\Share</Setter>  
        </DataItem>  
        <DataItem>  
          <Setter Property="DisplayName">Dev Team</Setter>  
          <Setter Property="Share">\\servername\DevShare</Setter>  
        </DataItem>  
      </Data>  

Вызов Settings()->GetDataNode(L"Network", &pData) предоставляет экземпляр IDataNodes с двумя элементами данных (каждый из которых, в свою очередь, имеет два свойства).

size_t Count()

Этот метод возвращает количество элементов DataItem .

HRESULT SetCaptionProperty(LPCTSTR captionProperty)

Компонент, поддерживающий этот интерфейс, также поддерживает IBindableList, что упрощает заполнение поля со списком данными из XML-кода страницы. Этот метод определяет, какое свойство (метод задания) в каждом элементе DataItem будет использоваться для этой привязки. Например, можно вызвать этот метод с параметром DisplayName и использовать это свойство setter для привязки данных. Поле со списком будет содержать общедоступные и команды разработчиков в качестве элементов.

HRESULT GetProperty(size_t index, LPCTSTR propertyName, [out] LPBSTR propertyValue)

Этот метод получает свойство из одного из элементов DataItem . См. таблицу 41 и таблицу 42.

Таблица 41. DataItem GetProperty

Параметр Описание
Индекс; Значение индекса (начиная с 0) объекта DataItem , для которого требуется получить значение свойства.
propertyName Имя свойства задания, для которого требуется получить значение
propertyValue При возврате содержит строковое значение свойства.

Таблица 42. HRESULT GetProperty

HRESULT Описание
S_OK Свойство было извлечено.
E_INVALIDARG Индекс находится за концом массива.
HRESULT GetNode(size_t index, [out] ISettingsProperties **ppNode)

Этот метод аналогичен Методу GetProperty, но вместо того, чтобы возвращать одно значение из DataItem, он возвращает весь объект DataItem , заключенный в интерфейс ISettingsProperties . См. таблицу 43 и таблицу 44.

Таблица 43. HRESULT GetNode

Параметр Описание
Указатель Значение индекса (начиная с 0) объекта DataItem , для которого требуется получить значение свойства.
ppNode При выходе — интерфейс ISettingsProperties , который заключает в оболочку узел DataItem .

Таблица 44. Результаты GETNode HRESULT

HRESULT Описание
S_OK Узел получен.
E_INVALIDARG Индекс находится за концом массива.

Интерфейс IFactoryRegistry

__interface IFactoryRegistry : IUnknown  
{  
    void Register(LPCTSTR type,  IClassFactory *pFactory);  
    HRESULT LoadAndRegister(LPCTSTR dllName, ILogger *pLogger);  
    BOOL Contains(LPCTSTR type);  
    HRESULT GetFactory(LPCTSTR type,  IClassFactory **ppFactory);  
    HRESULT CreateInstance(LPCTSTR type,  IUnknown **ppInstance);  
    HRESULT SetContainer(IWizardPageContainer *pContainer);  
    HRESULT RegisterService(REFGUID iid, IUnknown *pService);  
    HRESULT GetService(REFGUID iid,  IUnknown **ppService);  
};  
Обзор

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

void Register(тип LPCTSTR, IClassFactory *pFactory)

Этот метод регистрирует фабрику классов в реестре. См. таблицу 45.

Таблица 45. IClassFactory void Register

Параметр Описание
Тип Строка, идентифицирующая регистрируемую фабрику; Как правило, этот параметр должен содержать название вашей компании в строке, чтобы убедиться, что он является уникальным
pFactory Указатель на экземпляр фабрики класса
HRESULT LoadAndRegister(LPCTSTR dllName, ILogger *pLogger)

Этот метод предназначен только для внутреннего использования.

BOOL Contains(тип LPCTSTR)

Этот метод обычно предназначен для внутреннего использования. Он проверяет, зарегистрирована ли фабрика классов для типа.

HRESULT GetFactory(тип LPCTSTR, IClassFactory **ppFactory)

Этот метод позволяет получить фабрику классов. Как правило, вы вызываете CreateInstance. Тем не менее, если вы собираетесь создать большое количество одного и того же компонента, более эффективно получить фабрику, а затем попросить ее создать экземпляры для вас.

HRESULT CreateInstance(тип LPCTSTR, IUnknown **ppInstance)

Этот метод создает новый экземпляр компонента с учетом его типа. Вместо этого используйте метод шаблона CreateInstance , который позволяет создавать типобезопасные объекты.

HRESULT SetContainer(IWizardPageContainer *pContainer)

Этот метод предназначен только для внутреннего использования.

HRESULT RegisterService(REFGUID iid, IUnknown *pService)

Службы — это отдельные экземпляры компонента, которые можно использовать в нескольких местах. Этот метод можно использовать для регистрации службы на одной странице, а затем получения этого же экземпляра с другой страницы.

HRESULT GetService(REFGUID iid, IUnknown **ppService)

Этот метод извлекает службу, которая ранее была зарегистрирована с помощью вызова RegisterService.

HRESULT SetLanguage(LANGID languageId)

Этот метод задает язык мастера UDI идентификатором языка, указанным в параметре languageId .

LANGID GetLanguage()

Этот метод возвращает значение идентификатора языка, предоставленного с параметром командной строки /locale для мастера UDI. Метод возвращает одно из следующих значений:

  • Значение идентификатора языка, предоставленного параметром командной строки /locale

  • 0, если параметр командной строки /locale не указан

Интерфейс ILogger

__interface ILogger : IUnknown  
{  
    HRESULT Init(LPCWSTR logFilename);  
    HRESULT MoveLog(LPCWSTR logFilename);  
    HRESULT LogBase(EMessageType messageType, LPCTSTR component, SYSTEMTIME eventTime, LPCTSTR message);  
    HRESULT Log(EMessageType messageType, LPCTSTR component, LPCTSTR message);  
    HRESULT Error(HRESULT error, LPCTSTR component, LPCTSTR message);  
    HRESULT Error2(HRESULT error, LPCTSTR component, LPCTSTR message, LPCTSTR message2);  
    HRESULT Normal(LPCTSTR component, LPCTSTR message);      
    HRESULT Normal2(LPCTSTR component, LPCTSTR message, LPCTSTR message2);  
    HRESULT Verbose(LPCTSTR component, LPCTSTR message);  
    HRESULT Verbose2(LPCTSTR component, LPCTSTR message, LPCTSTR message2);  
    HRESULT Debug(LPCWSTR component, LPCWSTR message);  
    HRESULT EnableDebug(BOOL debug);  
    HRESULT Close(void);  
    HRESULT GetLogFilename(LPBSTR pFilename);  
};  
Обзор

Мастер UDI записывает сведения в файл журнала, что помогает устранять проблемы, обнаруженные в поле. Это хорошая идея, чтобы ваши страницы регистрировать информацию. Указатель на этот интерфейс можно получить из страницы с помощью метода Logger() страницы. Строки в файле журнала содержат номер уровня, представляющий сообщения об ошибках, обычные, подробные или отладочные сообщения.

Примечание.

Сообщения отладки не сохраняются в файле журнала, если не включена поддержка отладки. Вы можете включить поддержку отладки, добавив следующую строку в элемент Style в файле .config:

<Setter Property="debug">true</Setter>  
Инициализация
HRESULT Init(LPCWSTR logFilename)  

Этот метод предназначен только для внутреннего использования.

MoveLog
HRESULT MoveLog(LPCWSTR logFilename)  

Этот метод предназначен только для внутреннего использования.

LogBase
HRESULT LogBase(EMessageType messageType, LPCTSTR component, SYSTEMTIME eventTime, LPCTSTR message)  

Этот метод предназначен только для внутреннего использования.

Log
HRESULT Log(EMessageType messageType, LPCTSTR component, LPCTSTR message)  

Этот метод предназначен только для внутреннего использования.

Error
HRESULT Error(HRESULT error, LPCTSTR component, LPCTSTR message)  

Вызовите этот метод для регистрации сведений об ошибке. См. таблицу 46.

Таблица 46. Ошибка HRESULT

Параметр Описание
Ошибка Код ошибки, возвращенный вызовом (этот код будет отображаться в записи журнала в виде номера.)
Компонент Строка, идентифицирующая источник ошибки, которая обычно является вашей страницей или написанным компонентом.
Сообщение Сообщение, объясняющее причину ошибки
Ошибка 2
HRESULT Error2(HRESULT error, LPCTSTR component, LPCTSTR message, LPCTSTR message2)  

Этот метод похож на метод Error, но позволяет предоставить двухкомпонентное сообщение. Последнее сообщение будет содержать "message", а затем "message2" в выходном файле. Это просто удобный метод.

Normal
HRESULT Normal(LPCTSTR component, LPCTSTR message)  

Этот метод регистрирует обычное сообщение. См. описание метода Error для параметров.

Обычный2
HRESULT Normal2(LPCTSTR component, LPCTSTR message, LPCTSTR message2)  

Этот метод регистрирует обычное сообщение. См. описание метода Error2 для параметров.

Подробный
HRESULT Verbose(LPCTSTR component, LPCTSTR message)  

Этот метод регистрирует подробное сообщение. См. описание метода Error для параметров.

Подробный2
HRESULT Verbose2(LPCTSTR component, LPCTSTR message, LPCTSTR message2)  

Этот метод регистрирует подробное сообщение. См. описание метода Error2 для параметров.

Отладка
HRESULT Debug(LPCWSTR component, LPCWSTR message)  

Этот метод регистрирует сообщение отладки. См. описание метода Error для параметров. Сообщения отладки не сохраняются в файле, если они не включены. Дополнительные сведения см. в разделе Обзор.

EnableDebug
HRESULT EnableDebug(BOOL debug)  

Этот метод предназначен только для внутреннего использования.

Закрытие
HRESULT Close(void)  

Этот метод предназначен только для внутреннего использования.

GetLogFilename
HRESULT GetLogFilename(LPBSTR pFilename)  

Этот метод извлекает имя файла журнала.

Интерфейс IOrientation

__interface IOrientation : IUnknown  
{  
    void SetController(IWizardDialogController *pController);  
    int AddPage(LPCTSTR name);  
    void SelectPage(int index);  
};  

Этот интерфейс предназначен только для внутреннего использования.

Интерфейс ISettings

__interface ISettings : IUnknown  
{  
    int NumDlls();  
    int NumPages();  

    HRESULT SetStage(LPCWSTR stageName);  
    HRESULT GetDllName(long index, __out LPBSTR pDllName);  
    HRESULT GetPageInfo(long index, __out ISettingsProperties **ppPageInfo);  
    HRESULT GetStyle(__out ISettingsProperties **ppStyleInfo);  
};  

Этот интерфейс предназначен только для внутреннего использования.

Интерфейс ISettingsProperties

__interface ISettingsProperties : IUnknown  
{  
    HRESULT GetAttribute(LPCTSTR attributeName, __out LPBSTR attributeValue);  
    IStringProperties * Properties();  
    HRESULT SelectNodes(LPCTSTR xPath, __out IXMLDOMNodeList **ppList);  
    HRESULT SelectSingleNode(LPCTSTR xPath, __out IXMLDOMNode **ppNode);  
    HRESULT GetDataNode(LPCTSTR name, __out ISettingsProperties **ppNode);  
    HRESULT GetDataNodes(__out IDataNodes **ppNodes);  
    HRESULT GetChildDataNodes(LPCTSTR childeName, __out IDataNodes **ppNodes);  
};  
Обзор

Этот интерфейс предоставляет доступ к данным страницы. Чтобы получить верхний уровень данных страницы, используйте метод Settings() страницы .

HRESULT GetAttribute(LPCTSTR attributeName, LPBSTR attributeValue)

Этот метод позволяет получить значения атрибутов на главном узле, который является узлом Page при использовании метода Settings() страницы.

IStringProperties * Properties()

Этот метод предоставляет доступ к значениям свойств setter в главном узле. Для страницы это свойства верхнего уровня.

HRESULT SelectNodes(LPCTSTR xPath, IXMLDOMNodeList **ppList)

Вызовите этот метод, если вы хотите напрямую получить список узлов XML с помощью выражения XPath. По возможности лучше использовать один из других методов. Используйте этот метод только в том случае, если вы не можете получить доступ к узлам другим способом.

HRESULT SelectSingleNode(LPCTSTR xPath, IXMLDOMNode **ppNode)

Вызовите этот метод, если требуется получить один xml-узел напрямую с помощью выражения XPath. По возможности лучше использовать один из других методов. Используйте этот метод только в том случае, если вы не можете получить доступ к узлу другим способом.

HRESULT GetDataNode(имя LPCTSTR, ISettingsProperties **ppNode)

Получите элемент Data на основе атрибута Name этого элемента.

HRESULT GetDataNodes(IDataNodes **ppNodes)

Этот метод извлекает список элементов DataItem в текущем узле. На уровне страницы вызовите Метод GetDataNode , чтобы получить интерфейс ISettingsProperty для данных. Затем в этом экземпляре вызовите Метод GetDataNodes , чтобы получить список записей. Например, с учетом следующего XML-кода:

    <Page ...>  
      <Data Name="Network">  
        <DataItem>  
          <Setter Property="DisplayName">Public</Setter>  
          <Setter Property="Share">\\servername\Share</Setter>  
        </DataItem>  
        <DataItem>  
          <Setter Property="DisplayName">Dev Team</Setter>  
          <Setter Property="Share">\\servername\DevShare</Setter>  
        </DataItem>  
      </Data>  
PSettingsProperties pData;  
Settings()->GetDataNode(L"Network", &pData);  
PDataNodes pNodes;  
pData->GetDataNodes(&pNodes);  
HRESULT GetChildDataNodes(LPCTSTR childeName, IDataNodes **ppNodes)

Этот метод позволяет быстро добраться до набора узлов DataItem в определенном узле Данных . Используя XML-код из примера GetDataNodes , следующий код выполняет то же самое, что и четыре строки кода в примере в разделе GetDataNodes , но с проверкой ошибок:

ISimpleStringProperties Interface  

Интерфейс ISimpleStringProperties

__interface ISimpleStringProperties : IStringProperties  
{  
void Add(LPCTSTR propertyName, LPCTSTR value);  
};  

Сам по себе этот интерфейс может быть не полезен. Однако он реализуется компонентом ID_SimpleStringProperties , который также реализует интерфейс IStringProperties . Этот компонент можно использовать в тех случаях, когда необходимо передать набор свойств другому компоненту, например задаче, но вы хотите добавить значения программным способом, а не использовать значения из XML. Ниже приведен пример использования этого интерфейса:

PSimpleStringProperties *pProperties;  
CreateInstance(Container(), ID_SimpleStringProperties, &pProperties);  
pProperties->Add(L"filename", L"%windir%\\system32\\cscript.exe");  
pTask->Init(pProperties, nullptr);  
IStringProperties  
__interface IStringProperties : IUnknown  
{  
    HRESULT Get(LPCTSTR propertyName, [out] LPBSTR pPropValue);  
};  

Этот интерфейс обеспечивает простой доступ к набору элементов задания, поступающих из XML. Этот интерфейс доступен для свойств страницы с помощью Settings()->Properties().

HRESULT Get(LPCTSTR propertyName, [out] LPBSTR pPropValue)

Этот метод получает одно значение свойства. См. таблицу 47 и таблицу 48.

Таблица 47. IHRESULT Get Property Value

Параметр Описание
propertyName Имя свойства, которое требуется прочитать
pPropValue При выходе содержит значение свойства в виде строки (это значение будет иметь значение nullptr , если такого свойства нет.)

Таблица 48. Результаты получения значения свойства IHRESULT

HRESULT Описание
S_OK Извлекается значение свойства.
E_INVALIDARG Свойство с указанным именем отсутствует.

Интерфейс ITaskManager

__interface ITaskManager : IUnknown  
{  
    HRESULT Init(IWizardPageView *pPageView, int idListView, int idMessage, int idRetryButton, ISettingsProperties *pPageInfo, ITaskManagerCallback *pCallback);  
    HRESULT SetFailMessage(LPCWSTR message);  

    HRESULT Start(void);  

    HRESULT GetTaskMessage(size_t index, LPBSTR message);  
    HRESULT GetResultType)(size_t index, LPBSTR type);  
    HRESULT GetProperty(size_t index, LPCTSTR propertyName, LPBSTR value);  
    int GetSelectedIndex(void);  
    HRESULT Wait(DWORD waitMilliseconds);  
    size_t FailedCount(void);  
    size_t WarningCount(void);  
    size_t SucceedCount(void);  
    size_t RunningCount(void);  

    void OnCommonControlEvent(WORD controlId, LPNMHDR pInfo);  
    void OnControlEvent(WORD eventId, WORD controlId);  
    void EnableButtons(BOOL enable);  
}  

Этот интерфейс реализуется компонентом TaskManager (ID_TaskManager в ITaskManager.h), который является компонентом, который выполняет задачи на странице предварительной проверки. Вы можете либо использовать страницу предварительной проверки напрямую, что вы делаете большую часть времени, либо создать собственную страницу, позволяя этому компоненту выполнять большую часть работы.

HRESULT Init(IWizardPageView *pPageView, int idListView, int idMessage, int idRetryButton, ISettingsProperties *pPageInfo, ITaskManagerCallback *pCallback)

Этот метод необходимо вызвать перед вызовом любого другого метода. Он инициализирует компонент TaskManager . См. таблицу 49.

Таблица 49. HRESULT Init

Параметр Описание
pPageView Предоставляет доступ к странице, на которой будут выполняться задачи (эта страница должна иметь определенный набор элементов управления, которые описаны в следующих нескольких параметрах.)
idListView Идентификатор элемента управления ListView , который будет отображать список задач и состояние этих задач.
idMessage Идентификатор элемента управления текстового поля, которое будет использоваться для отображения сообщения для выбранной задачи.
idRetryButton Идентификатор элемента управления кнопки, нажатой для повторного запуска задач
pPageInfo Оболочка вокруг XML страницы (TaskManager загружает набор задач для выполнения из этого XML-кода).)
pCallback Может иметь значение NULL (Если этот параметр не имеет значения NULL, TaskManager вызывает метод Started при запуске задачи и метод Finished для каждой завершающейся задачи.)
HRESULT SetFailMessage(сообщение LPCWSTR)

Этот метод задает сообщение, которое будет отображаться в случае сбоя одной или нескольких задач.

HRESULT Start(void)

Этот метод запускает все задачи. Каждая задача запускается в отдельном потоке.

HRESULT GetTaskMessage(size_t индекс, сообщение LPBSTR)

Этот метод предназначен только для внутреннего использования. Он получает текущее сообщение для задачи на основе ее индекса в списке задач.

HRESULT GetResultType)(size_t индекс, тип LPBSTR)

Этот метод извлекает текущий тип для задачи. В таблице 50 показаны доступные типы.

Таблица 50. HRESULT GetResultType

Тип Описание
0 Представляет задачу, выполненную успешно.
1 Представляет задачи, возвращающие предупреждение.
-1 Представляет неудачную задачу

Тип извлекается путем просмотра кода выхода или ошибки задачи и поиска соответствия в XML-элементе ExitCodes> задачи<.

HRESULT GetProperty(size_t index, LPCTSTR propertyName, значение LPBSTR)

Этот метод используется страницами хода выполнения и предварительной проверки для получения свойства setter BitmapFilename , чтобы он отображал изображение рядом с сообщением для выделенной задачи. Другими словами, можно добавить пользовательское задание в XML-код задачи, а затем получить его с помощью этого метода.

int GetSelectedIndex(void)

Этот метод извлекает индекс выбранной задачи, что полезно, если требуется получить дополнительные сведения о задаче (см. раздел Метод GetProperty ), отображаемый для выбранной задачи. Страницы хода выполнения и предварительной проверки используют этот метод для отображения изображения для выбранной задачи.

HRESULT Wait(DWORD waitMilliseconds)

Этот метод в основном помогает в модульных тестах, поэтому тест может убедиться, что задачи завершаются до завершения модульного теста. Этот метод обычно не вызывается. Он возвращает либо по завершении выполнения всех задач, либо по истечении времени ожидания.

size_t FailedCount(void)

Этот метод возвращает количество задач, которые в настоящее время помечены как неудачные.

size_t WarningCount(void)

Этот метод возвращает количество задач, помеченных как предупреждение.

size_t SucceedCount(void)

Этот метод возвращает количество задач, помеченных как успешно выполненные.

size_t RunningCount(void)

Этот метод возвращает количество выполняемых в данный момент задач.

void OnCommonControlEvent(WORD controlId, LPNMHDR pInfo)

Вызовите этот метод из onCommonControlEvent вашей страницы, чтобы TaskManager смог обработать необходимые события.

void OnControlEvent(WORD eventId, WORD controlId)

Вызовите этот метод из onControlEvent страницы, чтобы TaskManager смог обработать необходимые события.

void EnableButtons(BOOL enable)

Этот метод предназначен только для внутреннего использования.

Интерфейс IWizardComponent

__interface IWizardComponent : IUnknown  
{  
    HRESULT SetContainer(IWizardPageContainer *pContainer);  
};  
Обзор

Как правило, этот интерфейс реализуется не напрямую, а с помощью класса шаблона WizardComponent . Если компонент реализует этот интерфейс и вы зарегистрировали фабрику классов в реестре, компонент получает указатель на экземпляр IWizardPageContainer при его создании. Это поможет, например, получить доступ к средству ведения журнала или реестру для создания других компонентов, которые могут потребоваться компоненту.

Интерфейс IWizardDialogController

__interface IWizardDialogController : IUnknown  
{  
    void Initialize(ISettings *pSettings);  
    void InitPages(void);  
    void Start();  
    void Next();  
    void Finish();  
    void Previous();  
    int NumPages();  
    void Cancel();  

    HRESULT Focus(WizardButtons button);  
    HRESULT SetEnable(WizardButtons button, BOOL enable);  
    void ShowWarningMessage(LPCTSTR message);  
    void HideWarningMessage();  

    void ChangePage(size_t newIndex);  
    IUnknown *CurrentPage(void);  
    HRESULT GetCurrentTitle([out, retval] LPBSTR pDisplayName);  
};  

Этот интерфейс предназначен только для внутреннего использования.

Интерфейс IWizardDialogView

__interface IWizardDialogView : IUnknown  
{  
    HRESULT LoadBannerImage(LPCTSTR bannerFilename);  
    HRESULT LoadPage(LPCTSTR pageType, ISettingsProperties *pPageSettings, IWizardPageView **view);  
    HRESULT SetEnable(WizardButtons button, BOOL enable);  
    HRESULT Focus(WizardButtons button);  
    void EnableFinish(BOOL isFinish);  
    void Exit(int exitCode);  
    void ShowWarningMessage(LPCTSTR message);  
    void HideWarningMessage(void);  
    void SetTitle(LPCTSTR title);  
    void SetPageTitle(LPCTSTR title);  
    int ShowMessageBox(LPCTSTR message, LPCTSTR lpCaption, UINT uType);  
    HWND GetHwnd(void);  
    void UpdateFocus(void);  
};  

Этот интерфейс предназначен только для внутреннего использования.

Интерфейс IWizardPage

__interface IWizardPage : IUnknown  
{  
    HRESULT SetPageSettings(ISettingsProperties *pPageSettings);  
    HINSTANCE GetInstanceHandle(void);  
    int GetDialogResourceId(void);  
    void WindowCreated(IWizardPageView *pView, IWizardPageContainer *pContainer);  
    void WindowShown(void);  
    void WindowHidden(void);  

    HRESULT NextClicked(void);  
    void ControlEvent(WORD eventId, WORD controlId);  
    void CommonControlEvent(WORD controlId, LPNMHDR pInfo, LPBOOL pCancel);  
    void UnhandledEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);  
};  
Обзор

Этот интерфейс реализуется WizardPageImpl, поэтому вам, как правило, не придется реализовывать его самостоятельно. Мастер вызывает все эти методы при взаимодействии с пользовательскими страницами.

Интерфейс IWizardPageContainer

__interface IWizardPageContainer : IUnknown  
{  
    ILogger * Logger(void);  
    IPropertyBag * Properties(void);  
    HRESULT CreateInstance(LPCTSTR type, [out] IUnknown **ppInstance);  
    HRESULT GetService(REFIID iid, [out] IUnknown **ppInstance);  
    HRESULT ReplaceVariables(LPCTSTR source, [out] LPBSTR pDest);  
    HRESULT GotoPage(LPCTSTR pageName);  
    int ShowMessageBox(LPCTSTR message, LPCTSTR lpCaption, UINT uType);  
    BOOL InPreview(void);  
    HWND GetHwnd(void);  
};  
Обзор

Этот интерфейс доступен для вашей страницы с помощью метода Container (реализован с помощью WizardPageImpl) и предоставляет доступ к различным службам мастера.

ILogger * Logger(void)

Используйте этот метод для записи сообщений в файл журнала, например:

Logger()->Verbose(s_component, L"Message for log file");  
IPropertyBag * Properties(void)

Этот метод предоставляет доступ к переменным "памяти", которые являются свойствами, которые находятся в памяти только во время работы мастера UDI. Эти свойства доступны другим страницам в коде или XML с помощью синтаксиса $memoryVarName$ .

HRESULT CreateInstance(тип LPCTSTR, [out] IUnknown **ppInstance)

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

HRESULT GetService(REFIID iid, [out] IUnknown **ppInstance)

Этот метод позволяет получить зарегистрированную службу. Однако лучше вызвать функцию шаблона GetService , которая строго типизирована (вместо использования IUnknown).

HRESULT ReplaceVariables(источник LPCTSTR, [out] LPBSTR pDest)

Этот метод обрабатывает работу с переменными внутри строковых значений. Он поддерживает форматы, показанные в таблицах 51 и 52.

Таблица 51. HRESULT ReplaceVariables

Format Описание
$Name$ Заменяет значение переменной памяти этим именем (если переменная памяти с именем отсутствует, токен будет удален.)
%Name% Переменная последовательности задач или переменная среды. Порядок выглядит следующим образом:

1. Используйте значение переменной последовательности задач, если оно имеется.
2. Используйте значение переменной среды, если оно имеется.
3. В противном случае удалите этот текст из строки.

Таблица 52. Параметр HRESULT

Параметр Описание
Source Входная строка, которая может содержать любое сочетание переменных $ и % или вообще ни одно из них.
pDest При возврате содержит новую строку, которая содержит все маркеры, замененные в соответствии с таблицей 51.
HRESULT GotoPage(LPCTSTR pageName)

Этот метод не был полностью протестирован. Идея заключается в том, что вы можете переключиться непосредственно на определенную страницу на основе имени страницы, определенного в XML-файле .config. Вызов этого метода обходит onNextClicked на странице. Кроме того, поведение этого метода может измениться, поэтому используйте его на свой страх и риск.

int ShowMessageBox(сообщение LPCTSTR, LPCTSTR lpCaption, UINT uType)

Этот метод отображает окно сообщения с указанным текстом и подписью. Параметр uType — это любое значение, которое можно указать для функции MessageBox Win32.

BOOL InPreview(void)

Этот метод возвращает значение TRUE, если вы запустили мастер в режиме предварительного просмотра, указав параметр /preview . В режиме предварительного просмотра кнопка Далее никогда не отключается. Этот метод позволяет обходить код в режиме предварительного просмотра, например, что может вызвать проблемы, если на странице нет допустимых данных.

HWND GetHwnd(void)

Этот метод возвращает HWND для основного диалогового окна. Используйте этот метод с осторожностью. Как правило, программный интерфейс мастера UDI разработан таким образом, что вы никогда не работаете непосредственно с дескриптором окон.

Интерфейс IWizardPageView

__interface IWizardPageView : IUnknown  
{  
    HRESULT GetControlWrapper(int itemId, DialogControlTypes controlType, IUnknown **ppControl);  
    HWND GetHwnd(void);  
    HWND GetControl(int itemId);  
    HRESULT Show (void);  
    HRESULT Hide(void);  
    HRESULT Focus(int itemId);  
    IWizardPage * Page(void);  
    IFormController * Form(void);  

    HRESULT FocusWizardButton(WizardButtons button);  
    HRESULT SetEnable(WizardButtons button, BOOL enable);  
    void ShowWarningMessage(LPCTSTR message);  
    void HideWarningMessage(void);  
};  

Этот интерфейс доступен для кода на странице с помощью метода View (реализованного WizardPageImpl).

HRESULT GetControlWrapper(int itemId, DialogControlTypes controlType, IUnknown *ppControl)

Мастер UDI использует оболочки, которые действительно являются фасадами для взаимодействия с элементами управления на странице. Использование этих фасадов вместо фактических элементов управления значительно упрощает написание тестов для страницы, так как вы можете предоставить макеты фасадов из тестов.

Вместо использования этого метода напрямую лучше использовать метод шаблона GetControlWrapper , который строго типизирован, например:

PComboBox m_pLanguagePackCombo;  
GetControlWrapper(View(), IDC_MY_COMBO, CONTROL_COMBO_BOX, &m_pCombo);  
HWND GetHwnd(void)

Этот метод возвращает дескриптор окна для страницы. Как правило, доступ к этому дескриптору окна не требуется.

HWND GetControl(int itemId)

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

HRESULT Show (void)

Этот метод предназначен только для внутреннего использования.

HRESULT Hide(void)

Этот метод предназначен только для внутреннего использования.

HRESULT Focus(int itemId)

Задайте для фокуса ввода определенный элемент управления.

IWizardPage * Page(void)

Этот метод предназначен только для внутреннего использования.

IFormController * Form(void)

Этот метод предназначен только для внутреннего использования.

HRESULT FocusWizardButton(кнопка WizardButtons)

Устанавливает фокус на одну из кнопок мастера. WizardButtons имеет два значения: BackButton и NextButton.

HRESULT SetEnable(кнопка WizardButtons, bool enable)

Запросите включение или отключение одной из кнопок мастера. Кнопка может не соответствовать запрашиваемой состоянию. Например, если запустить мастер UDI с параметром /preview , кнопки всегда будут включены. WizardButtons имеет два значения: BackButton и NextButton.

void ShowWarningMessage(сообщение LPCTSTR)

Этот метод отображает предупреждающее сообщение в нижней части области содержимого страницы. Это сообщение может быть любым текстом.

void HideWarningMessage(void)

Скрытие предупреждающего сообщения, отображаемого при вызове ShowWarningMessage.

Интерфейс IXmlDocument

__interface IXmlDocument : IUnknown  
    HRESULT Load(LPCTSTR filename);  
    HRESULT LoadXml(LPCTSTR xml);  
    HRESULT Save(LPCWSTR filename);  
    HRESULT GetParseErrorMessage(LPBSTR pMessage);  
    HRESULT SelectNodes(LPCTSTR xpath, IXMLDOMNodeList **ppNodes);  
    HRESULT SelectSingleNode(LPCTSTR xpath, IXMLDOMNode **ppNode);  
    HRESULT AddSchema(LPCTSTR filename, LPCTSTR ns);  
    HRESULT AddAttribute(IXMLDOMNode *pNode, LPCWSTR name, LPCWSTR value);  
    HRESULT CreateNode(DOMNodeType type, LPCWSTR name, LPCWSTR ns, IXMLDOMNode **ppNode);  
};  
Обзор

Этот интерфейс реализуется компонентом ID_IXmlDocument , который является фасадом, предназначенным для упрощения работы с XML-документами на C++.

HRESULT Load(имя файла LPCTSTR)

Этот метод загружает XML-документ из внешнего файла. Он возвращает S_OK , если файл был загружен без ошибок, или S_FALSE , если произошла ошибка. При возникновении ошибки можно получить сообщение об ошибке, вызвав Метод GetParseErrorMessage.

HRESULT LoadXml(LPCTSTR xml)

Этот метод загружает XML-документ из строки, а не из внешнего файла. Кроме источника для чтения XML, поведение аналогично методу Load .

HRESULT Save(LPCWSTR filename)

Этот метод сохраняет XML-документ, который находится в памяти, во внешний файл.

HRESULT GetParseErrorMessage(LPBSTR pMessage)

Этот метод возвращает новую строку с сообщением об ошибке при загрузке XML-документа, если таковой имеется. Он всегда возвращает S_OK.

HRESULT SelectNodes(LPCTSTR xpath, IXMLDOMNodeList **ppNodes)

Этот метод позволяет использовать выражение XPath для получения коллекции узлов из документа. Он всегда возвращает S_OK.

HRESULT SelectSingleNode(LPCTSTR xpath, IXMLDOMNode **ppNode)

Этот метод позволяет использовать выражение XPath для получения одного узла из документа. Он всегда возвращает S_OK.

HRESULT AddSchema(имя файла LPCTSTR, LPCTSTR ns)

Этот метод добавляет имя файла внешней схемы, который будет использоваться для проверки схемы XML-документа при его загрузке. Указанное пространство имен — это строка, которая может использоваться в запросах XPath, хотя это не было протестировано.

HRESULT AddAttribute(IXMLDOMNode *pNode, имя LPCWSTR, значение LPCWSTR)

Этот метод добавляет новый атрибут к существующему узлу в XML-документе. См. таблицу 53.

Таблица 53. HRESULT AddAttribute

Параметр Описание
pNode Узел, в который требуется добавить атрибут
Имя Имя нового атрибута
Value (Значение) Значение нового атрибута
HRESULT CreateNode(тип DOMNodeType, имя LPCWSTR, LPCWSTR ns, IXMLDOMNode **ppNode)

Вызовите этот метод, чтобы создать новый узел:

Pointer<IXMLDOMNode> pNewChild  
pXmlDom->CreateNode(NODE_ELEMENT, L"MyElement", L"", &pNewChild);  

После создания нового узла его можно добавить в качестве дочернего узла на другой узел, вызвав метод appendChild родительского элемента.

Вспомогательные функции

Функция шаблона CreateInstance

HRESULT CreateInstance(IWizardPageContainer *pContainer, LPCTSTR type, I **ppObject)  

Эта функция определена в IWizardPageContainer.h и предоставляет типобезопасную оболочку через метод IWizardPageContainer-CreateInstance>, например:

CreateInstance<IDirectory>(Container(), ID_Directory, &pDirectory);  

Этот код создает новый компонент ID_Directory для получения интерфейса IDirectory этого компонента.

Функция шаблона GetService

void GetService(IWizardPageContainer *pContainer, I **ppService)  

Эта функция определена в IWizardPageContainer.h и предоставляет типобезопасную оболочку через метод IWizardPageContainer-GetService>, например:

GetService<ITSVariableBag>(Container(), &pTsBag);  

Эта функция извлекает компонент последовательности задач, который поддерживает интерфейс ITSVariableBag . (Для ITSVariableBag можно использовать метод TSVariables класса WizardPageImpl .)

Справочник по схеме файла конфигурации мастера UDI

Этот файл используется конструктором мастера UDI. Для каждого настраиваемого файла .dll создается отдельный файл, который может содержать настраиваемые редакторы страниц мастера, пользовательские задачи или настраиваемые проверяющие элементы. Файл должен заканчиваться .config и находиться в папке installation_folder\Bin\Config (где installation_folder — это папка, в которой установлен MDT).

В таблице 54 перечислены элементы в файле конфигурации конструктора мастера UDI и их описания. Элемент DesignerConfig является корневым узлом для этой ссылки.

Таблица 54. Элементы в файле конфигурации конструктора мастера UDI и их описания

Имя элемента Описание
DesignerConfig Задает корневой каталог для всех остальных элементов.
DesignerMappings Групповая группа элементов Page
Page Указывает редактор страницы мастера для загрузки в конструкторе мастера UDI, который используется для изменения параметров конфигурации для страницы мастера.
Param Указывает параметр, который передается родительскому элементу Task или Validator и соответствует элементу Setter в файле конфигурации мастера UDI Примечание. Атрибуты этого элемента отличаются, если родительским элементом является элемент Task или Validator .
Задача Задает задачу в библиотеке задач.
TaskItem Указывает группу параметров, передаваемых задаче.
TaskLibrary Групповая группа элементов Task
Валидатор Указывает проверяющий элемент в библиотеке проверяющего элемента управления.
ValidatorLibrary Групповая группа элементов Проверяющего элемента

DesignerConfig

Этот элемент задает корень для всех остальных элементов.

Сведения об элементе

В таблице 55 содержатся сведения об элементе DesignerConfig .

Таблица 55. Сведения об элементе DesignerConfig

Атрибут Значение
Число вхождений Один. Этот элемент является обязательным.
Родительские элементы Нет
Содержание DesignerMappings, TaskLibrary, ValidatorLibrary
Атрибуты элемента

Этот элемент не имеет атрибутов.

Замечания

Нет.

Пример
<DesignerConfig>  
   + <TaskLibrary>  
   + <ValidatorLibrary>  
   + <DesignerMappings>  
</DesignerConfig>  

DesignerMappings

Этот элемент группит набор элементов Page .

Сведения об элементе

В таблице 56 содержатся сведения об элементе DesignerMappings .

Таблица 56. Сведения об элементе DesignerMappings

Атрибут Значение
Число вхождений Ноль или один в элементе DesignerConfig (этот элемент является необязательным, если в библиотеке DLL нет страницы настраиваемого мастера, соответствующей этому файлу конфигурации конструктора мастера UDI.)
Родительские элементы DesignerConfig
Содержание Page
Атрибуты элемента

Этот элемент не имеет атрибутов.

Замечания

Нет.

Пример
<DesignerConfig>  
   + <TaskLibrary>  
   + <ValidatorLibrary>  
   - <DesignerMappings>  
        <Page DLL="SharedPages.dll"  
           Description="Used to display text that describes the current stagegroup"  
           Type="Microsoft.SharedPages.WelcomePage"  
           DisplayName="Welcome"   
           Image="Welcome_188.png"  
           DesignerType="Microsoft.Enterprise.UDIDesigner.CoreModules.Views.WelcomePageView"  
           DesignerAssembly="Microsoft.Enterprise.UDIDesigner.CoreModules.dll"/>  
        <Page DLL="OSDRefreshWizard.dll"  
           Description="Captures or restores user state data"  
           Type="Microsoft.OSDRefresh.UserStatePage"  
           DisplayName="User Data"  
           Image="UserState_188.png"  
           DesignerType="Microsoft.Enterprise.UDIDesigner.CoreModules.Views.UserStatePageView"  
           DesignerAssembly="Microsoft.Enterprise.UDIDesigner.CoreModules.dll"/>  
        <Page DLL="OSDRefreshWizard.dll"  
           Description="Allows selecting the image to install, target drive, and whether to format"  
           Type="Microsoft.OSDRefresh.VolumePage"  
           DisplayName="Volume"  
           Image="Volume_188.png"  
           DesignerType="Microsoft.Enterprise.UDIDesigner.CoreModules.Views.VolumePageView"  
           DesignerAssembly="Microsoft.Enterprise.UDIDesigner.CoreModules.dll"/>  
     </DesignerMappings>  
</DesignerConfig>  

Page

Этот элемент указывает редактор страницы мастера для загрузки в конструкторе мастера UDI, который, в свою очередь, используется для изменения параметров конфигурации для страницы мастера.

Сведения об элементе

В таблице 57 содержатся сведения об элементе Page .

Таблица 57. Сведения об элементе страницы

Атрибут Значение
Число вхождений Один или несколько для каждой страницы мастера, определенной в элементе DesignerMappings
Родительские элементы DesignerMappings
Содержание Любое правильно сформированное XML-содержимое
Атрибуты элемента

В таблице 58 перечислены атрибуты элемента Page и описание каждого из них.

Таблица 58. Атрибуты и соответствующие значения для элемента Page

Атрибут Описание
Описание Указывает текст, предоставляющий сведения о параметре, который отображается в конструкторе мастера UDI.
DesignerAssembly Указывает имя файла .dll, связанного с редактором страниц мастера (файл .dll должен существовать в папке installation_folder\Bin (где installation_folder — это папка, в которой установлен MDT.)
DesignerType Указывает имя редактора страниц мастера в файле .dll, указанном в атрибуте DesignerAssembly (это тип .NET Майкрософт для редактора страниц мастера с полным Майкрософт пространство имен .NET.)
DisplayName Указывает понятное имя редактора страниц, которое отображается в конструкторе мастера UDI.
Dll Указывает имя файла .dll, связанного со страницей мастера (файл .dll должен существовать в папке installation_folder\Templates\Distribution\Tools\platform (где installation_folder — это папка, в которой установлен MDT, а платформаx86 для 32-разрядной версии или x64 — для 64-разрядной версии.) Примечание: Убедитесь, что архитектура процессора DLL соответствует установленной архитектуре процессора MDT. Например, если вы установили 32-разрядную версию MDT, убедитесь, что для страницы мастера используется 32-разрядная библиотека DLL.
Image Указывает имя изображения страницы в формате PNG (файл .png должен находиться в папке installation_folder\Bin\Images (где installation_folder — это папка, в которой установлен MDT.)
Тип Указывает редактор страницы мастера и должен соответствовать имени, используемому при регистрации настраиваемой страницы.
Замечания

Конструктор мастера UDI использует элемент Page , например шаблон, для создания начального XML-кода для нового мастера. Конструктор мастера UDI выполняет проверку схемы, чтобы убедиться, что элементы Page и дочерние элементы имеют допустимый формат. Этот элемент обеспечивает сопоставление между типом страницы мастера UDI и информацией, необходимой конструктору мастера UDI для редактирования и создания страниц этого типа с помощью пользовательского редактора страниц.

Пример

Нет.

Param

Этот элемент задает параметр, который передается родительскому элементу Task или Validator и соответствует элементу Setter в файле конфигурации мастера UDI.

Примечание.

Атрибуты для этого элемента отличаются, если родительским элементом является элемент Task или Validator .

Сведения об элементе

В таблице 59 содержатся сведения об элементе Param .

Таблица 59. Сведения об элементе Param

Атрибут Значение
Число вхождений Один или несколько для каждого родительского элемента TaskItem или Validator
Родительские элементы TaskItem, Validator
Содержание Любое правильно сформированное XML-содержимое
Атрибуты элемента

В таблице 60 перечислены атрибуты элемента Param и приведено описание каждого из них.

Таблица 60. Атрибуты и соответствующие значения для элемента Param

Атрибут Описание
Описание Указывает текст, предоставляющий сведения о параметре, который отображается в примечании конструктора мастера UDI. Этот атрибут действителен только для элемента Validator .
DisplayName Указывает понятное имя параметра проверяющего элемента, которое отображается для соответствующей страницы мастера UDI в конструкторе мастера UDI (обычно это имя более описательное, чем атрибут Name .) Примечание: Этот атрибут действителен только для элемента Validator .
Имя Указывает имя параметра, передаваемого в задачу или проверяющий элемент, в зависимости от родительского элемента (этот атрибут станет атрибутом Property в элементе Setter в файле конфигурации мастера UDI.) Примечание: Этот параметр используется для родительских элементов TaskItem и Validator .
Замечания

Нет.

Пример

Нет.

Задача

Этот элемент задает задачу в библиотеке задач.

Сведения об элементе

В таблице 61 содержатся сведения об элементе Task .

Таблица 61. Сведения об элементе задачи

Атрибут Значение
Число вхождений Один или несколько элементов в элементе TaskLibrary (этот элемент не является необязательным, если указан элемент TaskLibrary .)
Родительские элементы TaskLibrary
Содержание TaskItem
Атрибуты элемента

В таблице 62 перечислены атрибуты элемента Task и приведено описание каждого из них.

Таблица 62. Атрибуты и соответствующие значения для элемента Task

Атрибут Описание
Описание Указывает текст, предоставляющий сведения о задаче, которые отображаются в конструкторе мастера UDI.
Dll Указывает имя файла .dll, связанного с задачей (файл .dll должен существовать в папке installation_folder\Templates\Distribution\Tools\platform (где installation_folder — это папка, в которой установлен MDT, а платформаx86 для 32-разрядной версии или x64 для 64-разрядной версии.)
Имя Указывает имя задачи, которое отображается на соответствующей странице мастера UDI и в конструкторе мастера UDI.
Тип Указывает тип задачи, который регистрируется в реестре фабрики и используется для вызова конкретной задачи в файле .dll.
Замечания

Нет.

Пример

Нет.

TaskItem

Этот элемент задает группу параметров, передаваемых задаче.

Сведения об элементе

В таблице 63 содержатся сведения об элементе TaskItem .

Таблица 63. Сведения об элементе TaskItem

Атрибут Значение
Число вхождений Один или несколько для каждого элемента Task
Родительские элементы Задача
Содержание Param
Атрибуты элемента

В таблице 64 перечислены атрибуты элемента TaskItem и приведено описание каждого из них.

Таблица 64. Атрибут и соответствующие значения для элемента TaskItem

Атрибут Описание
Тип Указывает тип элемента, который будет создан в файле конфигурации мастера UDI. Будет создан XML-элемент, соответствующий значению этого атрибута. Например, если для этого атрибута задано значение File, в файле конфигурации мастера UDI будет создан элемент File .

В настоящее время поддерживаются только следующие значения:

- File, для которого требуются два дочерних элемента Param (один дочерний элемент Param с атрибутомName , для которого задано значение Source , а другой дочерний элемент Param с атрибутом Name , для которого задано значение Dest)
- Setter, для которого требуется один дочерний элемент Param
Замечания

Нет.

Пример

Нет.

TaskLibrary

Этот элемент группит набор элементов Task .

Сведения об элементе

В таблице 65 содержатся сведения об элементе TaskLibrary .

Таблица 65. Сведения об элементе TaskLibrary

Атрибут Значение
Число вхождений Ноль или один в элементе DesignerConfig (этот элемент является необязательным, если в библиотеке DLL нет пользовательских задач, соответствующих этому файлу конфигурации мастера UDI.)
Родительские элементы DesignerConfig
Содержание Задача
Атрибуты элемента

Этот элемент не имеет атрибутов.

Замечания

Нет.

Пример
<DesignerConfig>  
   - <TaskLibrary>  
        +<Task DLL="" Description="Executes a process with the given command line." Type="Microsoft.Wizard.ShellExecuteTask" Name="Shell Execute Task">  
        +<Task DLL="OSDRefreshWizard.dll" Description="Discovers supported applications for install." Type="Microsoft.OSDRefresh.AppDiscoveryTask" Name="Application Discovery">  
        +<Task DLL="SharedPages.dll" Description="Check to ensure a wired network connection is available." Type="Microsoft.SharedPages.WiredNetworkTask" Name="Wired Network Check">  
        +<Task DLL="OSDRefreshWizard.dll" Description="Check to ensure power source is AC (not battery)." Type="Microsoft.OSDRefresh.ACPowerTask" Name="AC Power Check">  
        +<Task DLL="" Description="Check to ensure power source is AC (not battery)." Type="Microsoft.Wizard.CopyFilesTask" Name="Copy Files Task">  
     </TaskLibrary>  
   + <ValidatorLibrary>  
   + <DesignerMappings>  
</DesignerConfig>  

Валидатор

Этот элемент задает проверяющий элемент в библиотеке проверяющего элемента.

Сведения об элементе

В таблице 66 содержатся сведения об элементе Validator .

Таблица 66. Сведения об элементе проверяющего элемента

Атрибут Значение
Число вхождений Ноль или более в элементе ValidatorLibrary (этот элемент является необязательным).)
Родительские элементы ValidatorLibrary
Содержание Param
Атрибуты элемента

В таблице 67 перечислены атрибуты элемента Validator и приведено описание каждого из них.

Таблица 67. Атрибуты и соответствующие значения для элемента Validator

Атрибут Описание
Описание Указывает текст, предоставляющий сведения о проверяемом элементе, который отображается в конструкторе мастера UDI.
DisplayName Указывает понятное имя проверяющего элемента, отображаемое в конструкторе мастера UDI (обычно это имя более описательное, чем атрибут Name ).)
Dll Указывает имя файла .dll, связанного с проверятелем (файл .dll должен существовать в папке installation_folder\Templates\Distribution\Tools\platform (где installation_folder — это папка, в которой установлен MDT, а платформаx86 для 32-разрядной версии или x64 для 64-разрядной версии.)
Имя Указывает имя проверяющего элемента, которое отображается на соответствующей странице мастера UDI и в конструкторе мастера UDI.
Тип Указывает тип проверяющего элемента, который регистрируется с помощью коэффициента реестра и используется для вызова определенного проверяющего элемента в файле .dll.
Замечания

Нет.

Пример

Нет.

ValidatorLibrary

Этот элемент группит набор элементов Validator .

Сведения об элементе

В таблице 68 содержатся сведения об элементе ValidatorLibrary .

Таблица 68. Сведения об элементе ValidatorLibrary

Атрибут Значение
Число вхождений Ноль или один элемент в элементе DesignerConfig (этот элемент необязателен, если в библиотеке DLL нет настраиваемых проверяющих элементов, соответствующих этому файлу конфигурации конструктора мастера UDI.)
Родительские элементы DesignerConfig
Содержание Валидатор
Атрибуты элемента

Этот элемент не имеет атрибутов.

Замечания

Нет.

Пример

<DesignerConfig> + <TaskLibrary> — <ValidatorLibrary> +<Validator DLL="" Description="Требуется текст в поле" Type="Майкрософт. Wizard.Validation.NonEmpty" Name="NonEmpty"> +<Validator DLL="" Description="Не позволяет определенным символам находиться в поле" Type="Майкрософт. Wizard.Validation.InvalidChars" Name="InvalidChars"> +<Validator DLL="" Description="Must a pre-defined pattern" Type="Майкрософт. Wizard.Validation.RegEx" Name="NamedPattern"> +<Validator DLL="" Description="Require the contents match a regular expression" Type="Майкрософт. Wizard.Validation.RegEx" Name="RegEx"></ValidatorLibrary> + <DesignerMappings></DesignerConfig>

Справочник по конструктору мастера UDI

Элементы управления

Элементы управления, используемые для создания настраиваемых редакторов страниц мастера для использования в конструкторе мастера UDI, являются экземплярами UserControl WPF. В таблице 69 перечислены элементы управления, которые можно использовать для создания пользовательских редакторов страниц мастера.

Таблица 69. Элементы управления, которые можно использовать для создания настраиваемых редакторов страниц мастера

Управление Описание
CollectionTControl Этот элемент управления используется для изменения данных, хранящихся в элементе Data в элементе Page .
FieldElementControl Этот элемент управления используется для изменения поля, которое обычно связано с элементом управления TextBox на странице XAML.
SetterControl Этот элемент управления используется для изменения значения элемента задания в файле конфигурации мастера UDI.

CollectionTControl

Этот элемент управления предоставляет множество возможностей для редактирования данных. Лучший способ узнать, как использовать этот элемент управления, — просмотреть пример, в котором показано, как редактировать данные в элементе Data страницы. В частности, в примере показано, как добавлять, удалять и изменять элементы в этом элементе управления.

FieldElementControl

Используйте этот элемент управления для изменения поля, которое обычно связано с элементом управления TextBox на странице XAML.

Пример

В следующем фрагменте из XAML-файла показано использование Элемента управления FieldElementControl для настройки значения по умолчанию для поля на странице мастера с помощью дочернего элемента управления TextBox :

<Controls:FieldElementControl  
Width="450"  
Margin="0,5"  
FieldData="{Binding DataContext.Location, ElementName=ControlRoot}"  
HeaderText="Location Combo Box"  
InstructionText="Here you can configure the behavior of the location combo box."  
HideValidationTab="True">  

<TextBox Text="{Binding FieldData.DefaultValue,  
 UpdateSourceTrigger=PropertyChanged,  
 Mode=TwoWay}"/>  
</Controls:FieldElementControl>  
Свойства
FieldData

Это строковое свойство содержит сведения для подключения Объекта FieldElementControl к базовому XML-коду поля. Соединение выполняется со свойством интерфейса редактора страниц. В следующем фрагменте xaml-файла показано использование свойства FieldData :

FieldData="{Binding DataContext.Location, ElementName=ControlRoot}"  

В этом фрагменте интерфейс редактора страниц называется ControlRoot и указан в параметре ElementName . Привязка выполняется к свойству DataContext.Location интерфейса редактора страницы ControlRoot . DataContext — это модель представления, указывающая на элемент Page в файле конфигурации мастера UDI. Location — это свойство представления, которое возвращает список возможных расположений и определяется элементом Data в файле конфигурации мастера UDI. Каждое расположение определяется элементом DataItem в файле конфигурации мастера UDI.

HeaderText

Это строковое свойство позволяет указать заголовок для элемента управления FieldElementControl . Заголовок выступает в качестве заголовка для элемента управления и отформатирован в виде полужирного оранжевого текста, отображаемого непосредственно над элементом управления.

ИнструкцияText

Это строковое свойство позволяет указать информационный текст для элемента управления FieldElementControl . Как правило, текст используется для предоставления краткого описания поля и объяснения того, как настройка поля влияет на соответствующую страницу мастера.

HideEnableButton

Это логическое свойство позволяет управлять видимостью кнопки, которая изменяет состояние между Разблокировано и Заблокировано (включено или отключено). Если задано значение :

  • True, кнопка не видна

  • Значение false, кнопка отображается (это значение по умолчанию).)

HideDefaultTab

Это логическое свойство позволяет управлять видимостью раздела, содержащего элемент управления, используемый для задания значения по умолчанию. Хотя свойство ссылается на вкладку, в FieldElementControl нет вкладки, а есть раздел, который можно скрыть. Если задано значение :

  • Верно, раздел не отображается

  • False, раздел отображается (это значение по умолчанию).)

HideBorder

Это логическое свойство позволяет управлять видимостью границы вокруг элемента управления полем. Если задано значение :

  • True, граница не видна

  • False, граница видна (это значение по умолчанию).)

HideImage

Это логическое свойство позволяет управлять видимостью образа, настраиваемого свойством FieldImageSource . Если задано значение :

  • True, изображение не отображается

  • False, изображение отображается (это значение по умолчанию).)

HideValidationTab

Это логическое свойство позволяет управлять видимостью раздела, в котором управляется список проверяющих элементов. Хотя свойство ссылается на вкладку, в FieldElementControl нет вкладки, а есть раздел, который можно скрыть. Если задано значение :

  • Верно, раздел не отображается

  • False, раздел отображается (это значение по умолчанию).)

HideSummaryTab

Это логическое свойство позволяет управлять видимостью раздела, в котором настраивают заголовок сводки поля. Заголовок и соответствующее значение из поля отображаются на странице мастера SummaryPage типа в потоке этапа. Хотя свойство ссылается на вкладку, в FieldElementControl нет вкладки, а есть раздел, который можно скрыть. Если задано значение :

  • Верно, раздел не отображается

  • False, раздел отображается (это значение по умолчанию).)

HideTaskSequenceTab

Это логическое свойство позволяет управлять видимостью раздела, в котором настраиваемая переменная последовательности задач, соответствующая полю. Хотя свойство ссылается на вкладку, в FieldElementControl нет вкладки, а есть раздел, который можно скрыть. Если задано значение :

  • Верно, раздел не отображается

  • False, раздел отображается (это значение по умолчанию).)

SetterControl

Используйте этот элемент управления для изменения значения элемента Setter в файле конфигурации мастера UDI. Этот элемент управления содержит дочерний элемент управления, используемый для изменения значения элемента setter .

Пример

В следующем фрагменте из XAML-файла показано использование элемента SetterControl для изменения элемента Setterс именем KeyLocationSetter с помощью дочернего элемента управления TextBox .

<Controls:SetterControl Margin="5"  
        Width="450"  
        HeaderText="Title text"  
        SetterData="{Binding KeyLocationSetter}"   
        InstructionText="What this means..."  
        HorizontalAlignment="Left">  

    <TextBox  
                   Margin="0,3"  
                   Text="{Binding SetterData.SetterValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  
    />  

</Controls:SetterControl>  
Свойства
SetterData

Необходимо привязать его к свойству представления или модели представления, которое подключается к методу задания. Это аналогично привязке к полю, как описано для FieldElementControl.

HeaderText

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

ИнструкцияText

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

Интерфейсы

В таблице 70 перечислены интерфейсы, которые можно использовать для создания пользовательских редакторов страниц мастера.

Таблица 70. Интерфейсы, которые можно использовать для создания пользовательских редакторов страниц мастера

Интерфейс Описание
IDataService Используйте этот интерфейс для подключения полей к элементам Data в файле конфигурации мастера UDI.
IMessageBoxService Этот интерфейс предоставляет доступ к методам, которые можно использовать для отображения полей сообщений.

IDataService

Этот интерфейс содержит несколько свойств и методов, но есть только одно свойство, которое вам нужно. Это свойство является единственным документом, описанным здесь.

Вы можете использовать внедрение зависимостей, чтобы получить указатель на этот интерфейс, используя следующий код в классе:

[Dependency]  
public IDataService DataService { get; set; }  
Свойства

В таблице 71 перечислены свойства интерфейса IDataService .

Таблица 71. Свойства интерфейса IDataService

Интерфейс Описание
CurrentPage Это свойство предоставляет доступ к XML-элементам, атрибутам и значениям в контексте текущей страницы, редактируемой в файле конфигурации мастера UDI.
CurrentPage
XElement CurrentPage { get; set; }  

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

IMessageBoxService

Этот интерфейс предоставляет доступ к методам, которые можно использовать для отображения полей сообщений. Возможно, вам будет интересно, зачем вам нужен интерфейс для отображения окна сообщения. Реальность такова, что это не так: Майкрософт использует этот интерфейс с в коде, так как он помогает писать автоматические тесты для страниц конструктора.

Однако использование этих методов обеспечивает одно полезное преимущество: для диалоговых окон всегда задано значение "владелец" мастера UDI, что гарантирует правильное группирование диалогового окна с главным окном.

Вы можете использовать внедрение зависимостей, чтобы получить указатель на этот интерфейс, используя следующий код в классе:

[Dependency]  
public IMessageBoxService MessageBoxes { get; set; }  
Методы

В таблице 72 перечислены методы для интерфейса IMessageBoxService .

Таблица 72. Методы интерфейса IMessageBoxService

Метод Описание
ShowMessageBox Этот перегруженный метод используется для отображения окна сообщения со следующими элементами:

- ShowMessageBox(String message, String caption, MessageBoxImage icon)
- ShowMessageBox(string message, string caption, MessageBoxButton button, MessageBoxImage icon)
- ShowMessageBox(исключение исключения)
ShowDialogWindow Используйте этот метод для создания диалогового окна.
ShowWizardWindow Используйте этот метод для отображения пользовательского редактора в диалоговом окне, включающее кнопки "Далее" и "Назад" для навигации.
ShowMessageBox

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

Таблица 73. Перегруженные члены для метода ShowMessagBox

Member Описание
ShowMessageBox(String message, String caption, MessageBoxImage icon) Отображает окно сообщения со значком и кнопкой ОК
ShowMessageBox(string message, string caption, MessageBoxButton button, MessageBoxImage icon) Отображает окно сообщения со значком и различными возможными сочетаниями кнопок
ShowMessageBox(исключение исключения) Отображает окно сообщения с информацией об исключении и кнопкой ОК .
ShowMessageBox(String message, String caption, MessageBoxImage icon)
void ShowMessageBox(String message, String caption, MessageBoxImage icon);  

Этот метод отображает окно сообщения с кнопкой ОК . См. таблицу 74.

Таблица 74. Параметры метода ShowMessageBox(String message, String caption, MessageBoxImage icon)

Параметр Описание
message Сообщение, отображаемое в области содержимого окна сообщения
caption Текст, отображающийся в строке заголовка диалогового окна
icon Тип значка, отображаемого в окне сообщения
ShowMessageBox(string message, string caption, MessageBoxButton button, MessageBoxImage icon)
MessageBoxResult ShowMessageBox(string message, string caption, MessageBoxButton button, MessageBoxImage icon);  

Этот метод отображает окно сообщения с нужным набором кнопок и сообщает, какую кнопку вы нажали. См. таблицу 75.

Таблица 75. Параметры метода ShowMessageBox(строковое сообщение, заголовок строки, кнопка MessageBoxButton, значок MessageBoxImage)

Параметр Описание
message Сообщение, отображаемое в области содержимого окна сообщения
caption Текст, отображающийся в строке заголовка диалогового окна
button Какие кнопки отображать
icon Тип значка, отображаемого в окне сообщения
ShowMessageBox(исключение исключения)
void ShowMessageBox(Exception exception);  

Этот метод отображает окно сообщения, в котором отображаются сведения об исключении. В этом окне сообщения есть одна кнопка ОК . См. таблицу 76.

Таблица 76. Параметры метода ShowMessageBox(исключение исключения)

Параметр Описание
Исключение Исключение, о котором требуется сообщить (в диалоговом окне используется исключение. Сообщение в качестве содержимого.)
ShowDialogWindow
void ShowDialogWindow(Type viewType, DialogInteraction dialogPayload);  

Этот метод создает новое диалоговое окно, содержимое которого представляет собой текст, который вы указываете в параметре viewType . Конструктор UDI создает новый экземпляр этого типа и заключает его в диалоговое окно с кнопками ОК и Отмена .

Данные передаются в элемент управления с помощью параметра dialogPayload. Решение SampleEditor в каталоге SDK содержит пример использования этой функции.

ShowWizardWindow
void ShowWizardWindow(Type viewType, DialogInteraction dialogPayload);  

Этот метод позволяет отображать пользовательский редактор в диалоговом окне, включающее кнопки "Далее" и "Назад" для навигации. Майкрософт не предоставил пример использования этого метода.

Справочник по схеме файла конфигурации мастера UDI

Этот файл используется мастером UDI и настраивается конструктором мастера UDI. Этот файл используется для настройки:

  • Страницы мастера, отображаемые в мастере UDI

  • Последовательность страниц мастера в мастере UDI

  • Параметры полей на каждой странице мастера

  • Доступные группы Этапов в конструкторе мастера UDI

  • Доступные этапы в каждом мастере развертывания в конструкторе мастера UDI

    77 перечисляет элементы в файле конфигурации мастера UDI и их описания. Элемент Wizard является корневым узлом для этой ссылки.

Таблица 77. Элементы в файле конфигурации мастера UDI и их описания

Имя элемента Описание
Data Группировать отдельные элементы DataItem в элементе Page и называется по атрибуту Name .
Dataitem Групповая отдельные элементы Setter в элементе Page . Иерархические данные можно создать, включив один или несколько элементов Data в элемент DataItem . Каждый элемент DataItem представляет отдельный элемент. Например, список доступных дисков может содержать DataItem для отображаемого имени и другой элемент DataItem для соответствующей буквы диска.
По умолчанию Задает значение по умолчанию для поля, указанного в родительском элементе Field или RadioGroup . По умолчанию задается значение, заключенное в квадратные скобки этого элемента.
Dll Указывает библиотеку DLL, на которую должны ссылаться мастер UDI и конструктор мастера UDI.
Библиотеки dll Группируемые отдельные элементы DLL .
Ошибка Указывает возможный код ошибки, который может возвращать задача. Значение кода ошибки возвращается HRESULT задачи и перехватывается этим элементом для предоставления более конкретных сведений об ошибке.
ExitCode Указывает возможный код выхода для задачи. Коды выхода — это коды возврата, ожидаемые задачей. Создайте элемент ExitCode для каждого возможного кода выхода. В противном случае можно указать звездочку (*) в атрибуте Value для обработки кодов возврата, не перечисленных в других элементах ExitCode .
ExitCodes Группирование набора элементов ExitCode и Error для элемента Task или Элемента Error .
Поле Указывает экземпляр элемента управления в элементе Page , который используется для настройки с помощью XML. Не все элементы управления разрешают настройку с помощью XML — только элементы управления, использующие элемент Field .
Fields Групповая отдельные элементы Field в элементе Page .
Файл Указывает источник и назначение для операции копирования файла с помощью Майкрософт. Wizard.CopyFilesTask тип задачи. Вы можете включить отдельный элемент File для копирования нескольких файлов в одной задаче.
Page Указывает экземпляр страницы и включает все параметры конфигурации для страницы.
Pageref Указывает ссылку на экземпляр страницы в стадии в группе Stage.
Pages Группируемые отдельные элементы Page .
RadioGroup Задает группу переключателей в элементе Field .
StageGroup Указывает группу из одного или нескольких этапов.
StageGroups Группирование набора групп этапов в файле конфигурации мастера UDI.
Сеттер Задает параметр свойства значения для свойства, именованного в свойстве Property .
Стадия Указывает этап в группе StageGroup и содержит один или несколько элементов PageRef .
Style Группирование отдельных элементов задания , которые настраивают внешний вид мастера UDI, включая заголовок, показанный в верхней части мастера, и изображение баннера, показанное в мастере UDI.
Задача Указывает задачу, которая должна выполняться на странице, указанной в родительском элементе Page .
Tasks Групповая группа задач для элемента Page .
Валидатор Указывает проверяющий элемент управления field, указанный в родительском элементе Field .
Wizard Задает корневой каталог для всех остальных элементов.

Данные

Этот элемент группируется отдельные элементы DataItem в элементе Page и называется по атрибуту Name .

Сведения об элементе

В таблице 78 содержатся сведения об элементе Data .

Таблица 78. Сведения об элементе данных

Атрибут Значение
Число вхождений Ноль или более в каждом элементе Page (этот элемент является необязательным).)
Родительские элементы Page, DataItem
Содержание DataItem, setter
Атрибуты элемента

В таблице 79 перечислены атрибуты элемента Data и приведено описание каждого из них.

Таблица 79. Атрибуты и соответствующие значения для элемента Data

Атрибут Описание
Name Указывает имя элемента Data .
Замечания

Атрибут Name позволяет коду извлекать определенный набор данных.

Пример

Нет.

Dataitem

Этот элемент группет отдельные элементы Setter в элементе Page . Иерархические данные можно создать, включив один или несколько элементов Data в элемент DataItem . Каждый элемент DataItem представляет отдельный элемент. Например, список доступных дисков может содержать DataItem для отображаемого имени и другой элемент DataItem для соответствующей буквы диска.

Сведения об элементе

В таблице 80 содержатся сведения об элементе DataItem .

Таблица 80. Сведения об элементе DataItem

Атрибут Значение
Число вхождений Ноль или более в каждом элементе Data (этот элемент является необязательным).)
Родительские элементы Data
Содержание Data, Setter
Атрибуты элемента

Этот элемент не имеет атрибутов.

Замечания

Нет.

Пример

Нет.

По умолчанию

Этот элемент задает значение по умолчанию для поля, указанного в родительском элементе Field или RadioGroup . По умолчанию задается значение, которое этот элемент содержит в квадратных скобках.

Сведения об элементе

В таблице 81 содержатся сведения об элементе Default .

Таблица 81. Сведения об элементе по умолчанию

Атрибут Значение
Число вхождений Ноль или более в элементе Field или RadioGroup (этот элемент является необязательным).)
Родительские элементы Field, RadioGroup
Содержание Может быть любым хорошо сформированным XML-содержимым, но обычно это стандартный текст.
Атрибуты элемента

Этот элемент не имеет атрибутов.

Замечания

Нет.

Пример

В следующем примере по умолчанию для поля TimeZone задано значение "Стандартное тихоокеанское время".

<Field Name="TimeZone" Enabled="true" VarName="OSDTimeZone" Summary="Time Zone:">  
  <Default>Pacific Standard Time</Default>  

Dll

Этот элемент задает библиотеку DLL для загрузки и ссылок мастера UDI и конструктора мастера UDI.

Сведения об элементе

В таблице 82 содержатся сведения об элементе DLL .

Таблица 82. Сведения об элементе DLL

Атрибут Значение
Число вхождений Один или несколько в элементе БИБЛИОТЕК DLL
Родительский элемент Библиотеки dll
Содержание Не допускается содержимое для этого элемента
Атрибуты элемента

В таблице 83 перечислены атрибуты элемента DLL и приведено описание каждого из них.

Таблица 83. Атрибуты и соответствующие значения для элемента DLL

Атрибут Описание
Имя Указывает имя библиотеки DLL для мастера UDI и конструктора мастера UDI, на которые необходимо ссылаться.
Замечания

Нет.

Пример
<DLLs>  
  <DLL Name="OSDRefreshWizard.dll" />   
  <DLL Name="SharedPages.dll" />  
</DLLs>  

Библиотеки dll

Этот элемент группит отдельные элементы DLL .

Сведения об элементе

В таблице 84 содержатся сведения об элементе библиотек DLL .

Таблица 84. Сведения об элементе библиотек DLL

Атрибут Значение
Число вхождений Одной
Родительские элементы Wizard
Содержание Dll
Атрибуты элемента

Этот элемент не имеет атрибутов.

Замечания

Нет.

Пример
<DLLs>  
   <DLL Name="OSDRefreshWizard.dll" />  
   <DLL Name="SharedPages.dll" />   
</DLLs>  

Error

Этот элемент указывает возможный код ошибки, который может вернуть задача. Значение кода ошибки возвращается и перехватывается HRESULT задачи, чтобы предоставить более конкретные сведения об ошибке.

Сведения об элементе

В таблице 85 содержатся сведения об элементе Error .

Таблица 85. Сведения об элементе ошибки

Атрибут Значение
Число вхождений Ноль или более в каждом элементе ExitCode (этот элемент является необязательным).)
Родительские элементы ExitCodes
Содержание Любое правильно сформированное XML-содержимое
Атрибуты элемента

В таблице 86 перечислены атрибуты элемента Error и приведено описание каждого из них.

Таблица 86. Сведения об элементе ошибки

Атрибут Описание
Состояние Указывает состояние возврата задачи, в которой произошла ошибка. Как правило, для этого атрибута задано значение Error. Это значение отображается в столбце Состояние на странице мастера в мастере UDI.
Text Указывает описательный текст об ошибке, с которой столкнулась задача.
Тип Указывает, представляет ли этот элемент ошибку, предупреждение или успешное выполнение. Значение, указанное вполе Тип, должно быть уникальным в элементе ExitCodes . Ниже приведены допустимые значения для этого элемента:

- 0. Элемент представляет успешное выполнение.
- 1. Элемент представляет предупреждение.
- -1. Элемент представляет ошибку.
Value (Значение) Задает значение кода, возвращенного задачей в виде числового значения. Указание значения звездочки (*) указывает на элемент по умолчанию для кодов возврата, которые не указаны в других элементах Error .
Замечания

Нет.

Пример

Нет.

ExitCode

Этот элемент задает возможный код выхода для задачи. Коды выхода — это коды возврата, ожидаемые задачей. Создайте элемент ExitCode для каждого возможного кода выхода. В противном случае можно указать звездочку (*) в атрибуте Value для обработки кодов возврата, не перечисленных в других элементах ExitCode .

Сведения об элементе

В таблице 87 содержатся сведения об элементе ExitCode .

Таблица 87. Сведения об элементе ExitCode

Атрибут Значение
Число вхождений Ноль или более в каждом элементе ExitCodes (этот элемент является необязательным).)
Родительские элементы ExitCodes
Содержание По крайней мере один элемент ExitCode и ноль или несколько элементов Error
Атрибуты элемента

В таблице 88 перечислены атрибуты элемента ExitCode и приведено описание каждого из них.

Таблица 88. Атрибуты и соответствующие значения для элемента ExitCode

Атрибут Описание
Состояние Указывает состояние возврата задачи. Значение этого атрибута отображается в столбце Состояние на соответствующей странице мастера в мастере UDI. Для этого атрибута можно использовать любые значения, значимые для вашей задачи. Ниже приведены типичные значения, используемые для этого атрибута:

-Успех
-Предупреждение
-Ошибка
Text Указывает описательный текст о существующем коде задачи.
Тип Указывает, представляет ли этот элемент ошибку, предупреждение или успешное выполнение. Значение, указанное в типе, должно быть уникальным в элементе ExitCodes . Ниже приведены допустимые значения для этого элемента:

- 0. Элемент представляет успешное выполнение.
- 1. Элемент представляет предупреждение.
- -1. Элемент представляет ошибку.
Значение Задает значение кода, возвращенного задачей в виде числового значения. Указание значения звездочки (*) указывает на элемент по умолчанию для кодов возврата, которые не перечислены в других элементах ExitCode .
Замечания

Нет.

Пример

Нет.

ExitCodes

Этот элемент группировать набор элементов ExitCode и Error для элемента Task или Error .

Сведения об элементе

В таблице 89 содержатся сведения об элементе ExitCodes .

Таблица 89. Сведения об элементе ExitCodes

Атрибут Значение
Число вхождений По одному в каждом элементе Task
Родительские элементы Задача
Содержание Error, ExitCode
Атрибуты элемента

Этот элемент не имеет атрибутов.

Замечания

Нет.

Пример

Нет.

Поле

Этот элемент задает экземпляр элемента управления в элементе Page , используемом для настройки с помощью XML. Не все элементы управления разрешают настройку с помощью XML — только элементы управления, использующие элемент Field .

Сведения об элементе

В таблице 90 содержатся сведения об элементе Field .

Таблица 90. Сведения об элементе поля

Атрибут Значение
Число вхождений Ноль или больше в каждом элементе Field (этот элемент является необязательным).)
Родительские элементы Fields
Содержание По умолчанию, Проверяющий элемент
Атрибуты элемента

В таблице 91 перечислены атрибуты элемента Field и приведено описание каждого из них.

Таблица 91. Атрибуты и соответствующие значения для элемента Field

Атрибут Описание
Enabled Указывает, включено ли поле для ввода пользователем (атрибуту можно задать значение True или False.)
Имя Указывает имя поля.
Summary Указывает описательный текст, отображаемый на странице мастера сводки , для значения, заданного этим полем.
VarName Указывает имя переменной последовательности задач, считываемой или настроенной с помощью поля в родительском элементе Field .
Замечания

Этот элемент может содержать ноль или несколько элементов Default и ноль или больше элементов Validator .

Пример

Нет.

Поля

Этот элемент группет отдельные элементы Field в элементе Page .

Сведения об элементе

В таблице 92 содержатся сведения об элементе Fields .

Таблица 92. Сведения об элементе Fields

Атрибут Значение
Число вхождений Ноль или более в каждом элементе Page (этот элемент является необязательным).)
Родительские элементы Page
Содержание Field, RadioGroup
Атрибуты элемента

Этот элемент не имеет атрибутов.

Замечания

Нет.

Пример

Нет.

File

Этот элемент задает источник и назначение для операции копирования файла с помощью Майкрософт. Wizard.CopyFilesTask тип задачи. Вы можете включить отдельный элемент File для копирования нескольких файлов в одной задаче.

Сведения об элементе

В таблице 93 содержатся сведения об элементе File .

Таблица 93. Сведения об элементе файла

Атрибут Значение
Число вхождений Один или несколько для каждой задачи, которая имеет тип задачи Майкрософт. Wizard.CopyFilesTask
Родительские элементы Задача
Содержание Нет
Атрибуты элемента

В таблице 94 перечислены атрибуты элемента File и приведено описание каждого из них.

Таблица 94. Атрибуты и соответствующие значения для элемента File

Атрибут Описание
Dest Указывает полный или относительный путь к конечной папке для файла, указанного в атрибуте Source . Переменные среды допускаются как часть пути.
Source Указывает полный или относительный путь к исходному файлу, который Майкрософт. Wizard.CopyFilesTask type copys. Этот атрибут поддерживает подстановочные знаки, чтобы можно было скопировать несколько файлов с помощью одного элемента File . Переменные среды допускаются как часть пути.
Замечания

Нет.

Пример

Нет.

Page

Этот элемент задает экземпляр страницы и включает все параметры конфигурации для страницы.

Сведения об элементе

В таблице 95 содержатся сведения об элементе Page .

Таблица 95. Сведения об элементе страницы

Атрибут Значение
Число вхождений Один или несколько в каждом элементе Pages
Родительские элементы Pages
Содержание Data, Fields, Setter, Tasks
Атрибуты элемента

В таблице 96 перечислены атрибуты элемента Page и приведено описание каждого из них.

Таблица 96. Атрибуты и соответствующие значения для элемента Page

Атрибут Описание
DisplayName Указывает понятное имя страницы мастера, отображаемой в конструкторе мастера UDI. Обычно это имя более описательное, чем атрибут Name .
Имя Указывает имя страницы мастера, отображаемой в конструкторе мастера UDI.
Тип Указывает тип страницы мастера, которая напрямую связана с определенной страницей мастера в библиотеке DLL.
Замечания

Нет.

Пример

Нет.

Pageref

Этот элемент указывает ссылку на экземпляр страницы в stage в группе Stage.

Сведения об элементе

В таблице 97 содержатся сведения об элементе PageRef .

Таблица 97. Сведения об элементе PageRef

Атрибут Значение
Число вхождений Один или несколько элементов в элементе Stage
Родительские элементы Стадия
Содержание Нет
Атрибуты элемента

В таблице 98 приведен атрибут элемента PageRef и его описание.

Таблица 98. Атрибуты и соответствующие значения элемента PageRef

Атрибут Описание
Page Указывает экземпляр страницы в стадии в группе Stage. Присвойте этому значению атрибут Name элемента Page .
Замечания

Нет.

Пример

Нет.

Страницы

Этот элемент группит отдельные элементы Page .

Сведения об элементе

В таблице 99 содержатся сведения об элементе Pages .

Таблица 99. Сведения об элементе Pages

Атрибут Значение
Число вхождений Одной
Родительские элементы Wizard
Содержание Page
Атрибуты элемента

Этот элемент не имеет атрибутов.

Замечания

Нет.

Пример
<Pages>  
   + <Page Name="WelcomePage" DisplayName="Welcome" Type="Microsoft.SharedPages.WelcomePage">  
   + <Page Name="ConfigScanPage" DisplayName="Deployment Readiness" Type="Microsoft.OSDRefresh.ConfigScanPage">  
   + <Page Name="ConfigScanBareMetal" DisplayName="Deployment Readiness" Type="Microsoft.OSDRefresh.ConfigScanPage">  
   + <Page Name="RebootPage" DisplayName="Reboot" Type="Microsoft.OSDRefresh.RebootPage">  
   + <Page Name="WelcomePageReplace" DisplayName="Welcome" Type="Microsoft.SharedPages.WelcomePage">  
   + <Page Name="VolumePage" DisplayName="Volume" Type="Microsoft.OSDRefresh.VolumePage">  
   + <Page Name="UserRestorePage" DisplayName="Select Target" Type="Microsoft.OSDRefresh.UserStatePage">  
   + <Page Name="ComputerPage" DisplayName="New Computer Details" Type="Microsoft.OSDRefresh.ComputerPage">  
   + <Page Name="AdminAccounts" DisplayName="Administrator Password" Type="Microsoft.SharedPages.AdminAccountsPage">  
   + <Page Name="UDAPage" DisplayName="User Device Affinity" Type="Microsoft.OSDRefresh.UDAPage">  
   + <Page Name="LanguagePage" DisplayName="Language" Type="Microsoft.OSDRefresh.LanguagePage">  
   + <Page Name="ApplicationPage" DisplayName="Install Programs" Type="Microsoft.OSDRefresh.ApplicationPage">  
     <Page Name="SummaryPage" DisplayName="Summary" Type="Microsoft.Shared.SummaryPage" />   
   + <Page Name="UserCapturePageOldPC" DisplayName="Select Target" Type="Microsoft.OSDRefresh.UserStatePage">  
   + <Page Name="ProgressPage" DisplayName="Capture Data" Type="Microsoft.OSDRefresh.ProgressPage">  
   + <Page Name="RebootAfterCapture" DisplayName="Reboot" Type="Microsoft.OSDRefresh.RebootPage">  
</Pages>  

RadioGroup

Этот элемент задает группу переключателей с элементом Field .

Сведения об элементе

В таблице 100 содержатся сведения об элементе RadioGroup .

Таблица 100. Сведения об элементе RadioGroup

Атрибут Значение
Число вхождений Ноль или более в элементе Fields (этот элемент является необязательным).)
Родительские элементы Fields
Содержание По умолчанию
Атрибуты элемента

В таблице 101 перечислены атрибуты элемента RadioGroup и приведено описание каждого из них.

Таблица 101. Атрибуты и соответствующие значения элемента RadioGroup

Атрибут Описание
Locked Указывает, включена ли группа переключателей для ввода пользователем. Атрибуту можно задать следующее:

- True. Указывает, что переключатели отключены и пользователи не могут выбрать переключатель в группе.
- False. Указывает, что переключатели включены и пользователи могут выбрать переключатель в группе.
Имя Указывает имя группы параметров радиосвязи.
Замечания

Нет.

Пример

Нет.

StageGroup

Этот элемент указывает группу этапов развертывания.

Сведения об элементе

В таблице 102 содержатся сведения об элементе StageGroup .

Таблица 102. Сведения об элементе StageGroup

Атрибут Значение
Число вхождений Один или несколько элементов в элементе StageGroups
Родительские элементы StageGroups
Содержание Стадия
Атрибуты элемента

В таблице 103 перечислены атрибуты элемента StageGroup и описание атрибута.

Таблица 103. Атрибуты и соответствующие значения для элемента StageGroup

Атрибут Описание
DisplayName Указывает понятное имя группы этапов, отображаемое в конструкторе мастера UDI. Обычно это имя более описательное, чем атрибут Name .
Замечания

Нет.

Пример

Нет.

StageGroups

Этот элемент группирования набора групп этапов в файле конфигурации мастера UDI.

Сведения об элементе

В таблице 104 содержатся сведения об элементе StageGroups .

Таблица 104. Сведения об элементе StageGroups

Атрибут Значение
Число вхождений Ноль или единица в элементе Wizard
Родительские элементы Wizard
Содержание StageGroup
Атрибуты элемента

Этот элемент не имеет атрибутов.

Замечания

Нет.

Пример

Нет.

Сеттер

Этот элемент задает параметр свойства для значения свойства, именованного в свойстве Property .

Сведения об элементе

В таблице 105 содержатся сведения об элементе Setter .

Таблица 105. Сведения об элементе setter

Атрибут Значение
Число вхождений Ноль или больше в каждом родительском элементе (этот элемент является необязательным).)
Родительские элементы Data, DataItem, Page, Style, Task, Validator
Содержание Содержит строковое значение в атрибуте Property .
Атрибуты элемента

В таблице 106 приведен атрибут элемента Setter и его описание.

Таблица 106. Атрибуты и соответствующие значения для элемента Setter

Атрибут Описание
Свойство Задает имя задаемого свойства. Для имени свойства задается значение, которое этот атрибут содержит в квадратных скобках.
Замечания

Нет.

Пример

Нет.

Стадия

Этот элемент задает элемент Stage внутри StageGroup и содержит один или несколько элементов PageRef .

Сведения об элементе

В таблице 107 содержатся сведения об элементе Stage .

Таблица 107. Сведения об элементе этапа

Атрибут Значение
Число вхождений Один или несколько элементов в элементе StageGroup
Родительские элементы StageGroup
Содержание Pageref
Атрибуты элемента

В таблице 108 перечислены атрибуты элемента Stage и приведено описание каждого из них.

Таблица 108. Атрибуты и соответствующие значения для элемента Stage

Атрибут Описание
DisplayName Указывает понятное имя страницы мастера, отображаемой в конструкторе мастера UDI. Обычно это имя более описательное, чем атрибут Name .
Имя Указывает имя этапа. Значение этого элемента используется при запуске мастера UDI с параметром командной строки /stage: name .
Замечания

Нет.

Пример

Нет.

Style

Этот элемент группировать отдельные элементы setter , которые настраивают внешний вид мастера UDI, включая заголовок, показанный в верхней части мастера, и изображение баннера, показанное в мастере UDI.

Сведения об элементе

В таблице 109 содержатся сведения об элементе Style.

Таблица 109. Сведения об элементе стиля

Атрибут Значение
Число вхождений Одной
Родительские элементы Wizard
Содержание Сеттер
Атрибуты элемента

Этот элемент не имеет атрибутов.

Замечания

Нет.

Пример
<Style>  
  <Setter Property="bannerFilename">UDI_Wizard_Banner.bmp</Setter>   
  <Setter Property="title">Operating System Deployment (OSD) Refresh Wizard</Setter>   
</Style>  

Задача

Этот элемент задает задачу, которая должна выполняться на странице, указанной в родительском элементе Page .

Сведения об элементе

В таблице 110 содержатся сведения об элементе Task .

Таблица 110. Сведения об элементе задачи

Атрибут Значение
Число вхождений Один или несколько элементов в элементе Tasks
Родительские элементы Tasks
Содержание ExitCodes, File, Setter
Атрибуты элемента

В таблице 111 перечислены атрибуты элемента Task и приведено описание каждого из них.

Таблица 111. Атрибуты и соответствующие значения для элемента Task

Атрибут Описание
DependsOn Указывает, зависит ли задача от другой задачи. Для этого атрибута задается атрибут Name другого элемента Task . Примечание: Этот атрибут нельзя настроить с помощью конструктора мастера UDI. Однако этот атрибут можно вручную добавить в элемент Task , напрямую изменив файл .xml.
DisplayName Указывает понятное имя задачи, отображаемое в конструкторе мастера UDI. Обычно это имя более описательное, чем атрибут Name .
Имя Указывает имя задачи. Это имя должно быть уникальным.
Тип Указывает тип выполняемой задачи, который определяется в библиотеке DLL, содержащей задачу.
Замечания

Нет.

Пример

Нет.

Задачи

Этот элемент группит набор задач для элемента Page .

Сведения об элементе

В таблице 112 содержатся сведения об элементе Tasks .

Таблица 112. Сведения об элементе Tasks

Атрибут Значение
Число вхождений Ноль или по одному в каждом элементе Page (этот элемент является необязательным).
Родительские элементы Page
Содержание Задача
Атрибуты элемента

В таблице 113 перечислены атрибуты элемента Tasks и приведено описание каждого из них.

Таблица 113. Атрибуты и соответствующие значения для элемента Tasks

Атрибут Описание
NameTitle Указывает заголовок, который отображается в верхней части столбца, содержащего имена задач на соответствующей странице мастера.
StatusTitle Указывает заголовок, который отображается в верхней части столбца, содержащего состояние задач на соответствующей странице мастера.
Замечания

Нет.

Пример

Нет.

Валидатор

Этот элемент задает проверяющий элемент управления field, указанный в родительском элементе Field .

Сведения об элементе

В таблице 114 содержатся сведения об элементе Validator .

Таблица 114. Сведения об элементе проверяющего элемента

Атрибут Значение
Число вхождений Ноль или единица в элементе Field
Родительские элементы Поле
Содержание Сеттер
Атрибуты элемента

В таблице 115 приведен атрибут элемента Validator и его описание.

Таблица 115. Атрибуты и соответствующие значения для элемента Validator

Атрибут Описание
Тип Указывает тип проверяющего элемента, который определяется в библиотеке DLL, содержащей проверяющий элемент.
Замечания

Нет.

Пример

Нет.

Мастер

Этот элемент задает корень для всех остальных элементов.

Сведения об элементе

В таблице 116 содержатся сведения об элементе Wizard .

Таблица 116. Сведения об элементах мастера

Атрибут Значение
Число вхождений Одной
Родительские элементы Нет
Содержание Библиотеки DLL, Pages, StageGroups, Стиль
Атрибуты элемента

Этот элемент не имеет атрибутов.

Замечания

Нет.

Пример
<Wizard>  
   + <DLLs>  
   + <Style>  
   + <Pages>  
   + <StageGroups>  
</Wizard>