Instalación controlada por el usuario: Guía para desarrolladores

La instalación controlada por el usuario (UDI) ayuda a simplificar la implementación de sistemas operativos cliente windows®, como Windows 8.1, en equipos que usan la característica de implementación de sistema operativo (OSD) en Microsoft ® System Center 2012 R2 Configuration Manager. UDI forma parte del kit de herramientas de implementación de Microsoft (MDT).

Introducción

Normalmente, al implementar sistemas operativos con la característica OSD, debe proporcionar toda la información necesaria para implementar el sistema operativo. La información se configura en archivos de configuración o en bases de datos (como el archivo CustomSettings.ini o la base de datos MDT [MDT DB]). Debe proporcionar todas las opciones de configuración para poder iniciar la implementación.

UDI proporciona una interfaz controlada por el asistente que permite proporcionar información de configuración inmediatamente antes de realizar la implementación. Este comportamiento permite crear secuencias de tareas OSD genéricas y, a continuación, proporcionar información específica del equipo en el momento de la implementación, lo que proporciona mayor flexibilidad en el proceso de implementación.

Audiencia de destino

Esta guía está escrita para los desarrolladores que crean páginas de asistente personalizadas para el Asistente para UDI y editores de páginas del asistente personalizado para el Diseñador del Asistente para UDI. En esta guía se supone que está familiarizado con el desarrollo de aplicaciones windows mediante:

  • C++, que se usa para crear páginas personalizadas del asistente

  • Microsoft .NET Framework, que se usa para crear editores de páginas del asistente personalizado

  • Windows Presentation Foundation (WPF), que se usa para crear editores de páginas del asistente personalizado

  • Lenguajes compatibles con WPF, como C#, C++, o Microsoft Visual Basic® .NET, que se usan para crear editores de páginas del asistente personalizados

Acerca de esta guía

Esta guía proporciona la información de referencia necesaria para ayudarle a personalizar la UTI para su organización. En esta guía no se tratan temas administrativos ni operativos, como la instalación de MDT (que incluye UDI), la configuración de UDI para implementar sistemas operativos y aplicaciones o la realización de implementaciones mediante el Asistente para UDI. Para obtener más información sobre esos temas, consulte los temas de UDI en Uso del kit de herramientas de implementación de Microsoft, que se incluye con MDT.

Introducción al desarrollo de UDI

El desarrollo de UDI permite ampliar las características que proporciona UDI. Normalmente, el desarrollo de UDI es necesario cuando se desea recopilar información adicional que consume el proceso de implementación de UDI. Esta información adicional normalmente se guarda como variables de secuencia de tareas que pasos de secuencia de tareas en una secuencia de tareas UDI en Configuration Manager lectura.

Arquitectura de UDI

El objetivo de alto nivel del desarrollo de UDI es crear páginas del asistente personalizadas que se pueden mostrar en el Asistente para UDI. Al crear páginas de asistente personalizadas, puede ampliar las características existentes de UDI para satisfacer los requisitos empresariales y técnicos de su organización. Una página del asistente personalizada recopila información además o en lugar de las páginas del asistente que proporciona UDI.

En la figura 1 se muestra la relación entre el Diseñador del Asistente para UDI y el Asistente para UDI.

Figura 1. Relación entre el Asistente para UDI y la Figura 1 del Diseñador del Asistente para UDI . Relación entre el Asistente para UDI y el Diseñador del Asistente para UDI

Figura 1. Relación entre el Asistente para UDI y el Diseñador del Asistente para UDI

A nivel conceptual, el desarrollo de UDI incluye la creación de:

  • Páginas del asistente personalizadas. Las páginas del asistente se muestran en el Asistente para UDI y recopilan la información necesaria para completar el proceso de implementación. Las páginas del asistente se crean mediante C++ en Microsoft Visual Studio®. Las páginas del asistente personalizadas se implementan como archivos DLL que lee el Asistente para UDI. El kit de desarrollo de software (SDK) de UDI incluye un ejemplo de cómo crear páginas de asistente personalizadas.

  • Editores de páginas del asistente personalizados. Use editores de páginas del asistente para configurar el comportamiento de la página del asistente personalizada. Los editores de páginas del asistente personalizado se implementan como archivos DLL que lee el Diseñador del Asistente para UDI. Los editores de páginas del asistente se crean mediante:

    • WPF versión 4.0

    • Microsoft Prism versión 4.0

    • Microsoft Bloque de aplicaciones de Unity (Unity) versión 2.1

      MDT incluye todos los ensamblados necesarios para crear un editor de páginas del asistente personalizado para su uso en el Diseñador del Asistente para UDI. El SDK de UDI incluye un ejemplo de cómo crear editores de páginas de asistente personalizados.

    Además, el Diseñador del Asistente para UDI consume archivos de configuración del editor de páginas del asistente auxiliares. Los archivos de configuración del editor de páginas del asistente se crean como parte del proceso para crear páginas del asistente personalizadas y editores de páginas del asistente personalizados. El Diseñador del Asistente para UDI crea la información XML necesaria en el archivo de configuración del Asistente para UDI y en el archivo .app correspondiente.

Preparación del entorno de desarrollo de UDI

Antes de empezar a crear sus propias páginas de asistente personalizadas y editores de páginas del asistente, realice los pasos siguientes para preparar el entorno de desarrollo de UDI:

  1. Prepare los requisitos previos del entorno de desarrollo de UDI como se describe en Preparación de los requisitos previos del entorno de desarrollo de UDI.

  2. Configure el entorno de desarrollo de UDI como se describe en Configuración del entorno de desarrollo de UDI.

  3. Compruebe que el entorno de desarrollo de UDI está configurado correctamente como se describe en Comprobación del entorno de desarrollo de UDI.

Preparación de los requisitos previos del entorno de desarrollo de UDI

Para preparar los requisitos previos del entorno de desarrollo de UDI, siga estos pasos:

  1. Prepare los perquisitios de hardware del entorno de desarrollo de UDI como se describe en Preparación de los requisitos previos de hardware del entorno de desarrollo de UDI.

  2. Prepare los programas de software del entorno de desarrollo de UDI como se describe en Preparación de los requisitos previos de software del entorno de desarrollo de UDI.

Preparación de los requisitos previos de hardware del entorno de desarrollo de UDI

Los requisitos previos de hardware del entorno de desarrollo de UDI son los mismos requisitos de hardware para la edición de Microsoft Visual Studio que usa. Para obtener más información sobre estos requisitos, consulte los requisitos del sistema para cada edición en la documentación de Visual Studio.

Preparación de los requisitos previos de software del entorno de desarrollo de UDI

El entorno de desarrollo de UDI tiene los siguientes requisitos previos de software:

  • Cualquier sistema operativo Windows compatible con Visual Studio 2010 (se recomienda Windows 7 o Windows Server® 2008 R2).

    Necesitará un sistema operativo Windows que admita la arquitectura de procesador para la que desea desarrollar. Puede realizar el desarrollo de UDI de 32 y 64 bits mediante un sistema operativo de 64 bits. Solo se realiza el desarrollo de UDI de 32 bits en sistemas operativos de 32 bits. Por este motivo, debe usar un sistema operativo de 64 bits.

    Nota:

    Las versiones intelitanium (IA-64) del sistema operativo Windows no son compatibles con entornos de desarrollo de UDI.

    Para obtener más información sobre los sistemas operativos compatibles con Visual Studio 2010, consulte los requisitos del sistema para cada edición en la documentación de Visual Studio.

  • Microsoft versión 4.0 de .NET Framework (requerida por Visual Studio 2010)

  • Lenguaje C++ (el lenguaje usado en la extensión de páginas del Asistente para UDI)

  • Otros lenguajes compatibles con WPF, como C#, Visual Basic .NET o C++/Common Language Infrastructure, que se usan para ampliar los editores de páginas del Asistente para asistente para UDI

    Nota:

    El código fuente de ejemplo para los editores de páginas del Asistente para asistente para UDI se escribe en C#. Instale el lenguaje C# si desea usar el código fuente de ejemplo.

Configuración del entorno de desarrollo de UDI

Una vez cumplidos los requisitos previos del entorno de desarrollo de UDI, siga estos pasos para configurar el entorno de desarrollo de UDI:

  1. Instale Visual Studio 2010.

    Asegúrese de instalar el lenguaje C++ y cualquier otro lenguaje compatible con WPF.

    Nota:

    El código fuente de ejemplo de las páginas del editor del Diseñador del Asistente para UDI se escribe en C#. Instale el lenguaje C# si desea usar el código fuente de ejemplo.

    Para obtener más información sobre cómo instalar Visual Studio 2010, vea Instalación de Visual Studio.

  2. Instale MDT.

    Para obtener más información sobre cómo instalar MDT, consulte la sección "Instalación o actualización a MDT" en el documento de MDT Uso del kit de herramientas de implementación de Microsoft.

  3. En el Explorador de Windows, cree local_folder (donde local_folder es cualquier carpeta ubicada en una unidad local del equipo de desarrollo).

  4. Copie la carpeta installation_folder\SDK en local_folder (donde installation_folder es la carpeta en la que instaló MDT y local_folder es cualquier carpeta ubicada en una unidad local del equipo de desarrollo).

    Copie la carpeta del SDK en otra ubicación porque MDT está instalado en la carpeta Archivos de programa, que no se puede escribir en sin permisos elevados. Copiar la carpeta del SDK en otra ubicación permite modificar los archivos de la carpeta del SDK sin necesidad de permisos elevados.

  5. Copie la carpeta installation_folder\Templates\Distribution\Tools en local_folder (donde installation_folder es la carpeta en la que instaló MDT y local_folder es la carpeta que creó anteriormente en el proceso).

  6. Cambie el nombre de la carpeta local_folder\Tools a local_folder\OSDSetupWizard(donde local_folder es la carpeta que creó anteriormente en el proceso).

    Cuando se complete, la estructura de carpetas debajo de local_folder debe ser similar a la estructura de carpetas que se muestra en la figura 2 (donde local_folder es la carpeta que creó anteriormente en el proceso y se muestra como UDIDevelopment en la ilustración ).

    Figura 2. Estructura de carpetas para el desarrollo de UDI Figura 2. Estructura de carpetas para el desarrollo de UDI

    Figura 2. Estructura de carpetas para el desarrollo de UDI

Comprobación del entorno de desarrollo de UDI

Cuando se configura el entorno de desarrollo de UDI, compruebe que el entorno de desarrollo de UDI está configurado correctamente asegurándose de que los proyectos de ejemplo se compilan correctamente en Visual Studio 2010.

Compruebe que el entorno de desarrollo de UDI está configurado correctamente mediante la determinación de si:

Comprobar que el proyecto SamplePage se compila correctamente

El proyecto SamplePage proporciona un ejemplo de cómo crear una página de asistente personalizada para el Asistente para UDI. Para obtener más información sobre el proyecto SamplePage, vea Revisar la solución SamplePage de Visual Studio.

Para comprobar que el proyecto SamplePage se compila correctamente

  1. Inicie Visual Studio 2010.

  2. Abra el proyecto SamplePage.

    El proyecto SamplePage reside en la carpeta local_folder\SDK\UDI\SamplePage (donde local_folder es la carpeta que creó anteriormente en el proceso).

  3. En Visual Studio 2010, en Explorador de soluciones, haga clic con el botón derecho en el proyecto SamplePage y, a continuación, haga clic en Propiedades.

    Aparece el cuadro de diálogo Páginas de propiedades de SamplePage .

  4. En el cuadro de diálogo Páginas de propiedades de SamplePage , vaya a Propiedades de configuración/Depuración.

  5. En las propiedades de depuración, en Configuración, seleccione Todas las configuraciones.

  6. En las propiedades de depuración, en Comando, escriba $(TargetDir)\OSDSetupWizard.exe.

  7. En las propiedades de depuración, en Directorio de trabajo, escriba $(TargetDir).

  8. En el cuadro de diálogo Páginas de propiedades de SamplePage , vaya a Propiedades de configuración/Eventos de compilación/Evento posterior a la compilación.

  9. En las propiedades del evento posterior a la compilación, en Línea de comandos, escriba lo siguiente:

    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. En el cuadro de diálogo Páginas de propiedades de SamplePage , haga clic en Aceptar.

  11. Guarde el proyecto.

  12. En el menú Depurar , haga clic en Iniciar depuración.

    Aparece el cuadro de diálogo Microsoft Visual Studioque indica que el origen está obsoleto y pregunta si desea compilar el proyecto.

  13. En el cuadro de diálogo Microsoft Visual Studio, haga clic en .

    Aparece el cuadro de diálogo Sin información de depuración que le informa de que no hay información de depuración disponible para OSDSetupWizard.exe.

  14. En el cuadro de diálogo Sin información de depuración , haga clic en .

    El Asistente para UDI se abre con la página del asistente personalizado mostrada.

  15. Compruebe que puede seleccionar un valor en Elegir su ubicación.

  16. En el formulario de página Asistente con ejemplo , haga clic en Cancelar.

    Aparece el cuadro de diálogo Asistente para cancelar .

  17. En el cuadro de diálogo Asistente para cancelar , haga clic en .

  18. Cierre Visual Studio 2010.

Comprobar que el proyecto SampleEditor se compila correctamente

El proyecto SampleEditor proporciona un ejemplo de cómo crear un editor de páginas del asistente personalizado para el Diseñador del Asistente para UDI. Para obtener más información sobre el proyecto SampleEditor, vea Revisar la solución SamplePage de Visual Studio.

Para comprobar que el proyecto SampleEditor se compila correctamente

  1. Inicie Visual Studio 2010.

  2. Abra el proyecto SampleEditor.

    El proyecto SampleEditor reside en la carpeta local_folder\SDK\UDI\SampleEditor (donde local_folder es la carpeta que creó anteriormente en el proceso).

  3. En Visual Studio 2010, en Explorador de soluciones, seleccione el proyecto SampleEditor.

  4. En el menú Proyecto , haga clic en Agregar referencia.

    Se abre el cuadro de diálogo Agregar referencia .

  5. En el cuadro de diálogo Agregar referencia , haga clic en la pestaña Examinar .

  6. En la pestaña Examinar , vaya a installation_folder\Bin (donde installation_folder es la carpeta en la que instaló MDT). Seleccione los siguientes archivos y, a continuación, haga clic en Aceptar:

    • 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

    Nota:

    Puede seleccionar varios archivos en la pestaña Examinar manteniendo presionada la tecla CTRL mientras hace clic en los archivos.

  7. En Explorador de soluciones, vaya a SampleEditor/References.

  8. Compruebe que ninguna de las referencias tenga advertencias o errores.

  9. En Explorador de soluciones, haga clic con el botón derecho en el proyecto SampleEditor y, a continuación, haga clic en Propiedades.

    Aparece el cuadro de diálogo Páginas de propiedades SampleEditor .

  10. En el cuadro de diálogo Páginas de propiedades sampleeditor , haga clic en la pestaña Depurar .

  11. En la pestaña Depurar , haga clic en Iniciar programa externo.

  12. En Iniciar programa externo, escriba installation_folder\Bin\UDIDesigner.exe (donde installation_folder es la carpeta en la que instaló MDT) y, a continuación, haga clic en Aceptar.

    Sugerencia

    Puede hacer clic en el botón de puntos suspensivos (...) para ir a la carpeta y seleccionar UDIDesigner.exe.

  13. En el menú Archivo , haga clic en Guardar todo.

  14. Copie el archivo \SDK\SamplePage\SamplePage.dll.config local_folder en la carpeta installation_folder\Bin\Config (donde local_folder es la carpeta que creó en el equipo de desarrollo anteriormente en el proceso de configuración yinstallation_folder es la carpeta en la que instaló MDT).

  15. En Visual Studio 2010, en el menú Depurar , haga clic en Iniciar depuración.

    Se inicia el Diseñador del Asistente para UDI.

  16. En el Diseñador del Asistente para UDI, en la cinta de opciones, haga clic en Abrir.

    Aparece el cuadro de diálogo Abrir.

  17. En el cuadro de diálogo Abrir , abra el archivo\SDK\SamplePage\SamplePage\Config.xml local_folder (donde local_folder es la carpeta que creó en el equipo de desarrollo anteriormente en el proceso de configuración).

    Se abre el archivo Config.xml y el grupo de fases personalizado se muestra en el panel de detalles.

  18. En el panel de detalles, haga clic en la pestaña Configurar .

  19. Revise la información de configuración del cuadro Ubicación , incluido lo siguiente:

    • Botón desbloqueado, con el que habilita o deshabilita el cuadro Ubicación

    • Cuadro Valor predeterminado, en el que se escribe un valor predeterminado que se mostrará en el cuadro Ubicación

    • Nombre para mostrar descriptivo visible en la página de resumen, en la que se escribe el título de la información mostrada en la página Resumen

    • Cuadro de lista ubicación , que incluye una lista de ubicaciones posibles

  20. Cierre el Diseñador del Asistente para UDI.

  21. Cierre Visual Studio 2010.

Revisión de los ejemplos del SDK de UDI

Antes de comenzar el desarrollo, revise los ejemplos proporcionados en el SDK de UDI. Use la información de esta guía y el código fuente de los ejemplos para ayudarle a crear sus propias páginas de asistente personalizadas de UDI y editores de páginas del asistente.

Revise los ejemplos del SDK de UDI; para ello, revise lo siguiente:

Revisar el contenido de la carpeta del SDK

Durante la configuración del entorno de desarrollo de UDI, copió la carpeta del SDK de la carpeta en la que instaló MDT en otra carpeta que creó. En la tabla 1 se enumeran las carpetas inmediatamente debajo de la carpeta del SDK y se proporciona una breve descripción de cada una de ellas.

Tabla 1. Carpetas en el SDK de UDI

Folder Esta carpeta contiene
Incluye Los archivos de encabezado de C++ necesarios para crear páginas de asistente personalizadas para el Asistente para UDI
Libs Los archivos de biblioteca de C++ que se vincularán a la página personalizada; hay versiones de 32 y 64 bits de las bibliotecas de vínculos estáticos. Nota: Las versiones de Itanium de las bibliotecas (IA-64) no están disponibles.
SampleEditor Un proyecto de Visual Studio para compilar un editor personalizado que se usa para editar la página SamplePage en el Diseñador del Asistente para UDI, que se escribe en C #
SamplePage Un proyecto de Visual Studio para crear una página del asistente de UDI personalizada, que se escribe en Visual C++

Revisión de la solución SamplePage de Visual Studio

Antes de empezar a crear las páginas del asistente personalizado y los editores de páginas del asistente, realice las siguientes tareas para preparar el entorno de desarrollo de UDI:

Revisión del ciclo de vida de la página del asistente

Una página del asistente de UDI tiene métodos que corresponden a cada fase (o fase) del ciclo de vida de la página. Como parte de la creación de la página del asistente personalizado, debe invalidar estos métodos con el código. En la tabla 2 se enumeran los métodos que necesitará invalidar y se proporciona una breve descripción de cada método, incluido cuándo usar el método en el ciclo de vida de la página del asistente.

Tabla 2. Métodos de un ciclo de vida de página del asistente

Método Descripción
OnWindowCreated Se llama a este método una vez, una vez creada la ventana de la página.

Para este método, escriba código que inicialice la página por primera vez y solo debe realizarse una vez. Por ejemplo, use este método para inicializar campos o para leer información de configuración de los elementos Setter en el archivo de configuración del Asistente para UDI.
OnWindowShown Se llama a este método cada vez que se muestra la página (se muestra) en el Asistente para UDI. Se llama la primera vez que se muestra la página y cada vez que navega a la página, haga clic en Siguiente o Atrás en el asistente.

Para este método, escriba código que prepare la página que se va a mostrar, por ejemplo, leer variables de memoria, variables de secuencia de tareas o variables de entorno y, a continuación, actualizar la página en función de los cambios realizados en esas variables.
OnCommonControlEvent Se puede llamar a este método cada vez que se muestre la página del asistente y reciba un mensaje WM_NOTIFY de un elemento secundario (normalmente, controles comunes).

Para este método, escriba código que controle WM_NOTIFY en función del mensaje de notificación. Por ejemplo, es posible que desee responder a eventos de un control común, como responder a eventos de clic o de doble clic para un control TreeView .
OnUnhandledEvent Se llama a este método cada vez que se produce un mensaje de ventana no controlada para la página del asistente. Este método proporciona la oportunidad de interceptar y controlar estos mensajes de ventana no controlados de otro modo.

Para este método, escriba código que controle los mensajes de ventana que son pertinentes para la página del asistente. Normalmente, no es necesario invalidar este método.
OnNextClicked Se llama a este método al hacer clic en Siguiente en el asistente.

Para este método, escriba código que realice las acciones necesarias antes de pasar a la siguiente página del asistente, por ejemplo, realizar una validación que puede tardar mucho tiempo. Si se produce un error en la validación, puede cancelar la solicitud Siguiente y mostrar un mensaje.
OnWindowHidden Se llama a este método cada vez que se oculta la página cuando se muestra la página del asistente anterior o siguiente.

Para este método, escriba código que realice cualquier acción antes de que se oculte la página, antes de que se muestre otra página. Normalmente, no es necesario invalidar este método.

Revisar el ejemplo de SamplePage

Revise el ejemplo samplePage mediante la lista siguiente, que representa la secuencia de eventos durante el ciclo de vida de la página del asistente del ejemplo SamplePage:

  1. El Asistente para UDI, OSDSetupWizard.exe, lee la información de configuración del archivo de configuración del Asistente para UDI en el ejemplo (el archivo Config.xml) tal como se describe en Paso 1: El Asistente para UDI (OSDSetupWizard.exe) lee el archivo de Config.xml.

  2. El Asistente para UDI carga los archivos DLL necesarios para cada página del asistente que aparece en el archivo de configuración del Asistente para UDI, tal como se describe en Paso 2: El Asistente para UDI carga el archivo DLL para la página asistente personalizada.

  3. El Asistente para UDI muestra la página del asistente personalizado y permite la interacción de control deseada, tal como se describe en Paso 3: El Asistente para UDI Muestra la página del Asistente personalizado.

  4. Cuando la página del asistente personalizado haya recopilado la información, realice las tareas necesarias antes de hacer clic en Siguiente para continuar con el siguiente asistente, como se describe en Paso 4: Se hace clic en el botón Siguiente en la página Asistente personalizado.

Paso 1: El Asistente para UDI (OSDSetupWizard.exe) lee el archivo Config.xml

Cuando se inicia el Asistente para UDI (OSDSetupWizard.exe), de forma predeterminada lee el archivo de configuración del Asistente para UDI, que es el archivo UDIWizard_Config.xml: el archivo de configuración principal para el Asistente para UDI.

Nota:

En el ejemplo se usa el archivo Config.xml como archivo de configuración. En MDT, el archivo de configuración predeterminado es el archivo de UDIWizard_Config.xml, que reside en la carpeta Scripts del paquete MDT Files para la configuración.

Puede invalidar el archivo de configuración predeterminado que usa el Asistente para UDI modificando el paso de secuencia de tareas del Asistente para UDI para usar el parámetro /definition . Para obtener más información sobre cómo invalidar el archivo de configuración predeterminado que usa el Asistente para UDI, vea "Invalidar el archivo de configuración que usa el Asistente para UDI".

Los elementos de nivel superior del archivo Config.xml son los

  • Elemento DLLs

  • Elemento Style

  • Elemento Pages

  • Elemento StageGroups

    Para obtener más información sobre el esquema del archivo de configuración del Asistente para UDI y cada uno de estos elementos, vea Referencia del esquema del archivo de configuración del Asistente para UDI.

    El Asistente para UDI examina el elemento DLL en busca de los archivos .dll que se van a cargar. En el ejemplo, se muestran dos archivos .dll: SamplePage.dll y SharedPages.dll. Estos archivos .dll deben residir en la misma carpeta que OSDSetupWizard.exe: la carpeta Tools\platform (donde la plataforma es x86 para la versión de 32 bits o x64 para la versión de 64 bits).

    El Asistente para UDI examina el elemento Pages en busca de las páginas definidas. En el ejemplo, se definen dos páginas: Custom y SummaryPage. El atributo Type del elemento Page se define en el archivo PageClassIDs.h y define de forma única el tipo de la página personalizada.

    En el ejemplo, se Microsoft el tipo definido. SamplePage.LocationPage. Para la página personalizada, sustituya lo siguiente para evitar posibles conflictos con otras páginas que pueda crear en el futuro:

  • Nombre de la organización en lugar de Microsoft.

  • Nombre del proyecto en lugar de SamplePage.

  • Nombre de página del asistente personalizado en lugar de LocationPage.

Paso 2: El Asistente para UDI carga el archivo DLL para la página asistente personalizada

Cuando el Asistente para UDI carga el archivo DLL, llama a la función RegisterFactories , que debe implementarse en el archivo .dll. En el ejemplo, esta función se implementa en el archivo dllmain.ccp. Cada página del asistente que cree debe implementar la función RegisterFactories .

La función RegisterFactories se usa para registrar la clase de fábrica de la página del asistente con el registro de generador de clases para el Asistente para UDI. Los generadores de clases son clases que pueden crear una instancia de otra clase. La función RegisterFactories crea una nueva instancia de una clase de fábrica y pasa esa clase al registro de generador de clases para el Asistente para UDI, lo que hace que esa clase de generador esté disponible para el asistente. El Asistente para UDI busca una clase de fábrica registrada con un identificador que coincida con el atributo Type del elemento Page de la página del asistente personalizado.

En el ejemplo, el identificador se define como ID_Location en el archivo PageClassIds.h como Microsoft. SamplePage.LocationPage, que coincide con el atributo Type del elemento Page del archivo Config.xml. ID_Location se pasa como parámetro en la función RegisterFactories implementada en el archivo dllmain.ccp.

Puede crear una función mediante la plantilla de función Register_name para simplificar la creación de una nueva instancia de fábrica y registrar la instancia recién creada. El valor de nombre proporcionado mediante la plantilla de función Register debe implementar la interfaz iClassFactory . La clase ClassFactoryImpl controla la mayoría de los detalles para implementar un generador de clases.

También puede usar la función RegisterFactories para registrar tipos de tarea y tipos de validador. Para obtener más información, vea los artículos siguientes:

Nota:

El ejemplo contiene y registra solo la página del asistente personalizada. El ejemplo no incluye tareas personalizadas ni validadores, por lo que no registra ninguna tarea personalizada ni validadores.

Paso 3: El Asistente para UDI muestra la página asistente personalizada

La página del asistente personalizado del ejemplo se define en el archivo LocationPage.cpp. Las páginas del asistente se derivan de clases de plantilla que proporcionan gran parte de la funcionalidad que tiene una página. Todas las páginas del asistente deben derivarse de la clase de plantilla WizardPageImpl, que implementa la interfaz IWizardPage. Cada página del asistente puede implementar otras clases de plantilla opcionales e interfaces correspondientes en función de las necesidades de la página.

La clase de plantilla WizardPageImpl tiene varias interfaces útiles que pueden ayudarle a escribir páginas del asistente personalizadas. Implemente la clase de plantilla WizardPageImpl como clase base para la página del asistente personalizado.

Para obtener una lista de los disponibles:

  • Clases de plantilla para páginas del asistente, consulte Clases auxiliares de página del asistente

  • Interfaces para las clases de plantilla de página del asistente, consulte Interfaces de página del asistente

    La página del asistente personalizado del ejemplo se deriva de la clase de plantilla WizardPageImpl e implementa la interfaz IWizardPage. Además, la página del asistente personalizado implementa la interfaz IFieldCallback . Ambos se implementan en el archivo LocationPage.cpp.

    La página del asistente personalizado de ejemplo invalida los métodos siguientes:

  • OnWindowCreated. El método OnWindowCreated de la página del asistente de ejemplo llama a los métodos siguientes:

    • AddField. Este método relaciona el control de cuadro de IDC_COMBO_LOCATION del recurso IDD_LOCATION_PAGE con el elemento Data denominado Location en el archivo Config.xml.

      Además del método AddField , puede usar los métodos AddRadioGroup y AddToGroup para admitir otros controles y comportamientos.

      Nota:

      Asegúrese de llamar al método AddField, AddRadioGroup o AddToGroup antes de llamar al método InitFields .

    • InitFields. Use este método para inicializar los campos (controles) que ha agregado al formulario. El puntero de la página es un parámetro. En el ejemplo, se pasa este puntero, que hace referencia a la página actual.

      Nota:

      Para admitir el uso de este puntero, debe implementar la interfaz IFieldCallback además de las interfaces que admite la clase de plantilla WizardPageImpl .

      La interfaz IFieldCallback llama al método SetFieldDefault , que se usa para establecer los valores predeterminados de los controles distintos de los controles de cuadro de texto y casilla de verificación. En el ejemplo, el método SetFieldDefault establece el índice inicial del control de cuadro combinado en función del valor predeterminado especificado en el elemento Default del elemento Field del archivo Config.xml.

      El método OnWindowCreated configura el controlador de formulario mediante la interfaz IFormController. Para obtener más información sobre cómo configurar el controlador de formulario, consulte Configuración del formulario.

  • InitLocations. Este método rellena el cuadro combinado de la lista de ubicaciones del archivo Config.xml. El elemento Data y los elementos DataItem secundarios del archivo Confg.xml proporcionan la lista de valores posibles.

  • OnNextClicked. Este método realiza las siguientes tareas:

    • Novedades la variable de secuencia de tareas TSLocation con el valor seleccionado en el cuadro combinado mediante el método SaveFields

    • Agrega información que se mostrará en la página Resumen mediante el método SaveFields

Paso 4: Se hace clic en el botón Siguiente en la página asistente personalizada

Cuando el usuario completa los campos de la página del asistente personalizado, hace clic en Siguiente, que llama al método OnNextClicked . El método OnNextClicked realiza las tareas necesarias antes de pasar a la siguiente página del asistente, como registrar los cambios de configuración realizados en la página del asistente personalizado.

Para la página del asistente personalizado de ejemplo, la invalidación del método OnNextClicked se implementa en el archivo LocationPage.ccp. En el método OnNextClicked de la página del asistente personalizado de ejemplo, se llama a los métodos siguientes:

  1. InitSection. Este método inicializa el encabezado (título de etiqueta) de los datos de resumen que se muestran en la página Resumen . Normalmente, puede establecer este valor mediante la función DisplayName(). Los datos asociados a este título se guardan mediante el método SaveFields .

  2. SaveFields. Este método guarda los valores de campo en las variables de secuencia de tareas y en los datos mostrados en la página Resumen .

Revisión de la solución de Visual Studio SampleEditor

Antes de empezar a crear sus propias páginas de asistente personalizadas y editores de páginas del asistente, realice los pasos siguientes para preparar el entorno de desarrollo de UDI:

Revisión de la arquitectura del diseñador del Asistente para UDI

El Diseñador del Asistente para UDI se desarrolló mediante WPF, Prism y Unity. El Diseñador UDI se usa para editar el archivo de configuración del Asistente para UDI (UDIWizard_Config.xml), que el Asistente para UDI (OSDSetupWizard.exe) lee en tiempo de ejecución. El elemento Pages del archivo de configuración del Asistente para UDI contiene una lista de páginas que tienen un elemento Page independiente para cada página del asistente.

Al editar los valores de configuración de una página del asistente, el Diseñador del Asistente para UDI carga el editor de páginas personalizado que corresponde al tipo de página del asistente. Los editores de páginas del asistente personalizado se desarrollan como controles de usuario de WPF. Las páginas del editor de páginas del asistente personalizado usan el patrón de diseño Modelo-Vista-Modelo de vista (MVVM) para WPF.

El patrón de diseño MVVM ayuda a separar la interfaz de usuario (IU; presentación) de los datos que se presentan. Los datos son una fachada sobre el elemento Page en el archivo de configuración del Asistente para UDI (el archivo Config.xml del ejemplo), al que se accede mediante la propiedad CurrentPage de la interfaz IDataService .

El Diseñador del Asistente para UDI usa DependencyAttribute para obtener acceso a la clase DataService en función del marco de inserción de dependencias en Unity. Para obtener más información sobre el marco de interjección de dependencias en Unity, consulte Inserción de algo de vida en las aplicaciones: introducción al bloque de aplicaciones de Unity.

Revisar los componentes configurables de una página del Asistente para UDI

Al crear la página del asistente personalizado, algunos de los valores de configuración se pueden establecer en el código y no se pueden cambiar después de haber compilado la página. Sin embargo, para otras opciones de configuración, tendrá que permitir que esas opciones de configuración se cambien mediante el Diseñador del Asistente para UDI.

Normalmente, los valores de configuración que desea configurar mediante el Diseñador del Asistente para UDI se guardan en el archivo de configuración del Asistente para UDI (el archivo Config.xml del ejemplo). Sin embargo, también puede crear su propio archivo de configuración independiente, si es necesario. Un ejemplo de uso de un archivo de configuración independiente es el archivo UDIWizard_Config.xml.app, que usan la tarea Detección de aplicaciones y el tipo de página del Asistente para ApplicationPage .

A continuación se muestra una lista de los valores de configuración típicos que puede administrar mediante el Diseñador del Asistente para UDI:

  • Campo. Los campos de uso permiten a los usuarios proporcionar entradas. Los campos aparecen como elementos Field en el archivo de configuración del Asistente para UDI (UDIWizard_Config.xml), que contiene los valores de configuración de cada campo. El editor de páginas del asistente correspondiente debe proporcionar un método para editar los valores de configuración de campo para el campo mediante FieldElementControl.

  • Propiedades. Los establecedores ayudan a crear propiedades para las entidades de la página, como páginas del elemento Page , campos del elemento Field o datos de los elementos Data o DataItem . Las propiedades se configuran en los elementos Setter . Agregue un elemento Setter independiente para cada propiedad que quiera definir. Las propiedades se editan mediante SetterControl y se configuran otros elementos Setter mediante otros controles.

  • Datos. Los datos se usan para almacenar información para su uso en la página del asistente y otros componentes. Puede definir datos para páginas o campos mediante los elementos Data o DataItem . Los datos se pueden definir en una estructura plana o jerárquica mediante el uso adecuado de los elementos Data o DataItem . El Config.xml del ejemplo del SDK muestra cómo crear estructuras de datos planos.

    El editor de páginas del asistente personalizado que cree debe ser capaz de administrar estas opciones de configuración.

Revisar el ejemplo de EditorPage

El ejemplo de EditorPage se usa para configurar los valores de configuración de la página del Asistente para SamplePage en el archivo de configuración del Asistente para UDI. El ejemplo de EditorPage tiene los siguientes componentes principales:

  • Interfaz de usuario para configurar los valores del cuadro combinado Ubicación

  • Interfaz de usuario para agregar o editar una ubicación en la lista de ubicaciones posibles, que se muestran en el cuadro combinado Ubicación

  • Configuración de lectura y guardado en el archivo de configuración del Asistente para UDI

  • Código auxiliar para los demás componentes

    Revise el ejemplo de EditorPage en Visual Studio realizando los pasos siguientes:

  1. Revise cómo se carga e inicializa el editor de páginas del asistente SampleEditor en el Diseñador del Asistente para UDI, tal como se describe en Carga e inicialización del Editor de páginas del Asistente para revisión.

  2. Revise la interfaz de usuario usada para editar el cuadro combinado Ubicación en los archivos LocationPageEditor.xaml y LocationPageEditor.xaml.cs, tal como se describe en Revisar la interfaz de usuario usada para configurar el cuadro combinado Ubicación.

  3. Revise la interfaz de usuario usada para agregar o editar ubicaciones a la lista en los archivos AddEditLocationView.xaml y AddEditLocationView.xaml.cs, tal como se describe en Revisión de la interfaz de usuario usada para modificar la lista de ubicaciones posibles.

  4. Revise el código usado para administrar la información de configuración guardada en el archivo de configuración del Asistente para UDI, tal como se describe en Revisión del código usado para administrar la información de configuración.

Revisión de la carga e inicialización del Editor de páginas del Asistente para revisión

Los editores de páginas del asistente personalizado se cargan según sea necesario en el Diseñador del Asistente para UDI. Los archivos de configuración del Diseñador del Asistente para UDI se cargan cuando se inicia el Diseñador del Asistente para UDI. El Diseñador del Asistente para UDI examina la carpeta install_folder\Bin\Config (donde install_folder es el nombre de la carpeta donde está instalado MDT) en busca de archivos que tengan una extensión de archivo .config.

Durante la configuración del entorno de desarrollo de UDI, copió el archivo SamplePage.dll.confg en la carpeta install_folder\Bin\Config. Al iniciar el Diseñador del Asistente para UDI, se encuentra y carga el archivo SamplePage.dll.confg.

El Diseñador del Asistente para UDI usa los siguientes atributos del elemento Page en el archivo SamplePage.dll.confg para cargar e inicializar el ejemplo editorPage:

  • DesignerAssembly. Este atributo determina el nombre del archivo DLL que se va a cargar. Este archivo DLL debe colocarse en la misma carpeta que el archivo UDIDesigner.exe, que es la carpeta install_folder\Bin (donde install_folder es el nombre de la carpeta en la que está instalado MDT).

  • DesignerType. Este atributo es el nombre de tipo .NET Microsoft de la clase que contiene el control de usuario de WPF.

  • Escriba. Use este atributo para configurar el tipo de página de la página del asistente personalizado, que carga el Asistente para UDI. El Diseñador del Asistente para UDI usa este atributo para buscar el elemento Page adecuado en el archivo de configuración del Asistente para UDI.

  • Dll. Use este atributo para configurar el elemento DLL en el archivo de configuración del Asistente para UDI, que crea el Diseñador del Asistente para UDI.

  • Descripción. Use este atributo para proporcionar información sobre el editor de páginas del asistente. El valor de este atributo se muestra en el cuadro de diálogo Agregar nueva página del Diseñador del Asistente para UDI, que se usa para agregar la página del asistente a la "Biblioteca de páginas".

  • DisplayName. Use este atributo para proporcionar el nombre de la página del asistente personalizado que se muestra en el Diseñador del Asistente para UDI. El valor de este atributo se muestra en el cuadro de diálogo Agregar nueva página del Diseñador del Asistente para UDI, que se usa para agregar la página del asistente a la "Biblioteca de páginas".

    En el ejemplo, se Microsoft el tipo de la página del asistente personalizado SamplePage. SamplePage.LocationPage, que se guarda en el archivo Config.xml. El archivo Config.xml reside en la carpeta local_folder\SDK\SamplePage\SamplePage en (donde local_folder es la carpeta que creó en el equipo de desarrollo anteriormente en el proceso de configuración).

Revise la interfaz de usuario usada para configurar el cuadro combinado ubicación

Cuando se carga e inicializa el editor de páginas del asistente, se carga el editor de páginas del asistente SampleEditor cuando una página con un tipo de Microsoft. SamplePage.LocationPage se edita. La interfaz de usuario del editor de páginas se almacena en el archivo LocationPageEditor.xaml.

Si examinas la interfaz de usuario en la pestaña Diseño y el código de la pestaña XAML , puedes ver la relación entre la interfaz de usuario gráfica y los elementos y atributos en el lenguaje XAML (Extensible Application Markup Language).

Por ejemplo, si revisas el elemento Controls:FieldElementControl en XAML, puedes ver cómo se relaciona con el diseño de la interfaz de usuario correspondiente. Use el elemento Controls:FieldElementControl para definir el control FieldElementControl .

Los parámetros Binding del archivo XAML enlazan los campos del editor de páginas de ejemplo con la información del archivo de configuración del Asistente para UDI. Por ejemplo, el código siguiente vincula el cuadro de texto Valor predeterminado con el elemento Default en el archivo de configuración del Asistente para UDI (Config.xml en el ejemplo):

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

Para obtener más información, consulta Cómo: Hacer que los datos estén disponibles para el enlace en XAML.

Usa el elemento Views:CollectionTControl.ColumnCollectionView en XAML para editar la lista de ubicaciones disponibles en la vista de cuadrícula. Use el control CollectionTControl para mostrar la vista de cuadrícula y enlazar la vista de cuadrícula al elemento Data con el nombre Location en el archivo de configuración de UDI.

Revise la interfaz de usuario usada para modificar la lista de ubicaciones posibles.

La interfaz de usuario para modificar la lista de ubicaciones posibles consta de:

Revisar botones de menú contextual y de cinta de opciones para modificar la lista de ubicaciones

Al hacer clic con el botón derecho en el cuadro de lista que contiene la lista de ubicaciones, se muestra un menú contextual. La cinta de opciones tiene botones correspondientes que le permiten realizar las mismas tareas. El elemento de control Views:CollectionsTControl del archivo LocationPageEditor.xaml define los métodos a los que se llama en función de la acción realizada y las propiedades que establezca de la siguiente manera:

  • SelectedItem. Esta propiedad enlazada a datos se activa cuando el usuario selecciona un elemento de la lista. Esta propiedad está asociada a la propiedad CurrentLocation en el modelo de vista, que se encuentra en el archivo LocationPageEditorViewModel.cs y que usa el control CollectionTControl para pasar el elemento seleccionado al editar o quitar un elemento existente.

  • AddItemAction. Esta acción se realiza cuando el usuario hace clic en la opción Agregar elemento desde el menú contextual o los botones correspondientes de la cinta de opciones. Hay un enlace de datos a una propiedad en el modelo de vista que devuelve el objeto AddLocationAction . Este objeto es el método AddLocationCallback , ubicado en el archivo LocationPageEditorViewModel.cs, y muestra el cuadro de diálogo en el archivo AddEditLocationView.xaml.

  • EditItemAction. Esta acción se realiza cuando el usuario hace clic en la opción Editar elemento del menú contextual. Hay un enlace de datos a una propiedad en el modelo de vista que devuelve el objeto EditLocationAction . Este objeto es el método EditLocationCallback , ubicado en el archivo LocationPageEditorViewModel.cs, y muestra el cuadro de diálogo en el archivo AddEditLocationView.xaml.

  • RemoveAction. Esta acción se realiza cuando el usuario hace clic en la opción Quitar elemento del menú contextual. Hay un enlace de datos a una propiedad en el modelo de vista que devuelve el objeto RemoveAction . Este objeto es el método EditLocationCallback , ubicado en el archivo LocationPageEditorViewModel.cs, y muestra un mensaje que confirma la eliminación de la ubicación.

Revise el cuadro de diálogo para agregar o editar ubicaciones

Si agrega una nueva ubicación a la lista de ubicaciones o edita una ubicación existente, se muestra un mensaje que se encuentra en el archivo AddEditLocationView.xaml. El mensaje se muestra mediante el método de ventana ShowDialogWindow en el archivo LocationPageEditorViewModel.cs.

La interfaz de usuario del archivo AddEditLocationView.xaml consta de:

  • Marco de diálogo denominado DialogFrame, que incluye los siguientes elementos:

    • Título que se configura mediante el atributo DialogTitle del marco de diálogo

    • Un botón Aceptar , que establece el estado devuelto como para la propiedad Approved en True (el estado devuelto se comprueba en el método AddLocationCallback del archivo LocationPageEditorViewModel.cs para determinar si el usuario ha hecho clic en Aceptar).

    • Un botón Cancelar , que establece el estado de devolución como para la propiedad Approved en False (el estado devuelto está activado en el método AddLocationCallback del archivo LocationPageEditorViewModel.cs para determinar si el usuario ha hecho clic en Cancelar).

  • Elemento WPF que contiene:

    • Etiqueta que se configura mediante el atributo Content

    • Un cuadro de texto, que está enlazado al elemento Data con el nombre Location en el archivo de configuración de UDI (el archivo Config.xml en el ejemplo)

Revisar el código usado para administrar la información de configuración

La información de configuración de la página del asistente personalizado se almacena en el archivo de configuración del Asistente para UDI, que es:

  • Config.xml archivo en el ejemplo proporcionado con el SDK de UDI (este archivo contiene solo los valores de configuración del ejemplo).

  • UDIWizard_Config.xml archivo proporcionado con MDT, almacenado en la carpeta installation_folder\Templates\Distribution\Scripts (donde installation_folder es la carpeta en la que instaló MDT); este archivo contiene los valores de configuración de todas las páginas y fases del asistente integrados.

    En el ejemplo SampleEditor, la rutina Locations ayuda a administrar la información de configuración y se encuentra en el archivo LocationPageEditorViewModel.cs. La rutina Locations devuelve una lista de las ubicaciones del archivo de configuración del Asistente para UDI. En concreto, la lista devuelta contiene un elemento para cada elemento DataItem en el archivo de configuración del Asistente para UDI.

Crear páginas del Asistente para UDI personalizadas

El proceso de alto nivel para crear páginas personalizadas del asistente de UDI es el siguiente:

  1. Realice una copia de la solución SamplePage como punto de partida.

  2. Coloque los controles deseados (campos) en el formulario.

  3. Escriba código para realizar las tareas adecuadas cuando se cargue la página del asistente (invalidaciones para el método OnWindowCreated ), incluidos los pasos siguientes:

    1. Inicialice el formulario.

    2. Lee las variables de memoria, las variables de secuencia de tareas, las variables de entorno o la información de archivo XML (como las propiedades de Establecedor ).

  4. Escriba cualquier código para realizar las tareas adecuadas cuando se muestre la página (invalidaciones para el método OnWindowShown ), incluidos los pasos siguientes:

    1. Habilite o deshabilite los controles en función de la información leída cuando la página se cargó en el paso 3.

    2. Actualice los controles en función de la información leída cuando se cargue la página en el paso 3, como el rellenado de controles en función de la información leída.

  5. Escriba cualquier código para realizar las tareas adecuadas mientras el usuario interactúa con la página del asistente.

  6. Escriba cualquier código para realizar las tareas adecuadas cuando el usuario haga clic en Siguiente en el Asistente para UDI (invalidaciones para el método OnNextClicked ), incluidos los pasos siguientes:

    1. Actualice las variables de memoria, las variables de secuencia de tareas, las variables de entorno o la información de archivo XML.

    2. Actualice la información de la página de resumen (si no la realizan los campos de la página).

  7. Compile la solución.

    Asegúrese de que la versión del archivo DLL que cree sea la misma plataforma de procesador que la instalación de MDT, en concreto, la plataforma de procesador para el entorno de preinstalación de Windows (Windows PE). El Asistente para UDI puede ejecutarse en:

    • Sistema operativo existente en el equipo de destino. Puede ejecutar versiones de 32 bits de la página del asistente en sistemas operativos Windows de 32 o 64 bits. Sin embargo, solo puede ejecutar versiones de 64 bits de la página del asistente en sistemas operativos Windows de 64 bits.

    • Windows PE en el equipo de destino. Windows PE no admite la ejecución de aplicaciones de 32 bits en una versión de 64 bits de Windows PE. Por lo tanto, debe haber creado una versión para la página del asistente para cada arquitectura de procesador de Windows PE que planee usar.

  8. Copie el archivo DLL de la página del asistente personalizado en installation_folder\Templates\Distribution\Tools\ platform (donde installation_folder es la carpeta en la que instaló MDT y la plataforma es x86 para la versión de 32 bits o x64 es para la versión de 64 bits).

  9. Complete los pasos para crear el editor de páginas personalizado.

Creación de editores de páginas del Asistente para personalizar

El proceso de alto nivel para crear editores de páginas personalizados del asistente para UDI es el siguiente:

  1. Realice una copia de la solución SampleEditor como punto de partida.

  2. Cree la interfaz de usuario del editor de páginas principal en un archivo .xaml.

  3. Agregue instancias del control FieldElementControl según sea necesario en la página del asistente que se va a configurar (si es necesario).

  4. Agregue instancias del control SetterControl según sea necesario en la página del asistente que se va a configurar (si es necesario).

  5. Agregue instancias del control CollectionTControl según sea necesario en la página del asistente que se va a configurar (si es necesario).

  6. Agregue la interfaz IDataService .

  7. Escriba el código adecuado para actualizar el archivo de configuración del Asistente para UDI en función de los valores de configuración que se van a configurar mediante el editor de páginas del asistente personalizado.

  8. Cree cuadros de diálogo secundarios en un archivo .xaml y llámelos desde el editor de páginas principal mediante la interfaz IMessageBoxService según sea necesario en la página del asistente que se va a configurar.

  9. Agregue las interfaces adecuadas a la cinta de opciones del Diseñador del Asistente para UDI en función de los requisitos de la página del asistente que se va a configurar.

  10. Compile la solución.

    Nota:

    Asegúrese de que la versión del archivo DLL que cree sea la misma plataforma de procesador que la instalación de MDT. Por ejemplo, si instala la versión de 64 bits de MDT, cree una versión de 64 bits del editor de páginas personalizado.

  11. Cree un archivo de configuración del Diseñador del Asistente para UDI para cargar los archivos DLL necesarios y asignar el editor de páginas del asistente con la página del asistente correspondiente (el archivo SamplePage.dll.config del ejemplo).

    Para obtener más información sobre los elementos necesarios para realizar la asignación entre la página del asistente y el editor de páginas del asistente, vea el elemento DesignerMappings , los elementos secundarios y los atributos correspondientes.

  12. Copie el archivo de configuración del Diseñador del Asistente para UDI que creó en el paso anterior en la carpeta installation_folder\Bin\Config (donde installation_folder es la carpeta en la que instaló la versión de MDT).

  13. Copie el archivo DLL del editor de páginas del asistente personalizado en la carpeta installation_folder\Bin (donde installation_folder es la carpeta en la que instaló MDT).

Creación de tareas UDI personalizadas

Las tareas de UDI son archivos DLL escritos en C++ que implementan la interfaz ITask. Para registrar el archivo DLL en la biblioteca de tareas del Diseñador del Asistente para UDI, cree un archivo de configuración del Diseñador del Asistente para UDI (archivo .config) y lo coloque en la carpeta installation_folder\Bin\Config (donde installation_folder es la carpeta en la que instaló MDT).

Nota:

Puede crear un archivo DLL que contenga páginas del asistente, tareas y validadores dentro del mismo archivo .dll. También puede crear un único archivo de configuración del Diseñador del Asistente para UDI (.config) que contenga los valores de configuración de las páginas, tareas y validadores del asistente en el archivo DLL.

Para crear tareas UDI personalizadas

  1. Escriba código que implemente la interfaz ITask y los métodos siguientes:

    • Init. Se llama a este método para inicializar la tarea.

    • Ejecutar. Se llama a este método para ejecutar la tarea.

  2. Escriba código que registre el generador de clases de tareas personalizado con el registro de fábrica.

  3. Compile la solución para la tarea personalizada.

    Nota:

    Asegúrese de que la versión del archivo DLL que cree sea la misma plataforma de procesador que la instalación de MDT. Por ejemplo, si instala la versión de 64 bits de MDT, cree una versión de 64 bits de la tarea UDI personalizada.

  4. Cree un elemento Task en el elemento TaskLibrary en el archivo de configuración del Diseñador del Asistente para UDI similar al siguiente extracto:

    <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>  
    

    Nota:

    Todos los elementos Task deben incluir el parámetro BitmapFilename . Especifique todos los demás parámetros como requiere la tarea. Por ejemplo, en el extracto anterior, el parámetro log se usa para especificar un parámetro para la ubicación de un archivo de registro.

  5. Copie el archivo de configuración del Diseñador del Asistente para UDI creado en el paso anterior en la carpeta installation_folder\Bin\Config (donde installation_folder es la carpeta en la que instaló MDT).

  6. Copie el archivo DLL de la tarea personalizada en la carpeta de plataforma installation_folder\Templates\Distribution\Tools\ (donde installation_folder es la carpeta en la que instaló MDT y la plataforma es x86 para la versión de 32 bits o x64 es para la versión de 64 bits).

Creación de validadores UDI personalizados

Los validadores UDI son archivos DLL escritos en C++ que implementan la interfaz IValidator. Para registrar el archivo DLL con la biblioteca de validadores del Diseñador del Asistente para UDI, cree un archivo de configuración del Diseñador del Asistente para UDI (.config archivo) y lo coloque en la carpeta installation_folder\Bin\Config (donde installation_folder es la carpeta en la que instaló MDT).

Para crear validadores UDI personalizados

  1. Escriba código que cree una subclase de la clase BaseValidator e implemente los métodos siguientes:

    • Init(IControl *pControl, IWizardPageContainer *pContainer, IStringProperties *pProperties). El controlador de formulario llama al miembro Init para inicializar el validador. Este método debe llamar al método Init para la clase BaseValidator . Normalmente lee las propiedades establecidas para el validador desde el archivo de configuración del Asistente para UDI. Por ejemplo, el validador InvalidCharactersValidator recupera el valor de la propiedad InvalidChars mediante este método.

    • IsValid. El controlador de formulario llama a este método para ver si el control contiene texto válido. A continuación se muestra un ejemplo del método IsValid para un validador que valida que el campo no está vacío:

      BOOL IsValid(LPBSTR pMessage)  
      {  
          __super::IsValid(pMessage);  
      
          _bstr_t text;  
          m_pText->GetText(text.GetAddress());  
          return (text.length() > 0);  
      }  
      
    • Init(IControl *pControl, LPCTSTR message). El controlador de formulario llama a este miembro para cada pulsación de tecla y otros eventos para que el validador pueda validar el contenido del control y los mensajes actualizados en la parte inferior de la página del asistente (o borrarlos).

      Normalmente, estos son los únicos métodos que necesita invalidar. Sin embargo, en función del validador, es posible que tenga que invalidar otros métodos en la subclase de la clase BaseValidator que cree. Para obtener más información sobre estos otros métodos, vea la clase BaseValidator .

  2. Escriba código que registre la clase de tarea personalizada con la factoría del Registro.

  3. Compile la solución para la tarea personalizada.

    Nota:

    Asegúrese de que la versión del archivo DLL que cree sea la misma plataforma de procesador que la instalación de MDT. Por ejemplo, si instala la versión de 64 bits de MDT, cree una versión de 64 bits de la tarea UDI personalizada.

  4. Cree un elemento Validator en el elemento ValidatorLibrary en el archivo de configuración del Diseñador del Asistente para UDI similar al siguiente extracto:

    <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>  
    

    Advertencia

    Todos los elementos Validator deben incluir el parámetro Message . Especifique todos los demás parámetros según sea necesario para el validador. Por ejemplo, en el extracto anterior, el parámetro NamedPattern se usa para especificar un parámetro para el nombre de un patrón de expresión regular predefinido.

  5. Copie el archivo de configuración del Diseñador del Asistente para UDI creado en el paso anterior en la carpeta installation_folder\Bin\Config (donde installation_folder es la carpeta en la que instaló MDT).

  6. Copie el archivo DLL de la tarea personalizada en la carpeta de plataforma installation_folder\Templates\Distribution\Tools\ (donde installation_folder es la carpeta en la que instaló MDT y la plataforma es x86 para la versión de 32 bits o x64 es para la versión de 64 bits).

Referencia del Asistente para UDI

Componentes de página del asistente

Puede usar cualquiera de los varios componentes precompilados para compilar las páginas personalizadas.

Creación de instancias de componente

El Asistente para UDI usa generadores de clases para crear nuevas instancias de objetos automáticamente. Estas fábricas se registran con un registro de fábrica, utilizando una cadena como clave para el generador. Por ejemplo, el componente WmiRepository se identifica mediante la cadena "Microsoft. Wizard.WmiRepository", que está disponible en el archivo de encabezado IWmiRepository como ID_WmiRepository.

Suponiendo que ha escrito la página como una subclase de WizardPageImpl, puede crear una nueva instancia de wmiRepoistory como esta:

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

La función CreateInstance es una función de plantilla segura para crear nuevas instancias de componentes. PWmiRepository es un puntero inteligente, por lo que controla el recuento de referencias automáticamente.

Componentes creables

Hay un conjunto de componentes que puede registrar con el Registro. El primer conjunto de componentes siempre está registrado, ya que el archivo ejecutable del Asistente para UDI principal lo proporciona. Los otros dos conjuntos de componentes se proporcionan en archivos DLL "opcionales". Para que estos componentes estén disponibles, el archivo DLL debe aparecer en la sección DLL del archivo XML de .config. El código no necesita saber qué ejecutable contiene un componente específico.

La lista de identificadores de componente para componentes (el nombre del componente es el mismo que el identificador pero sin el ID_ inicial) registrado con el registro de fábrica (definido en OSDSetupWizard) se muestra en la tabla 3.

Tabla 3. Identificadores de componente

ID Descripción
ID_ACPowerTask (ITask, IWizardComponent) Una tarea preparatoria que garantiza que el equipo no se está ejecutando solo con la batería
ID_AppDiscoveryTask (ITask, IWizardComponent) Una tarea especializada para detectar qué elementos de software ha instalado en el equipo
ID_BackgroundTask (IBackgroundTask, IWizardComponent) Se puede usar para ejecutar una tarea en otro subproceso
ID_CopyFilesTask (ITask, IWizardComponent) Una tarea para copiar uno o varios archivos
ID_FormController (IFormController) Le gustará no tener que crear una instancia usted mismo, ya que la página recibe su propia instancia
ID_InvalidCharactersValidator (IValidator) Garantiza que ningún campo de texto contenga caracteres de una lista proporcionada al validador.
ID_Logger (ILogger) Le gustará no tener que crear una instancia usted mismo, ya que la página recibe un puntero a la instancia compartida.
ID_NonEmptyValidator (IValidator) Validador que garantiza que ningún campo está vacío
ID_PasswordValidator (IValidator) Validador que garantiza que no haya dos campos de texto con el mismo contenido
ID_Regex (IRegEx) Evalúa las expresiones regulares y busca coincidencias
ID_RegExValidator (IValidator) Validador que se valida con una expresión regular o un patrón conocido
ID_SimpleStringProperties (IStringProperties, ISimpleStringProperties) Proporciona una manera sencilla de enviar propiedades a tareas sin usar XML
ID_ShellExecuteTask (ITask, IWizardComponent) Ejecución de un programa externo
ID_SummaryBag (ISummaryBag) Disponible indirectamente desde la página a través del método Form
ID_TaskManager (ITaskManager, IBackgroundCallback, IWizardComponent) Administra la ejecución de un conjunto de tareas y la interfaz de usuario
ID_WmiRepository (IWmiRepository, IWizardComponent) Permite ejecutar consultas de Instrumental de administración de Windows (WMI)
ID_IXmlDocument (IXmlDocument) Proporciona una fachada para leer y escribir documentos XML

Los OSDRefreshWizard.dll definidos, las páginas compartidas y otros componentes de control se muestran en las tablas 4 y 5.

Tabla 4. Controles de directorio

ID Descripción
ID_Directory (IDirectory) Fachada para obtener información de directorio del sistema de archivos

Tabla 5. SharedPages.dll definidas

ID Descripción
ID_ADHelper (IADHelper) Proporciona una fachada para un conjunto limitado de características en Active Directory® Domain Services (AD DS)
ID_CpuInfo (ICpuInfo) Determina si la CPU es de 32 o 64 bits.
ID_DomainJoinValidator (IDomainJoinValidator) Tiene algunos métodos para comprobar si un conjunto de credenciales puede unirse a un dominio
ID_DriveList (IDriveList, IBindableList, IWizardComponent) Usa WMI para obtener una lista de unidades en el equipo
ID_WiredNetworkTask (ITask) Tareas que comprueban si está conectado a la red con un adaptador de red cableado de forma rígida (en lugar de inalámbrico)

Componentes de control

Interactúe con los controles de la página a través de la función de plantilla GetControlWrapper , que proporciona acceso a uno de los tipos de componentes enumerados en la tabla 6.

Tabla 6. Componentes

Tipos de control de cuadro de diálogo Descripción
CONTROL_CHECK_BOX (ICheckBox) Fachada para trabajar con controles de casilla
CONTROL_COMBO_BOX (IComboBox) Fachada para controles de cuadro combinado
CONTROL_GENERIC (IControl) Permite trabajar con la mayoría de los tipos de controles para controlar el estado de habilitación y visible
CONTROL_LIST_VIEW (IListView) Fachada que proporciona acceso a las características de un control de vista de lista
CONTROL_PROGRESS_BAR (IProgressBar) Fachada para trabajar con la posición de un control de barra de progreso
CONTROL_RADIO_BUTTON (IRadioButton) Fachada para trabajar con controles de botón de radio
CONTROL_STATIC_TEXT (IStaticText) Fachada que proporciona permiso de lectura y escritura al texto de un control, como una etiqueta o un cuadro de texto.
CONTROL_TREE_VIEW (ItreeView) Fachada para trabajar con un control de vista de árbol

Componente de lista de imágenes

Este componente es una fachada para un control ImageList en la página. Cree una lista de imágenes a través de la interfaz IListView o ITreeView .

Componente FormController

El asistente crea este componente automáticamente y lo pasa a la página. Puede acceder a ella desde la página mediante el método Form , que implementa la clase base WizardPageImpl .

Componente InvalidCharacterValidator

Este es un tipo de validador que puede incluir en una página. El identificador se ID_InvalidCharactersValidator (definido en IValidator.h), que tiene un valor de texto de "Microsoft. Wizard.Validation.InvalidChars."

Este validador busca una sola propiedad (un elemento Setter en el archivo .config) denominada InvalidChars, que es una lista de caracteres que no se permiten. Comprueba los caracteres de un cuadro de texto; si el texto contiene caracteres de esta lista, el componente notifica un error.

Componente NonEmptyValidator

Este es un tipo de validador que puede incluir en una página. El identificador se ID_NonEmptyValidator (definido en IValidator.h), que tiene un valor de texto "Microsoft. Wizard.Validation.NonEmpty."

Este validador notifica un error si el cuadro de texto (o cualquier otro control que admita IStaticText) tiene un valor de cadena vacío.

Componente PasswordValidator

Este es un tipo de validador que puede incluir en una página. El identificador se ID_PasswordValidator (definido en IValidator.h), que tiene un valor de texto de "Microsoft. Wizard.Validation.Password."

Este validador funciona con dos controles de texto diferentes (controles que admiten IStaticText) y notifica un error si no contienen los mismos valores. En otras palabras, se produce un error si los cuadros de texto Contraseña y Confirmar contraseña no coinciden.

Dado que este validador requiere dos controles, necesita más configuración que otros validadores. La configuración podría tener un aspecto similar al siguiente:

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);  

En primer lugar, defina el control Confirmar contraseña como un "elemento secundario" del control Contraseña . De este modo, si el controlador de formulario deshabilita el control Contraseña , también deshabilitará el control Confirmar contraseña . A continuación, agregue un validador de contraseña al formulario. Por último, proporcione el validador de contraseñas con la interfaz al control Confirmar contraseña .

Debido al requisito de dos controles, debe usar código para configurar este validador en lugar del archivo XML de .config.

Componente RegExValidator

Este es un tipo de validador que puede incluir en una página. El identificador se ID_RegExValidator (definido en IValidator.h), que tiene un valor de texto "Microsoft. Wizard.Validation.RegEx."

Este validador compara el contenido de un control de texto (que admite IStaticText) con una expresión regular y produce un error si el texto no coincide con la expresión regular.

Como alternativa, puede usar este validador con un patrón con nombre predefinido. Para usar una expresión regular, el XML debe contener una propiedad establecedora denominada Pattern. Si quiere usar un patrón con nombre en su lugar, use un establecedor denominado NamedPattern establecido en uno de los valores de la tabla 7.

Tabla 7. Establecedores de patrones con nombre

Pattern Descripción
Nombre de usuario Comprueba que el texto es del formulario dominio\usuario o user@domain
Nombredeequipo El nombre debe tener entre 1 y 15 caracteres y no puede incluir un conjunto de caracteres (como : y ?)
Workgroup El nombre debe tener entre 1 y 15 caracteres y no puede contener un conjunto de caracteres (como =, +, y ?)

Componente FactoryRegistry

Este componente realiza un seguimiento de todas las factorías y servicios de clase. Implementa la interfaz IFactoryRegistry y está disponible indirectamente a través del método Container de la página. Además, el Registro carga archivos DLL de extensión. Después de cargar un archivo DLL, el registro busca una función exportada denominada RegisterFactories. Debe implementar esta función y, en ella, registrar los generadores de clases para las páginas, tareas y validadores (y cualquier otro generador de clases que quiera registrar). Este es un ejemplo del proyecto de ejemplo:

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

Componente de registrador

Este componente está disponible para la página a través del método Logger (implementado por WizardPageImpl). Use este método para escribir entradas en el archivo de registro. El contenido del archivo de registro es útil para diagnosticar problemas que los usuarios podrían tener al ejecutar el Asistente para UDI.

Componente PropertyBag

El contenedor de propiedades es un contenedor para variables de memoria. Está disponible en la página mediante Container()->Properties(). Las variables de memoria son útiles para pasar datos temporales entre diferentes páginas.

Componentes TSVariableBag y TSRepository

El componente TSVariableBag permite leer y escribir variables de secuencia de tareas. Mantiene los valores en memoria hasta que el usuario hace clic en Finalizar (de forma predeterminada). Puede acceder al contenedor TSVariable a través del método TSVariables de la página (implementado por la clase base WizardPageImpl ). Estos componentes registran todas las lecturas y escrituras de variables de secuencia de tareas.

Componente WmiRepository

Este componente proporciona una fachada para trabajar con consultas WMI. Puede llamar a la función auxiliar CreateInstance con ID_WmiRepository para obtener una instancia de este componente, que admite la interfaz IWmiRepository . Este componente devuelve registros de resultados a través de la interfaz IWmiIterator .

Clases auxiliares de página del asistente

Puede crear páginas del asistente de UDI personalizadas mediante clases auxiliares integradas proporcionadas con el SDK de UDI. En la tabla 8 se enumeran las clases auxiliares que puede usar para crear páginas del asistente personalizadas.

Tabla 8. Clases auxiliares

Clase auxiliar Descripción
Clase ClassFactoryImpl Se trata de una clase base útil para crear un generador de clases que, a continuación, se puede registrar con el Registro de fábrica.
Clase de plantilla de interfaz Use esta clase de plantilla cuando desee crear un componente que implemente más de una interfaz.
Clase auxiliar de ruta de acceso Esta clase proporciona operaciones comunes de archivos o directorios.
Clase de plantilla de puntero Esta clase proporciona recuento de referencias para la administración de la duración en componentes COM. Es importante liberar interfaces cuando haya terminado con ellas. Esta clase de plantilla controla la duración automáticamente.
Clase PUnknown Esta clase es un puntero inteligente específicamente para la interfaz IUnknown. Para todas las demás interfaces, use la clase de plantilla Pointer.
StringUtil (clase auxiliar) Esta clase proporciona métodos auxiliares que facilitan el trabajo con cadenas.
SubInterface Template (clase) Esta clase base facilita la implementación de un componente que admite una interfaz que se hereda de otra interfaz.
Clase de plantilla UnknownImpl Esta clase controla la mayoría de los detalles de la creación de un componente COM.
WizardComponent (clase de plantilla) Esta clase base se usa para crear componentes que necesitan acceso a los servicios del asistente, como la creación y el registro de componentes.
WizardPageImpl (clase de plantilla) Esta clase base debe usarse como clase base para todas las páginas del asistente personalizadas.

Clase ClassFactoryImpl

Se trata de una clase base útil para crear un generador de clases que, a continuación, se puede registrar con el Registro de fábrica.

A continuación se muestra un extracto del archivo LocationPage.h del proyecto de ejemplo para definir la clase ClassFactoryImpl .

#pragma once  

#include "ClassFactoryImpl.h"  

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

A continuación se muestra un extracto del archivo LocationPage.cpp de la página del asistente de ejemplo que se usa para definir el generador de clases de la página.

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

Clase de plantilla de interfaz

Use esta clase de plantilla cuando desee compilar un componente que implemente más de una interfaz, por ejemplo:

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

Este código crea una cadena de clases base que admite IFieldCalback y las interfaces que admite WizardPageImpl (que resulta ser IWizardPage).

Clase auxiliar de ruta de acceso

Esta clase proporciona operaciones comunes de archivos o directorios:

static inline std::wstring GetModulePath(HINSTANCE hModule)  

También devuelve la ruta de acceso completa al archivo .exe o .dll con el identificador de instancia que se proporciona a este método:

static inline std::wstring GetModuleFilename(HINSTANCE hModule)  

La clase devuelve la ruta de acceso completa y el nombre de archivo del archivo .exe y .dll con el identificador de instancia que se proporciona a este método:

static inline std::wstring GetDirectoryName(LPCWSTR fullName)  

. . . o simplemente la ruta de acceso al quitar el nombre de archivo:

static inline std::wstring GetFileName(LPCWSTR fullName)  

Dada una ruta de acceso con un nombre de archivo, la clase auxiliar de ruta de acceso devuelve solo el nombre de archivo:

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

Por último, la clase devuelve una nueva cadena que es la ruta de acceso combinada y el nombre de archivo (u otra ruta de acceso).

Clase de plantilla de puntero

Esta clase se define en Pointer.h. Dado que los componentes COM usan el recuento de referencias para la administración de la duración, es importante que siempre libere interfaces cuando haya terminado con ellas. Microsoft proporciona una clase de plantilla que controla la duración automáticamente. Por ejemplo, si quiere un puntero inteligente para una interfaz XML, puede escribir algo parecido a esto:

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

La primera línea define el puntero inteligente. En la segunda línea se muestra cómo recuperar un puntero inteligente a través de otra llamada. El & operador siempre libera una interfaz existente si contiene una y devuelve la dirección del puntero interno. Una vez que haya recuperado un puntero como este, la instancia de Pointer llama a Release cuando la variable sale del ámbito. Microsoft recomienda usar punteros inteligentes en lugar de llamar manualmente a AddRef y Release.

Además, la clase de puntero inteligente Pointer llama a QueryInterface para recuperar otras interfaces. Por ejemplo, cuando el Registro de fábrica crea una nueva instancia de un componente, tiene código similar al siguiente:

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

La primera línea llama a QueryInterface en segundo plano para solicitar la interfaz IWizardComponent . El puntero inteligente resultante será igual a nullptr si el componente no admite esa interfaz.

Clase PUnknown

Esta clase es un puntero inteligente específicamente para la interfaz IUnknown . Para todas las demás interfaces, use la clase de plantilla Pointer .

StringUtil (clase auxiliar)

Esta clase se define en Utilities.h y proporciona métodos auxiliares que facilitan el trabajo con cadenas:

static inline int CompareIgnore(LPCWSTR first, LPCWSTR second)  

Este método compara dos cadenas al omitir mayúsculas y minúsculas (vea la tabla 9).

Tabla 9. StringUtil (clase auxiliar)

Devuelve Descripción
0 Las cadenas coinciden, ignorando mayúsculas y minúsculas
<0 Primer < segundo
>0 Primer > segundo

A continuación le mostramos un ejemplo:

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

Estos métodos son un poco similares a los métodos de formato de .NET Microsoft en el sentido de que los parámetros están en forma de {0}. Sin embargo, no realizan ningún formato de la entrada, solo sustitución:

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)  

Se trata de contenedores alrededor de StringCchPrintf que devuelven un wstring , por lo que no es necesario asignar memoria para cadenas o búferes.

SubInterface Template (clase)

Esta clase base facilita la implementación de un componente que admite una interfaz que se hereda de otra interfaz. Por ejemplo, la interfaz ICheckBox hereda de IControl. Esta es la forma en que se usa esta clase para definir CheckBoxWrapper:

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

La interfaz base es el primer parámetro, mientras que la interfaz derivada es el segundo parámetro.

Clase de plantilla UnknownImpl

Esta clase se define en UnknownImpl.h y controla la mayoría de los detalles de la creación de un componente COM. Este es un ejemplo de cómo usaría esta clase base:

classDirectory :public UnknownImpl<IDirectory>  

Este código define una clase que admite la interfaz IDirectory .

WizardComponent (clase de plantilla)

Esta clase se define en IWizardComponent.h y es una clase base útil para crear componentes que necesitan acceso a los servicios del asistente, como la creación y el registro de componentes.

Por ejemplo, aquí se muestra cómo se define el componente CopyFilesTask :

classCopyFilesTask :public WizardComponent<ITask>  
{  
    ...  

El parámetro de esta clase de plantilla es la interfaz "principal" que desea usar para el componente, que en el caso de las tareas es ITask. El uso de WizardComponent significa que el componente admite tanto la interfaz que proporciona (ITask en este ejemplo) como IWizardComponent.

Siempre que use el Registro de generador de clases para crear un nuevo componente, el Registro llama al método IWizardComponent-SetContainer> del componente para proporcionar acceso al componente a los servicios del asistente.

WizardPageImpl (clase de plantilla)

Use esta clase como clase base para las páginas personalizadas, por ejemplo:

class LocationPage :public WizardPageImpl<IDD_LOCATION_PAGE>  

El parámetro es el identificador de recurso de la plantilla de cuadro de diálogo.

Interfaces de página del asistente

El Asistente para UDI usa interfaces para acceder a los distintos controles de la página. Dentro de la página, se usa la función GetControlWrapper para recuperar un contenedor de controles. A continuación le mostramos un ejemplo:

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

Aquí, PStaticText es un puntero inteligente a la interfaz IStaticText . Los punteros inteligentes llaman automáticamente al método COM Release() cuando salen del ámbito o se pasa la dirección de una variable (como &pFormat) a un método.

IADHelper (interfaz)

__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)

Inicialice este componente, pasándolo al registrador para que pueda registrar información.

HRESULTValidLogon(LPCTSTR userName, contraseña LPCTSTR, dominio LPCTSTR)

Este método comprueba si un conjunto de credenciales es válido, como se muestra en la tabla 10.

Tabla 10. HResultValidLogon

Hresult Descripción
S_OK Las credenciales son válidas
S_FALSE Las credenciales no son válidas
E_FAIL No se pudo encontrar el controlador de dominio; comprobar los registros para obtener más información
HRESULT HasAccess(nombre de usuario LPCTSTR, contraseña LPCTSTR, dominio LPCTSTR, nombredeEquipo LPCTSTR, cuenta LPCTSTRDomain)

Este método comprueba si un conjunto de credenciales tiene acceso de lectura y escritura al objeto de equipo de AD DS, como se muestra en la tabla 11.

Tabla 11. HResult HasAccess

[HRESULT] Description
S_OK El usuario tiene acceso
E_FAIL El usuario no tiene acceso. Compruebe el archivo de registro para obtener información adicional.

IBackgroundTask (interfaz)

__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);  
};  
Información general

La página Progreso usa esta clase para ejecutar tareas en un subproceso independiente. También puede usar esta clase siempre que desee realizar operaciones en un subproceso independiente. Las tareas son cualquier clase que admita la interfaz ITask .

Esta interfaz la implementa el ID_BackgroundTask ("Microsoft. Wizard.BackgroundTask") definido en la interfaz IBackgroundTask.h.

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

Esta interfaz inicializa el componente, como se muestra en la tabla 12.

Tabla 12. HRESULT Init

Parámetro Descripción
pTask Puntero a la clase que contiene el código que desea ejecutar en otro subproceso
Id Número que puede usar en el método Finished de la devolución de llamada para indicar qué tarea ha terminado de ejecutarse; útil si inicia varias tareas con el mismo método de devolución de llamada
pCallback Clase que implementa el método Finished , al que se llama cada vez que una tarea termina de ejecutarse; la llamada al método Finished estará en el subproceso en segundo plano, no en el subproceso de interfaz de usuario.
void Start(void)

Este método inicia la tarea en un subproceso en segundo plano y devuelve los elementos que se muestran en la tabla 13.

Tabla 13. Devolver subproceso en segundo plano

Devuelve Descripción
E_INVALIDARG La tarea ya está en ejecución, por lo que no puede iniciarla ahora mismo.
E_FAIL Se produjo un problema al iniciar el subproceso.
S_OK Se inició el subproceso.
BOOL Running()

Este método devuelve TRUE si la tarea en segundo plano se está ejecutando actualmente y FALSE si no se está ejecutando.

HRESULT Wait(DWORD waitMilliseconds)

Este método espera hasta que el subproceso deja de ejecutarse o ha transcurrido el número de milisegundos.

HRESULT Terminate(DWORD exitCode)

Este método elimina el subproceso que se está ejecutando (vea la tabla 14 y la tabla 15). Este proceso puede tardar un breve período de tiempo en finalizar una vez devuelto este método.

Tabla 14. HRESULT Termina el código de salida

Parámetro Descripción
exitCode Código de salida que se enviará al método de devolución de llamada Finished, que también estará disponible desde el método GetExitCode .

Tabla 15. Códigos de terminación

Devuelve Descripción
E_FAIL Error en la llamada a finalizar.
S_OK La solicitud para finalizar el subproceso se realizó correctamente.
HRESULT GetExitCode(LPDWORD pCode, HRESULT *pHresult)

Use este método para obtener los resultados de la ejecución de la tarea en el subproceso en segundo plano (consulte la tabla 16).

Tabla 16. Códigos de resultado

Parámetro Descripción
pCode Puntero a un DWORD que se establecerá en return o nullptr si no necesita el valor devuelto. Al salir, este parámetro se establece en STILL_ACTIVE si el subproceso se está ejecutando, el código devuelto por el método Execute de la tarea o el valor pasado al método Terminate si llamó a ese método.
pHresult Puntero a un HRESULT que se establecerá en return o nullptr si no necesita el valor HRESULT .
HRESULT Close(void)

Este método libera el subproceso en segundo plano. Devuelve E_INVALIDARG si el subproceso se está ejecutando actualmente y S_OK en caso contrario.

ICheckBox (interfaz)

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

Establezca el estado activado de la casilla. Cuando el método es TRUE, se activa la casilla; cuando el método es FALSE, se desactiva la casilla.

BOOL IsButtonChecked()

Este método notifica el estado de comprobación actual de una casilla.

IComboBox (interfaz)

__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();  
};  
Información general

El componente CheckBoxWrapper implementa esta interfaz. Se recupera una instancia de este componente mediante la función auxiliar GetControlWrapper con el tipo CONTROL_COMBO_BOX.

HRESULT Bind([in] IBindableList *pList)

Use este método cuando tenga un origen de datos que implemente la interfaz IBindableList . El cuadro de lista inicializa el contenido con los títulos de esta lista.

HRESULT Select(int index)

Seleccione el elemento en el cuadro combinado del índice.

int Selected(void)

Este método devuelve el índice del elemento seleccionado o -1 si no hay nada seleccionado.

void Add([in] LPCTSTR caption)

Agregue manualmente un elemento al cuadro combinado.

HRESULT GetText([out, retval] LPBSTR pText)

Recupere la cadena del elemento seleccionado actualmente en el cuadro combinado.

void Clear()

Quite todos los elementos del cuadro combinado.

Interfaz IControl

__interface IControl : IUnknown  
{  
    HRESULT SetEnable(BOOL enable);  
    BOOL IsEnabled(void);  
    HRESULT SetVisible(BOOL visible);  
};  
Información general

El componente ControlWrapper implementa esta interfaz. Se recupera una instancia de este componente mediante la función auxiliar GetControlWrapper con el tipo CONTROL_GENERIC.

HRESULT SetEnable(BOOL enable)

Habilite o deshabilite el control.

BOOL IsEnabled(void)

Devuelve TRUE si el control está habilitado, FALSE si no lo está.

HRESULT SetVisible(BOOL visible)

Mostrar u ocultar el control.

ICpuInfo (interfaz)

__interface ICpuInfo : IUnknown  
{  
    BOOL Is64Bit(void);  
};  
Información general

Para obtener esta interfaz, cree un nuevo componente de ID_CpuInfo . El método único notifica si la CPU es de 32 o 64 bits. Tenga en cuenta que si tiene un sistema operativo de 32 bits en un equipo de 64 bits, este método devuelve TRUE, ya que solo informa del ancho de la CPU (no del sistema operativo).

Interfaz 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);  
};  
Información general

El componente Directorio , que se crea mediante ID_Directory, proporciona una fachada para trabajar con directorios en el sistema de archivos.

BOOL FileExists(LPCWSTR name)

Este método devuelve TRUE si existe un archivo con el nombre que proporcione.

BOOL FindFirst([in] Nombre LPCWSTR)

Este método busca una primera coincidencia para el nombre que proporcione. Admite caracteres comodín y devuelve nombres de archivo y directorio. El método devuelve TRUE si se encontró una coincidencia; en caso contrario, FALSE.

HRESULT FoundName([out, retval] LPBSTR name)

Este método recupera el nombre del archivo encontrado con una llamada a FindFirst o FindNext.

DWORD FoundAttributes(void)

Este método devuelve el atributo del archivo o directorio encontrado más reciente. Puede usar el código como se indica a continuación para comprobar si es un directorio:

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

Busque el siguiente. Este método devuelve TRUE si se encontró otra coincidencia; en caso contrario, FALSE.

void FinishFind(void)

Este método libera los recursos usados para la operación Buscar.

IDomainJoinValidator (interfaz)

__interface IDomainJoinValidator : IUnknown  
{  
    HRESULT Init(ILogger *pLogger, IWizardPageContainer *pContainer, IStaticText *pUsername, IStaticText *pPassword, IStaticText *pComputerName);  
    HRESULT IsUsernameValid(LPCWSTR domainName);  
    BOOL CanModifyComputerAdEntry(LPCWSTR domainName);  
};  
Información general

Se obtiene una instancia de esta interfaz mediante el valor ID_DomainJoinValidator de la función de plantilla CreateInstance .

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

Inicialice la instancia, como se muestra en la tabla 17.

Tabla 17. HRESULT Init: inicialización de la instancia

Parámetro Descripción
pLogger La instancia del registrador, que está disponible para la página a través del método Logger de la página
pContainer Pasa los resultados del método Container de la página.
pUsername Cuadro de texto que contiene el nombre de usuario que se va a validar
pPassword Cuadro de texto que contiene la contraseña que se va a validar
PComputerName Cuadro de texto que contiene el nombre del equipo que finalmente se unirá al dominio.
HRESULT IsUsernameValid(LPCWSTR domainName)

Este método usa el método IADHelper-ValidLogon> para realizar el trabajo. Consulte ese método para obtener más información.

BOOL CanModifyComputerAdEntry(LPCWSTR domainName)

Compruebe si el usuario tiene derechos para modificar la entrada del equipo. La mayor parte del trabajo lo realiza IADHelper-HasAccess>. Si este método devuelve FALSE, compruebe el archivo de registro para obtener más información.

IDriveList (interfaz)

__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)

Llame a este método antes de llamar a cualquier otro componente. Tendrá que crear un nuevo WmiRepository antes de llamar a este método.

HRESULT SetWhereClause(LPCTSTR whereClause)

Este método permite agregar texto que aparecerá como una cláusula "where" en la consulta. Por ejemplo, la siguiente línea devuelve solo unidades USB:

pDrives->SetWhereClause(L"WHERE InterfaceType='USB'");  
HRESULT SetMinimumDriveSize(__int64 size)

Establezca el tamaño de la unidad minimizada, en bytes, para las unidades que se devolverán de la consulta.

HRESULT Update(void)

Ejecutar la consulta. La lista de unidades disponible después de llamar a este método se ordena por letra de unidad.

HRESULT AddProperty(ENUM_DISK_QUERY_SECTION sección, LPCTSTR propName, LPCTSTR propNameReturned)

Este método agrega los nombres de propiedades adicionales que desea que estén disponibles en los resultados de la consulta. Llame a este método antes de llamar a Update. En la tabla 18 se muestran tres de las propiedades útiles.

Tabla 18. HRESULT AddProperty: propiedades útiles

Section Propiedad Descripción
DISKQUERY_LOGICALDISK Size Tamaño, en bytes, representado como una cadena
DISKQUERY_DISKPARTITION DiskIndex Número de disco como entero, empezando por 0
DISKQUERY_LOGICALDISK VolumeName La etiqueta de volumen
size_t Count(void)

Número de registros que devuelve la consulta. Llame a Update antes de llamar a este método.

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

Este método recupera el valor de una propiedad de los resultados de la consulta, como se muestra en la tabla 19.

Tabla 19. HRESULT GetProperty

Parámetro Descripción
Índice Índice de base cero en el registro de resultados
propName Nombre de la propiedad, como "Size"
Valor Al devolver, este parámetro contiene un valor variant de la propiedad .
HRESULT GetCaption(size_t index, LPBSTR pCaption)

Este método recupera el título de un registro que es el mismo que la propiedad Caption .

IImageList (interfaz)

__interface IImageList  
{  
    HRESULT CreateImageList(int width, int height, UINT flags);  
    HImageList GetImageList(void);  
    int AddImage(HInstance hInstance, int resourceId);  
};  
Información general

El componente ImageList implementa esta interfaz. Recupera una instancia de este componente de la interfaz IListView .

HRESULT CreateImageList(int width, int height, UINT flags)

Cree una nueva lista de imágenes, que este componente administra. Llame a este método solo una vez.

HImageList GetImageList(void)

Este método devuelve el identificador de la lista de imágenes en caso de que necesite realizar otras operaciones en la lista de imágenes.

int AddImage(HInstance hInstance, int resourceId)

Agregue una nueva imagen a la lista de imágenes desde un recurso, como se muestra en la tabla 20.

Tabla 20. Interfaz IImageList de HRESULT

Parámetro Descripción
hInstance Identificador de instancia del módulo que contiene el recurso de mapa de bits
resourceId Identificador del recurso que se va a cargar en la lista de imágenes

IListView (interfaz)

__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);  
};  
Información general

El componente ControlWrapper implementa esta interfaz. Se recupera una instancia de este componente mediante la función auxiliar GetControlWrapper con el tipo CONTROL_LIST_VIEW.

int AddItem([in] TEXTO LPCTSTR)

Agregue una nueva fila al cuadro de lista. El método devuelve el índice del elemento que se acaba de agregar.

int AddColumn(int width, [in] LPCTSTR text)

Agregue una nueva columna a la vista de lista.

HRESULT SetSubItem(int index, int column, [in] LPCTSTR text)

Establezca el texto en una columna distinta de la primera columna del cuadro de lista, como se muestra en la tabla 21.

Tabla 21. HRESULT SetSubItem

Parámetro Descripción
index Índice del elemento de lista que desea modificar
Columna Índice de la columna que desea actualizar; la primera columna se establece con AddItem, las columnas dos y siguientes se establecen con este método
text Cadena que se va a mostrar en la columna
int GetWidth(void)

Este método devuelve el ancho de todo el cuadro de texto.

void SetExtendedStyle(estilo DWORD)

Este método permite establecer estilos extendidos en el cuadro de lista, por ejemplo:

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

Este método devuelve el índice del elemento de vista de lista seleccionado actualmente.

HRESULT SelectItem(int index)

Establezca el elemento seleccionado en la lista en este índice.

BOOL IsItemChecked(int index)

Este método devuelve TRUE si está seleccionado un elemento de la lista. Este método requiere que llame a SetExtendedStyle para establecer el estilo de casilla.

int GetItemCount(void)

Este método devuelve el número de elementos de la vista de lista.

HRESULT CreateImageList(int width, int height, UINT flags)

Cree una nueva lista de imágenes y adjúntela a la vista de lista.

int AddImage(HINSTANCE hInstance, int resourceId)

Agregue una imagen a la lista de imágenes de la vista de lista. Primero debe llamar a CreateImageList.

HRESULT SetImage(int index, int imageIndex)

Establezca la imagen que se mostrará en el lado izquierdo para un elemento de vista de lista específico.

HRESULT Clear(void)

Quite todos los elementos de la vista de lista.

IProgressBar (interfaz)

__interface IProgressBar : IControl  
{  
    HRESULT SetPercentage(int position);  
    int GetPercentage(void);  
};  
Información general

El componente ProgressBarWrapper implementa esta interfaz. Se recupera una instancia de este componente mediante la función auxiliar GetControlWrapper con el tipo CONTROL_PROGRESS_BAR.

HRESULT SetPercentage(int position)

Establezca la posición de la barra de progreso con un número entre 0 y 100. De forma predeterminada, las nuevas barras de progreso de Win32® tienen un intervalo máximo de 100.

int GetPercentage(void)

Este método devuelve la posición actual de la barra de progreso.

IRadioButton (interfaz)

__interface IRadioButton : IControl  
{  
public:  
    void SetGroup(int firstId, int lastId);  
    void CheckRadio(int id);  
    BOOL IsButtonChecked(int id);  
    void EnableRadio(int id, BOOL enable);  
};  
Información general

El componente RadioButtonWrapper implementa esta interfaz. Se recupera una instancia de este componente mediante la función auxiliar GetControlWrapper con el tipo CONTROL_RADIO_BUTTON.

void SetGroup(int firstId, int lastId)

Proporcione al contenedor el intervalo de botones de radio que se deben tratar como un grupo. Llame a este método antes de llamar a CheckRadio.

void CheckRadio(int id)

Establezca el botón de radio específico para que sea el único botón en el grupo de botones de radio seleccionados. Llame a SetGroup antes de llamar a este método.

BOOL IsButtonChecked(int id)

Este método devuelve TRUE si el botón de radio está seleccionado actualmente; en caso contrario, FALSE.

void EnableRadio(int id, BOOL enable)

Este método habilita o deshabilita un botón de radio.

IStaticText (interfaz)

__interface IStaticText : IControl  
{  
    HRESULT SetText([in] LPCTSTR pText);  
    HRESULT GetText([out, retval] LPBSTR pText);  
};  
Información general

El componente StaticTextWrapper implementa esta interfaz. Se recupera una instancia de este componente mediante la función auxiliar GetControlWrapper con el tipo CONTROL_STATIC_TEXT.

HRESULT SetText([in] LPCTSTR pText)

Establezca el texto del control.

HRESULT GetText([out, retval] LPBSTR pText)

Este método devuelve el valor actual del texto del control.

Interfaz ITask

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

Implemente esta interfaz si desea que el componente esté disponible como tarea en la página preparatoria o si desea usar el componente BackgroundTask para realizar el trabajo en un subproceso en segundo plano.

Estos son los componentes que implementan la interfaz ITask :

  • ID_ShellExecuteTask, L"Microsoft. Wizard.ShellExecuteTask"

  • ID_CopyFilesTask, L"Microsoft. Wizard.CopyFilesTask"

  • ID_ACPowerTask, L"Microsoft. OSDRefresh.ACPowerTask"

  • ID_WiredNetworkTask, L"Microsoft. SharedPages.WiredNetworkTask"

Init
HRESULT Init(IStringProperties *pProperties, ISettingsProperties *pTaskSettings)  

Si va a escribir una tarea para la página preparatoria, llame a este método para inicializar la tarea. El archivo .config contiene XML que podría tener un aspecto similar al siguiente:

<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>  

El parámetro pProperties proporciona acceso a los tres valores de establecedor, mientras que el parámetro pTaskSettings proporciona acceso al elemento Task y a los elementos secundarios. La mayoría de las tareas solo necesitan leer datos del parámetro pProperties .

Ejecutar
HRESULT Execute(LPDWORD pReturnCode)  

Aquí es donde escribe el código que realiza la tarea. Este método debe devolver S_OK si no hay errores y puede devolver otro HRESULT si se produjo un error mientras se estaba ejecutando la tarea. Los valores distintos de S_OK que devuelve este método se comparan con <los elementos Error> de la <sección ExitCodes> si se usa la página preparatoria.

El parámetro pReturnCode debe actualizarse con un número que informe del estado de la tarea. La página de comprobaciones hace coincidir estos valores con los <elementos ExitCode> .

ITreeView (interfaz)

__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);  
};  
Información general

El componente TreeViewWrapper implementa esta interfaz. Se recupera una instancia de este componente mediante la función auxiliar GetControlWrapper con el tipo CONTROL_TREE_VIEW.

void EnableCheckboxes(void)

Este método activa las casillas del control de vista de árbol estableciendo el estilo TVS_CHECKBOXES .

HRESULT CreateImageList(int width, int height, UINT flags)

Agregue una nueva lista de imágenes al control de vista de árbol. El parámetro flags se pasa en la llamada a la función ImageList_Create Win32.

int AddImage(HINSTANCE hInstance, int resourceId)

Agregue una imagen a la lista de imágenes desde un recurso (resourceId) en el módulo con el identificador de instancia hInstance.

HTREEITEM AddItem(LPCTSTR text, HTREEITEM hParent = NULL)

Agregue un nodo a la vista de árbol. El nuevo nodo se agregará en el nivel superior si hParent es NULL. De lo contrario, proporcione el identificador al elemento primario donde desea agregar el nuevo elemento. Este método devuelve el identificador al nuevo elemento.

void SetImage(HTREEITEM item, int image, int expandImage)

Establezca la imagen que se va a usar para un elemento de vista de árbol. Puede establecer tanto la imagen normal como la expandida.

void Clear(void)

Quite todos los elementos de la vista de árbol.

BOOL SetFirstVisible(HTREEITEM item)

Asegúrese de que el elemento de vista de árbol esté visible. La vista de árbol se desplazará si es necesario para que este elemento sea visible.

BOOL SelectItem(HTREEITEM item)

Establezca el elemento seleccionado actualmente en el elemento que proporcione. Puede llamar a SetFirstVisible después de esto para asegurarse de que el elemento recién seleccionado está visible.

void CheckItem(HTREEITEM item, UINT checkState)

El método básicamente establece la imagen que se mostrará para la casilla de verificación en la vista de árbol. Estas imágenes se encuentran en un control ImageList independiente que administra la vista de árbol. De forma predeterminada, esta lista de imágenes tiene tres imágenes, que se muestran en la tabla 22.

Tabla 22.void CheckItem Image List Default

checkState Descripción
0 En blanco
1 Despejado
2 Seleccionado
HTREEITEM SelectedItem(void)

Este método devuelve el identificador del elemento de vista de árbol seleccionado actualmente.

int SetItemHeight(SHORT height)

Este método establece el alto de todos los elementos del control de vista de árbol en píxeles. Devuelve el alto anterior en píxeles.

HRESULT EnableItem(HTREEITEM item, BOOL enable)

Este método habilita o deshabilita un único elemento del árbol. Deshabilitar un elemento con elementos secundarios no deshabilitará los elementos secundarios.

void Expand(HTREEITEM hItem, BOOL expand)

Este método expande o contrae un nodo en el árbol.

HTREEITEM GetChild(HTREEITEM hParent)

Este método devuelve el primer elemento secundario de un elemento de vista de árbol o NULL si no hay elementos secundarios.

HTREEITEM GetParent(HTREEITEM hNode)

Este método devuelve el identificador del elemento primario de un nodo en la vista de árbol o NULL si el nodo está en el nivel superior.

HTREEITEM GetNextItem(HTREEITEM hPrevious)

Puede llamar a este método con un identificador que GetChild devuelve para recorrer en iteración todos los elementos secundarios de un nodo. Este método devuelve el siguiente elemento relacionado del árbol que comparte el mismo elemento primario.

UINT IsChecked(HTREEITEM item)

Este método devuelve 0 si el nodo de vista de árbol no está seleccionado y 1 si lo está.

BOOL IsEnabled(HTREEITEM item)

Este método devuelve TRUE si el nodo de vista de árbol está habilitado; en caso contrario, FALSE.

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

Este método es solo para uso interno.

HRESULT SetEventHandler(ITreeViewEvent *pEventHandler)

Llame a este método si desea recibir una notificación cuando cambie el elemento seleccionado o el usuario cambie el estado de comprobación de un elemento de vista de árbol. Debe implementar ITreeViewEvent en el componente para recibir estas devoluciones de llamada.

void SetSelectedBackColor(COLORREF color)

Establezca el color de fondo usado para el elemento seleccionado.

Interfaz IWmiIteration

__interface IWmiIterator : IUnknown  
{  
    HRESULT Next(void);  
    HRESULT GetProperty(LPCTSTR propertyName, [out] LPVARIANT pValue);  
};  
Información general

Normalmente se usa esta interfaz, junto con IWmiRepository, cuando se trabaja con llamadas WMI. La interfaz IWmiIteration permite recorrer en iteración los valores que devuelve una consulta.

HRESULT Next(void)

Vaya al siguiente elemento de los resultados de la consulta, como se muestra en la tabla 23.

Tabla 23. HRESULT Next(void) Query Returns

HRRESULT Descripción
S_OK Se ha movido al siguiente resultado; puede usar GetProperty para recuperar las propiedades de ese resultado.
S_FALSE No hay más elementos en la lista.
E_NOT_SET No hay resultados de consulta
HRESULT GetProperty(LPCTSTR propertyName, [out] LPVARIANT pValue)

Este método recupera el valor de una propiedad del registro de resultados actual, como se muestra en las tablas 24 y 25.

Table 24. HRESULT GetProperty

Parámetro Descripción
propertyName Nombre de la propiedad que desea recuperar
pValue Apunta a una estructura VARIANT que, al devolver, contiene el valor de la propiedad

Tabla 25. HRESULT GetProperty Result

[HRESULT] Descripción
S_OK Se recuperó el valor de propiedad.
WBEM_E_NOT_FOUND No hay ninguna propiedad con el nombre .
E_NOT_VALID_STATE No hay un registro activo.

Nota:

El método GetProperty puede devolver otros códigos de error WMI distintos de los que aparecen en la tabla 25. Los valores enumerados son los resultados comunes que se devuelven.

IWmiRepository (interfaz)

__interface IWmiRepository : IUnknown  
{  
    HRESULT SetNamespace(LPCWSTR namespaceName);  
    HRESULT ExecQuery(LPCWSTR query, [out] IWmiIterator **ppIterator);  
};  
Información general

Esta interfaz la implementa el componente WmiRepository (ID_WmiRepository).

HRESULT SetNamespace(LPCWSTR namespaceName)

Este método establece el espacio de nombres WMI que se usará para la consulta. Llame a este método antes de llamar a ExecQuery. Si no llama a este método, el espacio de nombres será root\cimv2. Este método siempre devuelve S_OK.

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

Ejecute una consulta en el espacio de nombres WMI establecido con una llamada a SetNamespace, como se muestra en las tablas 26 y 27.

Tabla 26. HRESULT ExecQuery

Parámetro Descripción
Query Cadena de la consulta WMI que desea ejecutar
ppIterator Pase un puntero a un puntero de interfaz, que a su vez se rellenará con una interfaz, lo que le dará acceso a los resultados de la consulta.

Tabla 27. Resultado de la consulta HRESULT

[HRESULT] Descripción
S_OK Consulta correcta
Otros Si la consulta no se realizó correctamente, devuelve un valor HRESULT de WMI.

Interfaz 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);  
 };  
Información general

Cada página del Asistente para UDI tiene su propio controlador de formulario que implementa esta interfaz. Use este controlador para conectar los datos de campo del archivo XML de .config a los controles de la página. A continuación, el controlador de formulario controla muchos de los detalles automáticamente.

Configuración del formulario

Por lo general, configure el controlador de formulario en el método OnWindowCreated de la página. Esto suele implicar llamar a los métodos que se muestran en la tabla 28.

Tabla 28. OnWindowCreated (método)

Método Descripción
Init Inicializa el controlador de formulario
AddField Proporciona una conexión entre un campo del .config archivo XML que es un nombre de cadena y un control en el cuadro de diálogo de la página que es un identificador.
AddRadioGroup Se usa para conectar un botón de radio a un grupo y a un control en el cuadro de diálogo
AddToGroup Permite controles "secundarios" que están habilitados o deshabilitados junto con su elemento primario o en función del botón de radio seleccionado.
InitFields Llame a después de llamar a todos los métodos Add para configurar el formulario.
Validate Realiza la validación inicial.
Procesamiento de eventos de formulario

Agregue la siguiente llamada al método OnControlEvent :

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

Esta llamada pasa eventos al controlador de formularios para que pueda procesar eventos relacionados con el formulario.

Guardar datos de formulario

En el método OnNextClicked , llame a los métodos de formulario que se muestran en la tabla 29.

Tabla 29. OnNextClicked (método)

Método Descripción
InitSection Proporciona el nombre de la sección que se mostrará en la página Resumen de esta página.
SaveFields Guardar valores de campo en variables de secuencia de tareas y en la página Resumen
Init
HRESULT Init(IWizardPageView *pView, IWizardPageContainer *pContainer)  

Normalmente se llama a este método cerca del inicio del método OnWindowCreated de la página. El comando debe tener un aspecto similar al siguiente:

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

Este método se llama internamente y no debe llamarlo usted mismo. Proporciona el XML de la página al controlador de formulario.

Validar
HRESULT Validate(void)  

Este método ejecuta todos los validadores adjuntos a los controles. Si un validador no pasa, el controlador de formulario muestra un mensaje de advertencia y deshabilita el botón Siguiente y, a continuación, detiene el procesamiento de validadores. Normalmente, solo es necesario llamar a este método al final del método OnWindowCreated ; siempre devuelve S_OK.

AddToGroup
AddToGroup(int groupControlId, int controlId)  

Este método agrega un control como "secundario" de una casilla de verificación o botón de radio, como se muestra en la tabla 30. Todos estos controles secundarios se deshabilitarán cuando el control primario no esté seleccionado. El método siempre devuelve S_OK.

Tabla 30. AddToGroup

Parámetro Descripción
groupControlId El identificador de la casilla de verificación o el botón de radio que controlará el estado de habilitación del control secundario
Controlld Identificador del control que desea agregar como elemento secundario
UpdateCheckGroup
HRESULT UpdateCheckGroup(int groupControlId)  

Este método actualiza el estado de habilitación o deshabilitación de los controles secundarios de un grupo en función del estado del control primario. Por lo general, no es necesario llamar a este método usted mismo, porque el controlador de formulario lo llama por usted.

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

Llame a este método solo si tiene un validador que desea crear en el código en lugar de con el XML. Este método siempre devuelve S_OK.

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

Llame a este método solo si tiene un validador que desea crear en el código en lugar de con el XML.

DisableValidation
HRESULT DisableValidation(int controlId, BOOL disable)  

Llame a este método para deshabilitar explícitamente el validador de un control o restaurar la validación normal, como se muestra en la tabla 31. Este método es útil, por ejemplo, cuando tiene reglas de habilitación o deshabilitación para controles que no están cubiertos con la validación de formularios y necesita deshabilitar la validación de un control. En otras palabras, normalmente no llamaría a este método. Este método siempre devuelve S_OK.

Tabla 31. HRESULT DisableValidation

Parámetro Descripción
controlId Control para el que desea habilitar o deshabilitar la validación
Disable Se establece en TRUE para deshabilitar la validación y en FALSE para restaurar la validación normal
AddField
HRESULT AddField(LPCWSTR fieldName, int controlId, BOOL suppressLog, DialogControlTypes type)  

Agregue una asignación de control entre el nombre en un elemento Field del archivo XML de .config y el identificador de control en el cuadro de diálogo de la página, como se muestra en la tabla 32. Debe llamar a este método antes de llamar a InitFields, ya que InitFields usa esta información. Este método siempre devuelve S_OK.

Tabla 32. HRESULT AddField

Parámetro Descripción
Fieldname Nombre del campo tal y como aparece en el XML de la página
controlId Identificador del control en la plantilla de cuadro de diálogo de la página
suppressLog Establezca en TRUE si no desea que los valores de este campo se escriban en el archivo de registro; establezca siempre este parámetro en TRUE para los campos de contraseña o PIN.
Tipo Tipo de control, que es uno de los siguientes:

- 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)  

Este método agrega un control a un grupo de botones de radio con nombre, como se muestra en la tabla 33. Debe llamar a esto antes del método InitFields , ya que ese método usa atributos en el elemento RadioGroup para controlar la configuración de todos los controles de botón de radio del grupo. Los grupos de radio se pueden bloquear, por ejemplo, para que todos los botones de radio estén deshabilitados, pero los controles secundarios se habilitan o deshabilitan solo en función del botón de radio seleccionado. Este método siempre devuelve S_OK.

Tabla 33. HRESULT AddRadioGroup

Parámetro Descripción
Groupname Cadena que define un grupo de botones de radio en esta página
radioControlId Identificador de un solo botón de radio que se va a agregar a este grupo
EnableRadioGroup
HRESULT EnableRadioGroup(LPCWSTR groupName, BOOL enable)  

Este método permite habilitar o deshabilitar un grupo de botones de radio completo. Al deshabilitar un grupo de radio, se deshabilitan todos los controles de botón de radio del grupo, así como los elementos secundarios de los botones de radio que se han agregado con AddToGroup. Véase la tabla 34 y la tabla 35.

Tabla 34. EnableRadioGroup

Parámetro Descripción
Groupname Nombre de un grupo de botones de radio que ya definió con una llamada a AddRadioGroup
Enable Establézcalo en TRUE para habilitar el grupo de botones de radio y FALSE para deshabilitar el grupo.

Tabla 35. HRESULT EnableRadioGroup

[HRESULT] Descripción
S_OK Grupo habilitado o deshabilitado
E_INVALIDARG No hay ningún grupo de botones de radio con el nombre que proporcionó.
InitFields
HRESULT InitFields(IFieldCallback *pFieldCallback = nullptr)  

Antes de llamar a este método, llame a AddField para cada campo que el XML pueda controlar. Este método siempre devuelve S_OK.

El parámetro pFieldCallback es opcional. Si lo proporciona, el controlador de formulario llama a SetFieldDefault para los controles que no son CONTROL_STATIC_TEXT ni CONTROL_CHECK_BOX. Este comportamiento le permite recuperar un valor predeterminado del XML y establecerlo en el control usted mismo.

SaveFields
HRESULT SaveFields(IFieldCallback *pFieldCallback = nullptr)  

Este método guarda los valores de campo en las variables de secuencia de tareas y en los datos de resumen que se mostrarán en la página Resumen . Proporcionar un puntero en pFieldCallback permite controlar los valores de guardado de los controles que no admiten CONTROL_STATIC_TEXT.

IsFieldDisabled
BOOL IsFieldDisabled(int controlId)  

Este método permite determinar si un campo se ha deshabilitado en el XML.

InitSection
HRESULT InitSection(LPCWSTR key, LPCWSTR sectionCaption)  

Este método inicializa los datos de resumen que se mostrarán en la página Resumen , como se muestra en la tabla 36. Llame a este método en el método OnNextClicked antes de llamar a SaveFields. Este método siempre devuelve S_OK.

Tabla 36. HRESULT InitSection

Parámetro Descripción
Clave Este parámetro debe ser único para la página. Se usa para asegurarse de que cada página tiene su propia información de resumen.
sectionCaption Encabezado que se mostrará en la página Resumen de la información de resumen de esta página. Normalmente, se usa DisplayName() como valor para este parámetro.
AddSummaryItem
HRESULT AddSummaryItem(LPCWSTR first, LPCWSTR second)  

Este método permite agregar elementos de resumen a la página Resumen más allá de los elementos establecidos con EL XML. Véase la tabla 37.

Tabla 37. HRESULT AddSummaryItem

Parámetro Descripción
Primero Título del elemento de resumen, que se muestra en el lado izquierdo
Second Valor que se mostrará en el lado derecho
SuppressLogValue
HRESULT SuppressLogValue(LPCWSTR tsVariableName)  

Llame a este método para las variables de secuencia de tareas para las que no desea que los valores se escriban en el archivo de registro. Llame a este método para las variables de secuencia de tareas que almacenan contraseñas, PIN u otros valores confidenciales que un usuario podría escribir.

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

Este método guarda el valor de un control de texto en una variable de secuencia de tareas y en la sección de resumen. Normalmente, no es necesario llamar a este método por sí mismo, ya que el controlador de formulario lo hace para todos los campos. Consulte la tabla 38.

Tabla 38. HRESULT SaveText

Parámetro Descripción
controlId Identificador del cuadro de texto que contiene el valor que desea guardar (o cualquier otro control que pueda devolver texto)
tsVariableName Nombre de la variable de secuencia de tareas que desea modificar
summaryCaption Título de la página Resumen de este valor
LoadText
HRESULT LoadText(int controlId, LPCWSTR tsVariableName)  

Este método lee el valor de una variable de secuencia de tareas y establece el cuadro de texto en este valor.

ControlEvent
void ControlEvent(WORD eventId, WORD controlId)  

Llame a este método en el método OnControlEvent para asegurarse de que el controlador de formulario puede procesar eventos de control, lo que debe hacer para funcionar correctamente. Los valores que se pasan a este método son los mismos que se pasan al método OnControlEvent .

IsValid
BOOL IsValid(void)  

Este método devuelve el estado de la validación más reciente del formulario. Si alguno de los validadores de control ha notificado un error, este método devuelve FALSE. En otras palabras, devuelve TRUE solo si todos los controles de la página son válidos.

Interfaz 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);  
};  
Información general

Los validadores son componentes que pueden validar un único control en la página. La manera más fácil de implementar un validador es convertirlo en una subclase de la clase BaseValidator , que se define en el archivo de encabezado BaseValidator.h.

HRESULT Init(IControl *pControl, mensaje LPCTSTR)

Si crea un validador en el código, puede llamar a este método para inicializar el validador. Consulte la tabla 39.

Tabla 39. HRESULT Init

Parámetro Descripción
pControl Control que el validador debe validar
Message Mensaje que se va a mostrar en la página si el control no es válido
HRESULT Init(IControl *pControl, IWizardPageContainer *pContainer, IStringProperties *pProperties)

El controlador de formulario llama a este método para inicializar validadores que crea en función del XML de la página. Consulte la tabla 40.

Tabla 40. HRESULT Init (método)

Parámetro Descripción
pControl Control que el validador debe validar
pContainer En caso de que el validador necesite acceso al registrador o necesite crear otros componentes
pProperties Proporciona acceso a las propiedades (elementos establecedores) para el validador.
BOOL, IsValid(LPBSTR pMessage)

Este método devuelve TRUE si el control es válido o FALSE si el control no es válido. Al devolver, pMessage debe rellenarse con un nuevo BSTR que contenga el mensaje que se mostrará cuando el control no sea válido.

HRESULT SetProperty(int propertyId, LPVARIANT pValue)

Puede implementar este método si necesita valores adicionales que no se proporcionan en el XML.

HRESULT SetProperty(int propertyId, IUnknown *pUnknown)

Puede implementar este método si necesita valores adicionales que no se proporcionan en el XML.

HRESULT SetProperty)(int propertyId, LPCTSTR pValue)

Puede implementar este método si necesita valores adicionales que no se proporcionan en el XML.

IRegEx (interfaz)

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

Este método lo implementa el componente ID_Regex (IRegex.h) y proporciona compatibilidad con el procesamiento de expresiones regulares.

BOOL MatchesRegex(entrada LPCTSTR, LPCTSTR regex)

Este método ejecuta la expresión regular en el texto de entrada. Usa la función regex_match de la biblioteca estándar de C++ para realizar el trabajo real. El método devuelve TRUE si hubo coincidencias; en caso contrario, FALSE.

HRESULT GetMatch(size_t index, LPBSTR pValue)

Este método permite recuperar las coincidencias de la llamada MatchesRegex más reciente. Tenga en cuenta que no hay ningún procesamiento de errores en este método y devuelve S_OK o produce una excepción.

Interfaz 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);  
};  

No es necesario usar esta interfaz directamente. En su lugar, use IFormController.

ISummaryBag

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

No es necesario usar esta interfaz directamente. En su lugar, use IFormController.

Interfaz 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);  
};  

Esta interfaz proporciona acceso a las variables de secuencia de tareas. Puede acceder a esta interfaz mediante el método TSVariables() de la página.

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

Este método lee el valor de una variable de secuencia de tareas.

Nota:

Los valores se almacenan en caché después de la primera lectura.

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

Este método establece el valor de una variable de secuencia de tareas. Este valor se guarda en memoria. Los valores de secuencia de tareas se escriben una vez que haga clic en Finalizar en el Asistente para UDI.

void Clear(void)

Este método quita todos los valores de secuencia de tareas que se han guardado en la memoria.

HRESULT Remove([in] LPCTSTR variableName)

Este método quita un valor de secuencia de tareas específico de la memoria. La próxima vez que llame a GetValue con el mismo nombre de secuencia de tareas, el método intenta recuperarlo de la secuencia de tareas.

HRESULT SuppressLogValue([in] LPCTSTR variableName)

Cada vez que se escriben variables de secuencia de tareas, como al hacer clic en Finalizar en el Asistente para UDI, los nombres y valores se escriben en el archivo de registro. Llame a este método para suprimir el registro de valores confidenciales, como contraseñas o PIN, para una variable de secuencia de tareas específica.

void Save(void)

Este método guarda todos los valores de secuencia de tareas que se han establecido con llamadas a SetValue.

ITSVariableRepository (interfaz)

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

Esta interfaz es para uso interno de TSVariableBag para leer y escribir variables de secuencia de tareas.

IWizardFinish (interfaz)

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

Esta interfaz es útil en escenarios avanzados en los que desea realizar un procesamiento adicional al hacer clic en Finalizar o Cancelar en el Asistente para UDI. El Asistente para UDI contiene una tarea Finalizar que guarda las variables de secuencia de tareas al hacer clic en Finalizar. Si cancela el asistente, la tarea solo establece la variable de secuencia de tareas OSDSetupWizCancelled en TRUE y no guarda los cambios en ninguna otra variable de secuencia de tareas.

Si crea su propio componente de finalización, debe registrarlo con código como este:

Register<MyFinishTaskFactory>(ID_MyFinishTask, pRegistry);  

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

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

pService->Register(pFinish);  

IBindableList (interfaz)

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

Implemente esta interfaz si tiene un componente de origen de datos que desea enlazar a un cuadro combinado llamando a su método Bind .

size_t Count(void)

Este método devuelve el número de elementos de la lista.

HRESULT GetCaption(size_t index, LPBSTR pCaption)

Este método devuelve el título del elemento en un índice específico.

IDataNodes (interfaz)

__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);  
};  

Esta interfaz proporciona acceso a los datos jerárquicos que se pueden guardar en una página. Esta interfaz se obtiene a través de métodos en la interfaz ISettingsProperties , que está disponible para la página a través del método Settings .

Los datos del XML de una página pueden tener un aspecto similar al siguiente.

      <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>  

Llamar a Settings()->GetDataNode(L"Network", &pData) proporciona una instancia de IDataNodes con dos elementos de datos (cada uno de los cuales a su vez tiene dos propiedades).

size_t Count()

Este método devuelve el número de elementos DataItem .

HRESULT SetCaptionProperty(LPCTSTR captionProperty)

El componente que admite esta interfaz también admite IBindableList, lo que facilita rellenar un cuadro combinado con datos del XML de la página. Este método controla qué propiedad (establecedor) de cada elemento DataItem se usará para este enlace. Por ejemplo, podría llamar a este método con DisplayName y usaría esa propiedad establecedora para el enlace de datos. A continuación, el cuadro combinado contendrá Public y Dev Team como elementos.

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

Este método obtiene una propiedad de uno de los elementos DataItem . Consulte la tabla 41 y la tabla 42.

Tabla 41. DataItem GetProperty

Parámetro Descripción
Índice Valor de índice (a partir de 0) del objeto DataItem para el que desea recuperar un valor de propiedad.
propertyName Nombre de la propiedad establecedor para la que desea recuperar un valor
Valor_propiedad Al devolver, contiene el valor de cadena de una propiedad

Tabla 42. HRESULT GetProperty

[HRESULT] Descripción
S_OK Se recuperó la propiedad .
E_INVALIDARG El índice está más allá del final de la matriz.
HRESULT GetNode(size_t index, [out] ISettingsProperties **ppNode)

Este método es similar a GetProperty, pero en lugar de devolver un valor de un objeto DataItem, devuelve todo el objeto DataItem encapsulado en una interfaz ISettingsProperties . Véase la tabla 43 y la tabla 44.

Tabla 43. HRESULT GetNode

Parámetro Descripción
Índice Valor de índice (a partir de 0) del objeto DataItem para el que desea recuperar un valor de propiedad.
ppNode Al salir, la interfaz ISettingsProperties que encapsula el nodo DataItem

Tabla 44. Resultados de GetNode de HRESULT

[HRESULT] Descripción
S_OK Se recuperó el nodo.
E_INVALIDARG El índice está más allá del final de la matriz.

IFactoryRegistry (interfaz)

__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);  
};  
Información general

Al crear una nueva página personalizada, como mínimo debe crear un generador de páginas, una clase que implemente IClassFactory. (Puede usar ClassFactoryImpl como clase base para el generador).

void Register(tipo LPCTSTR, IClassFactory *pFactory)

Este método registra un generador de clases con el Registro. Consulte la tabla 45.

Tabla 45. Registro nulo de IClassFactory

Parámetro Descripción
Tipo Cadena que identifica el generador que está registrando; por lo general, este parámetro debe tener el nombre de la empresa en la cadena para asegurarse de que es único
pFactory Puntero a la instancia de generador de clases
HRESULT LoadAndRegister(LPCTSTR dllName, ILogger *pLogger)

Este método es solo para uso interno.

BOOL Contains(LPCTSTR type)

Este método es generalmente para uso interno. Comprueba si se ha registrado un generador de clases para un tipo.

HRESULT GetFactory(tipo LPCTSTR, IClassFactory **ppFactory)

Este método permite recuperar el generador de clases. Normalmente, llamaría a CreateInstance. Sin embargo, si va a crear un gran número del mismo componente, es más eficaz recuperar el generador y, a continuación, pedirle que cree las instancias automáticamente.

HRESULT CreateInstance(tipo LPCTSTR, IUnknown **ppInstance)

Este método crea una nueva instancia de un componente, dado su tipo. En su lugar, use el método de plantilla CreateInstance , que permite la creación de objetos con seguridad de tipos.

HRESULT SetContainer(IWizardPageContainer *pContainer)

Este método es solo para uso interno.

HRESULT RegisterService(REFGUID iid, IUnknown *pService)

Los servicios son instancias únicas de un componente que se pueden usar en varios lugares. Puede usar este método para registrar un servicio en una página y, a continuación, recuperar esa misma instancia de otra página.

HRESULT GetService(REFGUID iid, IUnknown **ppService)

Este método recupera un servicio que se registró anteriormente con una llamada a RegisterService.

HRESULT SetLanguage(LANGID languageId)

Este método establece el idioma del Asistente para UDI en el identificador de idioma que proporcionó en el parámetro languageId .

LANGID GetLanguage()

Este método devuelve el valor del identificador de idioma que proporcionó con el parámetro de línea de comandos /locale para el Asistente para UDI. El método devuelve uno de los siguientes valores:

  • Valor del identificador de idioma proporcionado con el parámetro de línea de comandos /locale

  • 0, si no proporcionó el parámetro de línea de comandos /locale

Interfaz 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);  
};  
Información general

El Asistente para UDI registra información en un archivo de registro, lo que ayuda a solucionar problemas que se encuentran en el campo. Es una buena idea que las páginas registren información. Puede obtener un puntero a esta interfaz desde dentro de la página mediante el método Logger() de la página. Las líneas del archivo de registro contienen un número de "nivel" que representa mensajes de error, normales, detallados o de depuración.

Nota:

Los mensajes de depuración no se guardan en el archivo de registro a menos que se active la compatibilidad con depuración. Para activar la compatibilidad con la depuración, agregue la línea siguiente al elemento Style del archivo .config:

<Setter Property="debug">true</Setter>  
Init
HRESULT Init(LPCWSTR logFilename)  

Este método es solo para uso interno.

MoveLog
HRESULT MoveLog(LPCWSTR logFilename)  

Este método es solo para uso interno.

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

Este método es solo para uso interno.

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

Este método es solo para uso interno.

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

Llame a este método para registrar información sobre un error. Consulte la tabla 46.

Tabla 46. HRESULT Error

Parámetro Descripción
Error Código de error devuelto por una llamada (este código se mostrará en la entrada de registro como un número).
Componente Cadena que identifica el origen del error, que suele ser la página o el componente que ha escrito.
Message Mensaje que explica la causa del error
Error 2
HRESULT Error2(HRESULT error, LPCTSTR component, LPCTSTR message, LPCTSTR message2)  

Este método es similar al método Error , pero permite proporcionar un mensaje de dos partes. El mensaje final tendrá "message" y, a continuación, "message2" en el archivo de salida. Esto es simplemente un método de conveniencia.

Normal
HRESULT Normal(LPCTSTR component, LPCTSTR message)  

Este método registra un mensaje normal. Consulte la descripción del método Error para obtener parámetros.

Normal2
HRESULT Normal2(LPCTSTR component, LPCTSTR message, LPCTSTR message2)  

Este método registra un mensaje normal. Consulte la descripción del método Error2 para obtener parámetros.

Detallado
HRESULT Verbose(LPCTSTR component, LPCTSTR message)  

Este método registra un mensaje detallado. Consulte la descripción del método Error para obtener parámetros.

Detallado2
HRESULT Verbose2(LPCTSTR component, LPCTSTR message, LPCTSTR message2)  

Este método registra un mensaje detallado. Consulte la descripción del método Error2 para obtener parámetros.

Depuración
HRESULT Debug(LPCWSTR component, LPCWSTR message)  

Este método registra un mensaje de depuración. Consulte la descripción del método Error para obtener parámetros. Los mensajes de depuración no se guardan en el archivo a menos que estén habilitados. Consulte la sección Información general para obtener más información.

EnableDebug
HRESULT EnableDebug(BOOL debug)  

Este método es solo para uso interno.

Cerrar
HRESULT Close(void)  

Este método es solo para uso interno.

GetLogFilename
HRESULT GetLogFilename(LPBSTR pFilename)  

Este método recupera el nombre del archivo de registro.

Interfaz IOrientation

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

Esta interfaz es solo para uso interno.

Interfaz 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);  
};  

Esta interfaz es solo para uso interno.

Interfaz 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);  
};  
Información general

Esta interfaz proporciona acceso a los datos de página. Para llegar al nivel superior de los datos de página, use el método Settings() de la página.

HRESULT GetAttribute(LPCTSTR attributeName, LPBSTR attributeValue)

Este método permite recuperar los valores de los atributos en el nodo principal, que es el nodo Page cuando se usa el método Settings() de la página.

IStringProperties * Properties()

Este método proporciona acceso a los valores de propiedad de establecedor en el nodo principal. Para una página, estas son las propiedades de nivel superior.

HRESULT SelectNodes(LPCTSTR xPath, IXMLDOMNodeList **ppList)

Llame a este método si desea obtener directamente una lista de nodos XML mediante una expresión XPath. Es mejor usar uno de los otros métodos si puede. Use este método solo si no puede llegar a los nodos de otra manera.

HRESULT SelectSingleNode(LPCTSTR xPath, IXMLDOMNode **ppNode)

Llame a este método si desea obtener directamente un único nodo XML mediante una expresión XPath. Es mejor usar uno de los otros métodos si puede. Use este método solo si no puede llegar a un nodo de ninguna otra manera.

HRESULT GetDataNode(LPCTSTR name, ISettingsProperties **ppNode)

Recupere un elemento Data basado en el atributo Name de ese elemento.

HRESULT GetDataNodes(IDataNodes **ppNodes)

Este método recupera una lista de elementos DataItem en el nodo actual. Desde el nivel de página, llame a GetDataNode para recuperar una interfaz ISettingsProperty para los datos. A continuación, en esa instancia, llame a GetDataNodes para recuperar la lista de registros. Por ejemplo, dado este 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)

Este método proporciona una manera rápida de llegar al conjunto de nodos DataItem en un nodo data específico. Con el XML del ejemplo GetDataNodes , el código siguiente hace exactamente lo mismo que las cuatro líneas de código del ejemplo en GetDataNodes , pero con la comprobación de errores:

ISimpleStringProperties Interface  

ISimpleStringProperties (interfaz)

__interface ISimpleStringProperties : IStringProperties  
{  
void Add(LPCTSTR propertyName, LPCTSTR value);  
};  

Por sí sola, esta interfaz puede no ser útil. Sin embargo, lo implementa el componente ID_SimpleStringProperties , que también implementa la interfaz IStringProperties . Puede usar este componente en casos en los que necesite pasar un conjunto de propiedades a otro componente, como una tarea, pero desea agregar valores mediante programación en lugar de usar valores de XML. Este es un ejemplo de cómo usaría esta interfaz:

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);  
};  

Esta interfaz proporciona acceso sencillo a un conjunto de elementos establecedores que proceden de XML. Esta interfaz está disponible para las propiedades de una página mediante Settings()->Properties().

HRESULT Get(LPCTSTR propertyName, [out] LPBSTR pPropValue)

Este método recupera un valor de propiedad único. Véase la tabla 47 y la tabla 48.

Tabla 47. Valor de la propiedad Get de IHRESULT

Parámetro Descripción
propertyName Nombre de la propiedad que desea leer
pPropValue Al salir, contiene el valor de propiedad como una cadena (este valor será nullptr si no hay dicha propiedad).

Tabla 48. Resultados del valor de la propiedad Get de IHRESULT

[HRESULT] Descripción
S_OK Se recupera el valor de propiedad.
E_INVALIDARG No hay ninguna propiedad con el nombre que proporcionó.

ITaskManager (interfaz)

__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);  
}  

Esta interfaz la implementa el componente TaskManager (ID_TaskManager en ITaskManager.h), que es el componente que ejecuta tareas en la página preparatoria. Puede usar la página preparatoria directamente, que es lo que hace la mayor parte del tiempo, o bien crear su propia página, lo que permite que este componente realice la mayor parte del trabajo.

HRESULT Init(IWizardPageView *pPageView, int idListView, int idMessage, int idRetryButton, ISettingsProperties *pPageInfo, ITaskManagerCallback *pCallback)

Debe llamar a este método antes de llamar a cualquier otro método. Inicializa el componente TaskManager . Consulte la tabla 49.

Tabla 49. HRESULT Init

Parámetro Descripción
pPageView Proporciona acceso a la página que ejecutará tareas (esta página debe tener un conjunto específico de controles, que se describen en los parámetros siguientes).
idListView Identificador de control de un control ListView que mostrará la lista de tareas y el estado de esas tareas.
idMessage El identificador de control de un cuadro de texto que se usará para mostrar un mensaje para la tarea que seleccione.
idRetryButton El identificador de control de un botón en el que puede hacer clic para volver a ejecutar las tareas.
pPageInfo Un contenedor alrededor del XML de la página (TaskManager carga el conjunto de tareas que se van a ejecutar desde este XML).
pCallback Puede ser null (si este parámetro no es NULL, TaskManager llama al método Started cuando inicia una tarea y al método Finished para cada tarea que termina de ejecutarse).
HRESULT SetFailMessage(mensaje LPCWSTR)

Este método establece el mensaje que se mostrará si se produce un error en una o varias tareas.

HRESULT Start(void)

Este método inicia todas las tareas. Cada tarea se inicia en un subproceso independiente.

HRESULT GetTaskMessage(size_t index, LPBSTR message)

Este método es solo para uso interno. Recupera el mensaje actual de una tarea en función de su índice en la lista de tareas.

HRESULT GetResultType)(índice size_t, tipo LPBSTR)

Este método recupera el "tipo" actual de una tarea. En la tabla 50 se muestran los tipos disponibles.

Tabla 50. HRESULT GetResultType

Tipo Descripción
0 Representa una tarea que se realizó correctamente
1 Representa una tarea que devolvió una advertencia.
-1 Representa una tarea con errores

El tipo se recupera examinando el código de salida o error de la tarea y buscando una coincidencia en el elemento XML ExitCodes> de <la tarea.

HRESULT GetProperty(size_t index, LPCTSTR propertyName, LPBSTR value)

Las páginas de progreso y prefabricado usan este método para recuperar la propiedad establecedor BitmapFilename de modo que pueda mostrar una imagen junto al mensaje de la tarea que se resalta. En otras palabras, puede agregar un establecedor personalizado al XML de la tarea y, a continuación, recuperarlo con este método.

int GetSelectedIndex(void)

Este método recupera el índice de la tarea seleccionada actualmente, lo que resulta útil si desea recuperar información adicional sobre la tarea (vea el método GetProperty ) para mostrarla para la tarea seleccionada. Las páginas de progreso y prefabricado usan este método para mostrar una imagen para la tarea seleccionada.

HRESULT Wait(DWORD waitMilliseconds)

Este método ayuda principalmente con las pruebas unitarias para que la prueba pueda garantizar que las tareas finalicen antes de que se cierre la prueba unitaria. Normalmente no llamaría a este método. Devuelve cuando todas las tareas terminan de ejecutarse o el tiempo de espera ha transcurrido.

size_t FailedCount(void)

Este método devuelve el número de tareas marcadas actualmente como erróneas.

size_t WarningCount(void)

Este método devuelve el número de tareas marcadas actualmente como advertencia.

size_t SucceedCount(void)

Este método devuelve el número de tareas marcadas actualmente como correctas.

size_t RunningCount(void)

Este método devuelve el número de tareas que se están ejecutando actualmente.

void OnCommonControlEvent(WORD controlId, LPNMHDR pInfo)

Llame a este método desde OnCommonControlEvent de la página para que TaskManager pueda procesar los eventos que necesita.

void OnControlEvent(WORD eventId, WORD controlId)

Llame a este método desde OnControlEvent de la página para que TaskManager pueda procesar los eventos que necesita.

void EnableButtons(BOOL enable)

Este método es solo para uso interno.

IWizardComponent (interfaz)

__interface IWizardComponent : IUnknown  
{  
    HRESULT SetContainer(IWizardPageContainer *pContainer);  
};  
Información general

Normalmente, no implementará esta interfaz directamente, sino a través de la clase de plantilla WizardComponent . Si el componente implementa esta interfaz y ha registrado un generador de clases con el Registro, el componente recibe un puntero a la instancia de IWizardPageContainer cuando se crea. Esto le ayuda, por ejemplo, a acceder al registrador o al registro para crear otros componentes que el componente podría necesitar.

IWizardDialogController (interfaz)

__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);  
};  

Esta interfaz es solo para uso interno.

IWizardDialogView (interfaz)

__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);  
};  

Esta interfaz es solo para uso interno.

IWizardPage (interfaz)

__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);  
};  
Información general

Esta interfaz la implementa WizardPageImpl, por lo que normalmente no tendrá que implementarla usted mismo. El asistente llama a todos estos métodos cuando interactúa con las páginas personalizadas.

IWizardPageContainer (interfaz)

__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);  
};  
Información general

Esta interfaz está disponible para la página a través del método Container (implementado por WizardPageImpl) y proporciona acceso a varios servicios del asistente.

ILogger * Logger(void)

Use este método para escribir mensajes en el archivo de registro, por ejemplo:

Logger()->Verbose(s_component, L"Message for log file");  
IPropertyBag * Propiedades (void)

Este método proporciona acceso a variables de "memoria", que son propiedades que solo están en memoria mientras se ejecuta el Asistente para UDI. Estas propiedades están disponibles para otras páginas en el código o en el XML mediante la sintaxis $memoryVarName$ .

HRESULT CreateInstance(tipo LPCTSTR, [out] IUnknown **ppInstance)

Este método permite crear una nueva instancia de cualquier componente que se haya registrado. Sin embargo, es mejor usar la función de plantilla CreateInstance, ya que está fuertemente tipada.

HRESULT GetService(REFIID iid, [out] IUnknown **ppInstance)

Este método permite recuperar un servicio que se ha registrado. Sin embargo, es mejor llamar a la función de plantilla GetService , que está fuertemente tipada (en lugar de usar IUnknown).

HRESULT ReplaceVariables(LPCTSTR source, [out] LPBSTR pDest)

Este método controla el trabajo con variables dentro de valores de cadena. Admite los formatos que se muestran en las tablas 51 y 52.

Tabla 51. HRESULT ReplaceVariables

Format Descripción
$Name$ Reemplaza el valor de una variable de memoria por este nombre (si no hay ninguna variable de memoria con el nombre, se quitará el "token").
%Nombre% Una variable de secuencia de tareas o una variable de entorno. El orden es el siguiente:

1. Use el valor de una variable de secuencia de tareas, si está presente.
2. Use el valor de una variable de entorno, si está presente.
3. De lo contrario, quite este texto de la cadena.

Tabla 52. HRESULT (parámetro)

Parámetro Descripción
Source La cadena de entrada, que puede contener cualquier combinación de $ variables y % o ninguno en absoluto
pDest A la devolución, contiene una nueva cadena que tiene todos los tokens reemplazados según la tabla 51.
HRESULT GotoPage(LPCTSTR pageName)

Este método no se ha probado completamente. La idea es que puede cambiar directamente a una página específica en función del nombre de la página tal como se define en el archivo XML de .config. Al llamar a este método, se omite OnNextClicked en la página. Además, el comportamiento de este método está sujeto a cambios, por lo que úselo bajo su propio riesgo.

int ShowMessageBox(LPCTSTR message, LPCTSTR lpCaption, UINT uType)

Este método muestra un cuadro de mensaje con el texto y el título que proporcione. El parámetro uType es cualquier valor que se puede proporcionar a la función Win32 del cuadro de mensajes .

BOOL InPreview(void)

Este método devuelve TRUE si ha iniciado el asistente en modo "versión preliminar" proporcionando el modificador /preview . En el modo de vista previa, el botón Siguiente nunca está deshabilitado. Este método le permite omitir el código en modo de vista previa, por ejemplo, que podría causar problemas cuando no tiene datos válidos en la página.

HWND GetHwnd(void)

Este método devuelve el HWND del cuadro de diálogo principal. Use este método con cuidado. Por lo general, la interfaz de programación de aplicaciones del Asistente para UDI está diseñada para que nunca trabaje directamente con identificadores de ventana.

IWizardPageView (interfaz)

__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);  
};  

Esta interfaz está disponible para el código de la página a través del método View (implementado por WizardPageImpl).

HRESULT GetControlWrapper(int itemId, DialogControlTypes controlType, IUnknown *ppControl)

El Asistente para UDI usa contenedores, que son realmente fachadas para interactuar con los controles de la página. El uso de estas fachadas en lugar de los controles reales facilita mucho la escritura de pruebas para la página, ya que puede proporcionar fachadas ficticias a partir de las pruebas.

En lugar de usar este método directamente, es mejor usar el método de plantilla GetControlWrapper , que está fuertemente tipado, por ejemplo:

PComboBox m_pLanguagePackCombo;  
GetControlWrapper(View(), IDC_MY_COMBO, CONTROL_COMBO_BOX, &m_pCombo);  
HWND GetHwnd(void)

Este método devuelve el identificador de ventana de la página. Por lo general, no debe necesitar acceso a este identificador de ventana.

HWND GetControl(int itemId)

Si es necesario, puede llamar a este método para obtener el identificador de ventana de un control de la página. (Es mejor llamar a la función de plantilla GetControlWrapper ).

Mostrar HRESULT (void)

Este método es solo para uso interno.

HRESULT Hide(void)

Este método es solo para uso interno.

HRESULT Focus(int itemId)

Establezca el foco de entrada en un control específico.

IWizardPage * Page(void)

Este método es solo para uso interno.

IFormController * Form(void)

Este método es solo para uso interno.

HRESULT FocusWizardButton(botón WizardButtons)

Establece el foco en uno de los botones del asistente. WizardButtons tiene dos valores: BackButton y NextButton.

HRESULT SetEnable(WizardButtons button, BOOL enable)

Solicite que uno de los botones del asistente esté habilitado o deshabilitado. Es posible que el botón no coincida con el estado que solicita. Por ejemplo, si ejecuta el Asistente para UDI con el modificador /preview , los botones siempre estarán habilitados. WizardButtons tiene dos valores: BackButton y NextButton.

void ShowWarningMessage(LPCTSTR message)

Este método muestra un mensaje de advertencia en la parte inferior del área de contenido de la página. Este mensaje puede ser cualquier texto que desee.

void HideWarningMessage(void)

Ocultar un mensaje de advertencia que se muestra con una llamada a ShowWarningMessage.

IXmlDocument (interfaz)

__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);  
};  
Información general

Esta interfaz la implementa el componente ID_IXmlDocument , que es una fachada diseñada para facilitar el trabajo con documentos XML en C++.

HRESULT Load(LPCTSTR filename)

Este método carga un documento XML desde un archivo externo. Devuelve S_OK si el archivo se cargó sin errores o S_FALSE si se produjo un error. Cuando se produce un error, puede obtener el mensaje de error llamando a GetParseErrorMessage.

HRESULT LoadXml(LPCTSTR xml)

Este método carga un documento XML desde una cadena en lugar de un archivo externo. Aparte del origen para leer el XML, el comportamiento es el mismo que el método Load .

HRESULT Save(LPCWSTR filename)

Este método guarda el documento XML que está en memoria en un archivo externo.

HRESULT GetParseErrorMessage(LPBSTR pMessage)

Este método devuelve una nueva cadena con el mensaje de error al cargar el documento XML, si existe. Siempre devuelve S_OK.

HRESULT SelectNodes(LPCTSTR xpath, IXMLDOMNodeList **ppNodes)

Este método permite usar una expresión XPath para recuperar una colección de nodos del documento. Siempre devuelve S_OK.

HRESULT SelectSingleNode(LPCTSTR xpath, IXMLDOMNode **ppNode)

Este método permite usar una expresión XPath para recuperar un nodo del documento. Siempre devuelve S_OK.

HRESULT AddSchema(LPCTSTR filename, LPCTSTR ns)

Este método agrega el nombre de un archivo de esquema externo que se usará para validar el esquema del documento XML cuando se cargue. El espacio de nombres que proporcione es la cadena que puede usar en las consultas XPath, aunque no se ha probado.

HRESULT AddAttribute(IXMLDOMNode *pNode, LPCWSTR name, LPCWSTR value)

Este método agrega un nuevo atributo a un nodo existente en el documento XML. Consulte la tabla 53.

Tabla 53. HRESULT AddAttribute

Parámetro Descripción
pNode Nodo al que desea agregar un atributo
Nombre Nombre del nuevo atributo
Valor Valor del nuevo atributo
HRESULT CreateNode(DOMNodeType type, LPCWSTR name, LPCWSTR ns, IXMLDOMNode **ppNode)

Llame a este método para crear un nuevo nodo:

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

Una vez creado un nuevo nodo, puede agregarlo como un elemento secundario a otro nodo llamando al método appendChild del elemento primario.

Funciones auxiliares

CreateInstance (función de plantilla)

HRESULT CreateInstance(IWizardPageContainer *pContainer, LPCTSTR type, I **ppObject)  

Esta función se define en IWizardPageContainer.h y proporciona un contenedor con seguridad de tipos sobre el método IWizardPageContainer-CreateInstance>, por ejemplo:

CreateInstance<IDirectory>(Container(), ID_Directory, &pDirectory);  

Este código crea un nuevo componente ID_Directory para recuperar la interfaz IDirectory de ese componente.

Función de plantilla GetService

void GetService(IWizardPageContainer *pContainer, I **ppService)  

Esta función se define en IWizardPageContainer.h y proporciona un contenedor con seguridad de tipos a través del método IWizardPageContainer-GetService>, por ejemplo:

GetService<ITSVariableBag>(Container(), &pTsBag);  

Esta función recupera el componente de secuencia de tareas, que admite la interfaz ITSVariableBag . (Para ITSVariableBag, puede usar el método TSVariables de la clase WizardPageImpl , en su lugar).

Referencia del esquema del archivo de configuración del Diseñador del Asistente para UDI

El Diseñador del Asistente para UDI consume este archivo. Se crea un archivo independiente para cada archivo de .dll personalizado, que puede contener editores de páginas del asistente personalizados, tareas personalizadas o validadores personalizados. El archivo debe terminar con .config y residir en la carpeta installation_folder\Bin\Config (donde installation_folder es la carpeta en la que instaló MDT).

En la tabla 54 se enumeran los elementos del archivo de configuración del Diseñador del Asistente para UDI y sus descripciones. El elemento DesignerConfig es el nodo raíz de esta referencia.

Tabla 54. Elementos del archivo de configuración del Diseñador del Asistente para UDI y sus descripciones

Nombre del elemento Descripción
DesignerConfig Especifica la raíz de todos los demás elementos.
DesignerMappings Agrupa un conjunto de elementos Page
Page Especifica un editor de páginas del asistente que se va a cargar en el Diseñador del Asistente para UDI, que se usa para editar la configuración de una página del asistente.
Param Especifica un parámetro que se pasa al elemento primario Task o Validator y corresponde a un elemento Setter en el archivo de configuración del Asistente para UDI Nota: Los atributos de este elemento son diferentes si el elemento primario es el elemento Task o Validator .
Tarea Especifica una tarea dentro de la biblioteca de tareas.
TaskItem Especifica un grupo de parámetros que se pasan a la tarea.
TaskLibrary Agrupa un conjunto de elementos Task
Validador Especifica un validador dentro de la biblioteca de validadores.
ValidatorLibrary Agrupa un conjunto de elementos Validator

DesignerConfig

Este elemento especifica la raíz de todos los demás elementos.

Información de elementos

En la tabla 55 se proporciona información sobre el elemento DesignerConfig .

Tabla 55. Información del elemento DesignerConfig

Atributo Valor
Número de repeticiones Uno: Este elemento es necesario.
Elementos principales Ninguno
Contenido DesignerMappings, TaskLibrary, ValidatorLibrary
Atributos de elemento

Este elemento no tiene atributos.

Comentarios

Ninguno.

Ejemplo
<DesignerConfig>  
   + <TaskLibrary>  
   + <ValidatorLibrary>  
   + <DesignerMappings>  
</DesignerConfig>  

DesignerMappings

Este elemento agrupa un conjunto de elementos Page .

Información de elementos

La tabla 56 proporciona información sobre el elemento DesignerMappings .

Tabla 56. Información del elemento DesignerMappings

Atributo Valor
Número de repeticiones Cero o uno dentro del elemento DesignerConfig (este elemento es opcional si no hay ninguna página del asistente personalizado en el archivo DLL que corresponde a este archivo de configuración del Diseñador del Asistente para UDI).
Elementos principales DesignerConfig
Contenido Page
Atributos de elemento

Este elemento no tiene atributos.

Comentarios

Ninguno.

Ejemplo
<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

Este elemento especifica un editor de páginas del asistente que se cargará en el Diseñador del Asistente para UDI, que a su vez se usa para editar la configuración de una página del asistente.

Información de elementos

En la tabla 57 se proporciona información sobre el elemento Page .

Tabla 57. Información del elemento Page

Atributo Valor
Número de repeticiones Uno o más para cada página del asistente definida en el elemento DesignerMappings
Elementos principales DesignerMappings
Contenido Cualquier contenido XML bien formado
Atributos de elemento

En la tabla 58 se enumeran los atributos del elemento Page y una descripción para cada uno.

Tabla 58. Atributos y valores correspondientes para el elemento Page

Atributo Descripción
Descripción Especifica texto que proporciona información sobre el parámetro, que se muestra en el Diseñador del Asistente para UDI.
DesignerAssembly Especifica el nombre del archivo de .dll asociado al editor de páginas del asistente (el archivo .dll debe existir en la carpeta installation_folder\Bin (donde installation_folder es la carpeta en la que instaló MDT).
DesignerType Especifica el nombre del editor de páginas del asistente en el archivo .dll especificado en el atributo DesignerAssembly (este es el tipo de .NET Microsoft para el editor de páginas del asistente, con el espacio de nombres .NET completo Microsoft).
DisplayName Especifica el nombre descriptivo del editor de páginas, que se muestra en el Diseñador del Asistente para UDI.
Dll Especifica el nombre del archivo de .dll asociado a la página del asistente (el archivo .dll debe existir en la carpeta installation_folder\Templates\Distribution\Tools\platform (donde installation_folder es la carpeta en la que instaló MDT y la plataforma es x86 para la versión de 32 bits o x64 es para la versión de 64 bits). Nota: Asegúrese de que la arquitectura del procesador DLL coincide con la arquitectura del procesador MDT instalada. Por ejemplo, si instaló una versión de 32 bits de MDT, asegúrese de usar un archivo DLL de 32 bits para la página del asistente.
Image Especifica el nombre de una imagen de la página que está en formato portable network graphics (PNG) (el archivo .png debe existir en la carpeta installation_folder\Bin\Images (donde installation_folder es la carpeta en la que instaló MDT).
Tipo Especifica el editor de páginas del asistente y debe coincidir con el que se usó cuando se registró la página personalizada.
Comentarios

El Diseñador del Asistente para UDI usa el elemento Page como una plantilla para crear el XML inicial para un asistente nuevo. El Diseñador del Asistente para UDI realiza la validación de esquemas para asegurarse de que los elementos Page y secundarios tienen un formato válido. Este elemento proporciona una asignación entre el tipo de página del Asistente para UDI y la información que el Diseñador del Asistente para UDI necesita para editar y crear páginas de este tipo mediante un editor de páginas personalizado.

Ejemplo

Ninguno.

Param

Este elemento especifica un parámetro que se pasa al elemento primario Task o Validator y corresponde a un elemento Setter en el archivo de configuración del Asistente para UDI.

Nota:

Los atributos de este elemento son diferentes si el elemento primario es el elemento Task o Validator .

Información de elementos

En la tabla 59 se proporciona información sobre el elemento Param .

Tabla 59. Información del elemento Param

Atributo Valor
Número de repeticiones Uno o más para cada elemento primario TaskItem o Validator
Elementos principales TaskItem, Validator
Contenido Cualquier contenido XML bien formado
Atributos de elemento

En la tabla 60 se enumeran los atributos del elemento Param y se proporciona una descripción de cada uno.

Tabla 60. Atributos y valores correspondientes para el elemento Param

Atributo Descripción
Descripción Especifica texto que proporciona información sobre el parámetro, que se muestra en la nota del Diseñador del Asistente para UDI : Este atributo solo es válido para el elemento Validator .
DisplayName Especifica el nombre descriptivo del parámetro de validador, que se muestra para la página adecuada del Asistente para UDI en el Diseñador del Asistente para UDI (este nombre suele ser más descriptivo que el atributo Name ). Nota: Este atributo solo es válido para el elemento Validator .
Nombre Especifica el nombre del parámetro que se pasa a la tarea o validador, en función del elemento primario (este atributo se convertirá en el atributo Property de un elemento Setter en el archivo de configuración del Asistente para UDI). Nota: Este parámetro se usa para los elementos primarios TaskItem y Validator .
Comentarios

Ninguno.

Ejemplo

Ninguno.

Tarea

Este elemento especifica una tarea dentro de la biblioteca de tareas.

Información de elementos

En la tabla 61 se proporciona información sobre el elemento Task .

Tabla 61. Información del elemento Task

Atributo Valor
Número de repeticiones Uno o varios elementos del elemento TaskLibrary (este elemento no es opcional si se especifica el elemento TaskLibrary ).
Elementos principales TaskLibrary
Contenido TaskItem
Atributos de elemento

En la tabla 62 se enumeran los atributos del elemento Task y se proporciona una descripción de cada uno.

Tabla 62. Atributos y valores correspondientes para el elemento Task

Atributo Descripción
Descripción Especifica texto que proporciona información sobre la tarea, que se muestra en el Diseñador del Asistente para UDI.
Dll Especifica el nombre del archivo .dll asociado a la tarea (el archivo .dll debe existir en la carpeta installation_folder\Templates\Distribution\Tools\platform (donde installation_folder es la carpeta en la que instaló MDT y la plataforma es x86 para la versión de 32 bits o x64 para la versión de 64 bits).
Nombre Especifica el nombre de la tarea, que se muestra en la página del Asistente para UDI adecuada y en el Diseñador del Asistente para UDI.
Tipo Especifica el tipo de tarea, que se registra con el registro de fábrica y se usa para llamar a una tarea específica dentro de un archivo .dll.
Comentarios

Ninguno.

Ejemplo

Ninguno.

TaskItem

Este elemento especifica un grupo de parámetros que se pasan a la tarea.

Información de elementos

En la tabla 63 se proporciona información sobre el elemento TaskItem .

Tabla 63. Información del elemento TaskItem

Atributo Valor
Número de repeticiones Uno o más para cada elemento Task
Elementos principales Tarea
Contenido Param
Atributos de elemento

En la tabla 64 se enumeran los atributos del elemento TaskItem y se proporciona una descripción de cada uno.

Tabla 64. Atributo y valores correspondientes para el elemento TaskItem

Atributo Descripción
Tipo Especifica el tipo de elemento de que se creará en el archivo de configuración del Asistente para UDI. Se creará un elemento XML que corresponde al valor de este atributo. Por ejemplo, si el valor de este atributo es File, se creará un elemento File en el archivo de configuración del Asistente para UDI.

Actualmente, los únicos valores admitidos son:

- Archivo, que requiere dos elementos secundarios Param (un elemento secundario Param con el atributo Name establecido en Source y otro elemento secundario Param con el atributo Name establecido en Dest)
- Establecedor, que requiere un elemento secundario Param
Comentarios

Ninguno.

Ejemplo

Ninguno.

TaskLibrary

Este elemento agrupa un conjunto de elementos Task .

Información de elementos

La tabla 65 proporciona información sobre el elemento TaskLibrary .

Tabla 65. Información del elemento TaskLibrary

Atributo Valor
Número de repeticiones Cero o uno dentro del elemento DesignerConfig (este elemento es opcional si no hay ninguna tarea personalizada en el archivo DLL que se corresponda con este archivo de configuración del Diseñador del Asistente para UDI).
Elementos principales DesignerConfig
Contenido Tarea
Atributos de elemento

Este elemento no tiene atributos.

Comentarios

Ninguno.

Ejemplo
<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>  

Validador

Este elemento especifica un validador dentro de la biblioteca de validadores.

Información de elementos

En la tabla 66 se proporciona información sobre el elemento Validator .

Tabla 66. Información del elemento Validator

Atributo Valor
Número de repeticiones Cero o más en el elemento ValidatorLibrary (este elemento es opcional).
Elementos principales ValidatorLibrary
Contenido Param
Atributos de elemento

En la tabla 67 se enumeran los atributos del elemento Validator y se proporciona una descripción de cada uno.

Tabla 67. Atributos y valores correspondientes para el elemento Validator

Atributo Descripción
Descripción Especifica texto que proporciona información sobre el validador, que se muestra en el Diseñador del Asistente para UDI.
DisplayName Especifica el nombre descriptivo del validador que se muestra en el Diseñador del Asistente para UDI (este nombre suele ser más descriptivo que el atributo Name ).
Dll Especifica el nombre del archivo .dll asociado al validador (el archivo .dll debe existir en la carpeta installation_folder\Templates\Distribution\Tools\platform (donde installation_folder es la carpeta en la que instaló MDT y la plataforma es x86 para la versión de 32 bits o x64 para la versión de 64 bits).
Nombre Especifica el nombre del validador, que se muestra en la página correspondiente del Asistente para UDI y en el Diseñador del Asistente para UDI.
Tipo Especifica el tipo de validador, que se registra con el factor del Registro y se usa para llamar a un validador específico dentro de un archivo .dll.
Comentarios

Ninguno.

Ejemplo

Ninguno.

ValidatorLibrary

Este elemento agrupa un conjunto de elementos Validator .

Información de elementos

La tabla 68 proporciona información sobre el elemento ValidatorLibrary .

Tabla 68. Información del elemento ValidatorLibrary

Atributo Valor
Número de repeticiones Cero o uno dentro del elemento DesignerConfig (este elemento es opcional si no hay validadores personalizados en el archivo DLL que corresponden a este archivo de configuración del Diseñador del Asistente para UDI).
Elementos principales DesignerConfig
Contenido Validador
Atributos de elemento

Este elemento no tiene atributos.

Comentarios

Ninguno.

Ejemplo

<DesignerConfig> + <TaskLibrary> - <ValidatorLibrary> +<Validator DLL="" Description="Requires text in a field" Type="Microsoft. Wizard.Validation.NonEmpty" Name="NonEmpty"> +<Validator DLL="" Description="Doesn't allow certain characters to be in a field" Type="Microsoft. Wizard.Validation.InvalidChars" Name="InvalidChars"> +<Validator DLL="" Description="Debe seguir un patrón predefinido" Type="Microsoft. Wizard.Validation.RegEx" Name="NamedPattern"> +<Validator DLL="" Description="Require the contents match a regular expression" Type="Microsoft. Wizard.Validation.RegEx" Name="RegEx"></ValidatorLibrary> + <DesignerMappings></DesignerConfig>

Referencia del Diseñador del Asistente para UDI

Controles

Los controles que se usan para crear editores de páginas del asistente personalizados para su uso en el Diseñador del Asistente para UDI son instancias de UserControl de WPF. En la tabla 69 se enumeran los controles que puede usar para crear editores de páginas del asistente personalizados.

Tabla 69. Controles que se pueden usar para crear editores de páginas del Asistente para personalizar

Control Descripción
CollectionTControl Este control se usa para editar los datos almacenados en el elemento Data dentro de un elemento Page .
FieldElementControl Este control se usa para editar un campo, que normalmente está vinculado a un control TextBox en la página .xaml.
SetterControl Este control se usa para modificar el valor de un elemento establecedor en el archivo de configuración del Asistente para UDI.

CollectionTControl

Este control proporciona muchas funcionalidades para editar datos. La mejor manera de aprender a usar este control es examinar el ejemplo, que muestra cómo editar datos en el elemento Data de una página. En concreto, en el ejemplo se muestra cómo agregar, quitar y editar elementos en este control.

FieldElementControl

Use este control para editar un campo, que normalmente está vinculado a un control TextBox en la página .xaml.

Ejemplo

El siguiente extracto de un archivo .xaml muestra el uso de FieldElementControl para configurar el valor predeterminado de un campo en una página del asistente mediante un control TextBox secundario:

<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>  
Propiedades
FieldData

Esta propiedad de cadena contiene información para conectar FieldElementControl al XML subyacente del campo. La conexión se realiza a una propiedad de la interfaz del editor de páginas. En el extracto siguiente de un archivo .xaml se muestra el uso de la propiedad FieldData :

FieldData="{Binding DataContext.Location, ElementName=ControlRoot}"  

En este extracto, la interfaz del editor de páginas se denomina ControlRoot y se especifica en el parámetro ElementName . El enlace se realiza a la propiedad DataContext.Location de la interfaz del editor de páginas ControlRoot . DataContext es un modelo de vista que apunta al elemento Page dentro del archivo de configuración del Asistente para UDI. Location es una propiedad de la vista que devuelve una lista de las ubicaciones posibles y se define mediante un elemento Data dentro del archivo de configuración del Asistente para UDI. Cada ubicación se define mediante un elemento DataItem dentro del archivo de configuración del Asistente para UDI.

HeaderText

Esta propiedad de cadena permite especificar un encabezado para el control FieldElementControl . El encabezado actúa como un título para el control y tiene el formato de negrita y texto naranja que se muestra inmediatamente encima del control.

InstructionText

Esta propiedad de cadena permite especificar texto informativo para el control FieldElementControl . Normalmente, el texto se usa para proporcionar una breve descripción del campo y explicar cómo la configuración del campo afecta a la página del asistente correspondiente.

HideEnableButton

Esta propiedad booleana permite controlar la visibilidad del botón que cambia el estado entre Desbloqueado y Bloqueado (habilitado o deshabilitado). Si se establece en:

  • True, el botón no está visible

  • False, el botón está visible (este es el valor predeterminado).

HideDefaultTab

Esta propiedad booleana permite controlar la visibilidad de la sección que contiene el control usado para establecer el valor predeterminado. Aunque la propiedad hace referencia a una pestaña, no hay ninguna pestaña en FieldElementControl , sino una sección que se puede ocultar. Si se establece en:

  • True, la sección no está visible

  • False, la sección está visible (este es el valor predeterminado).

HideBorder

Esta propiedad booleana permite controlar la visibilidad del borde alrededor del control de campo. Si se establece en:

  • True, el borde no está visible

  • False, el borde es visible (este es el valor predeterminado).

HideImage

Esta propiedad booleana permite controlar la visibilidad de la imagen que configura la propiedad FieldImageSource . Si se establece en:

  • True, la imagen no está visible

  • False, la imagen es visible (este es el valor predeterminado).

HideValidationTab

Esta propiedad booleana permite controlar la visibilidad de la sección donde se administra la lista de validadores. Aunque la propiedad hace referencia a una pestaña, no hay ninguna pestaña en FieldElementControl , sino una sección que se puede ocultar. Si se establece en:

  • True, la sección no está visible

  • False, la sección está visible (este es el valor predeterminado).

HideSummaryTab

Esta propiedad booleana permite controlar la visibilidad de la sección en la que se configura el título de resumen del campo. El título y el valor correspondiente del campo se muestran en un tipo de página del Asistente para SummaryPage en un flujo de fase. Aunque la propiedad hace referencia a una pestaña, no hay ninguna pestaña en FieldElementControl , sino una sección que se puede ocultar. Si se establece en:

  • True, la sección no está visible

  • False, la sección está visible (este es el valor predeterminado).

HideTaskSequenceTab

Esta propiedad booleana permite controlar la visibilidad de la sección en la que se configura la variable de secuencia de tareas que corresponde al campo. Aunque la propiedad hace referencia a una pestaña, no hay ninguna pestaña en FieldElementControl , sino una sección que se puede ocultar. Si se establece en:

  • True, la sección no está visible

  • False, la sección está visible (este es el valor predeterminado).

SetterControl

Use este control para modificar el valor de un elemento Setter en el archivo de configuración del Asistente para UDI. Este control contiene un control secundario que se usa para modificar el valor del elemento establecedor .

Ejemplo

El siguiente extracto de un archivo .xaml muestra el uso de SetterControl para modificar un elemento Setter denominado KeyLocationSetter mediante un control TextBox secundario.

<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>  
Propiedades
SetterData

Debe enlazarlo a una propiedad del modelo de vista o vista que se conecta al establecedor. Esto es similar a cómo se enlazaría a un campo, como se describe para FieldElementControl.

HeaderText

Esta propiedad permite establecer el texto que aparecerá en el encabezado del control. Piense en esta propiedad como un título para el control; de forma predeterminada, aparece como texto naranja en negrita.

InstructionText

Establezca esta propiedad en el texto que desea que aparezca debajo del encabezado, normalmente texto de instrucción que indica al usuario del editor personalizado cuándo y por qué querría modificar el comportamiento del campo.

Interfaces

En la tabla 70 se enumeran las interfaces que puede usar para crear editores de páginas del asistente personalizados.

Tabla 70. Interfaces que se pueden usar para crear editores de páginas del Asistente personalizado

Interfaz Descripción
IDataService Use esta interfaz para conectar campos a los elementos Data del archivo de configuración del Asistente para UDI.
IMessageBoxService Esta interfaz proporciona acceso a los métodos que puede usar para mostrar cuadros de mensaje.

IDataService

Esta interfaz contiene varias propiedades y métodos, pero solo hay una propiedad que le gustaría necesitar. Esa propiedad es la única documentada aquí.

Puede usar la inserción de dependencias para obtener un puntero a esta interfaz mediante código como este en la clase :

[Dependency]  
public IDataService DataService { get; set; }  
Propiedades

En la tabla 71 se enumeran las propiedades de la interfaz IDataService .

Tabla 71. Propiedades de la interfaz IDataService

Interfaz Descripción
CurrentPage Esta propiedad proporciona acceso a los elementos, atributos y valores XML situados debajo del contexto de la página actual que se está editando en el archivo de configuración del Asistente para UDI.
CurrentPage
XElement CurrentPage { get; set; }  

Esta propiedad proporciona acceso al XML de la página actual. Nunca debe establecer esta propiedad, pero puede modificar el XML de la página. El editor de páginas de ejemplo muestra ejemplos de modificación del XML. Esta propiedad se usa principalmente cuando tiene datos personalizados. En el caso de los campos y propiedades (establecedores), puede usar controles precompilados que se encargan de todos los detalles.

IMessageBoxService

Esta interfaz proporciona acceso a los métodos que puede usar para mostrar cuadros de mensaje. Es posible que se pregunte por qué necesita una interfaz para mostrar un cuadro de mensaje. La realidad es que no: Microsoft usa esta interfaz con en el código, ya que ayuda a escribir pruebas automatizadas para las páginas del diseñador.

Sin embargo, el uso de estos métodos proporciona una ventaja útil: los cuadros de diálogo siempre tienen el "propietario" establecido en el Asistente para UDI, lo que garantiza que el cuadro de diálogo se agrupe correctamente con la ventana principal.

Puede usar la inserción de dependencias para obtener un puntero a esta interfaz mediante código como este en la clase :

[Dependency]  
public IMessageBoxService MessageBoxes { get; set; }  
Métodos

En la tabla 72 se enumeran los métodos de la interfaz IMessageBoxService .

Tabla 72. Métodos para la interfaz IMessageBoxService

Método Descripción
ShowMessageBox Este método sobrecargado se usa para mostrar un cuadro de mensaje con los miembros siguientes:

- ShowMessageBox(String message, String caption, MessageBoxImage icon)
- ShowMessageBox(string message, string caption, MessageBoxButton button, MessageBoxImage icon)
- ShowMessageBox(excepción de excepción)
ShowDialogWindow Use este método para crear un nuevo cuadro de diálogo.
ShowWizardWindow Use este método para mostrar un editor personalizado dentro de un cuadro de diálogo que incluye los botones Siguiente y Atrás para la navegación.
ShowMessageBox

Este método muestra un cuadro de mensaje que es un elemento secundario del editor de páginas del asistente personalizado. Este miembro está sobrecargado: la tabla 73 contiene una lista de los miembros y una breve descripción de cada uno. Para obtener información completa sobre cada miembro (incluida la sintaxis, el uso y los ejemplos), consulte la sección que corresponde a cada miembro.

Tabla 73. Miembros sobrecargados para el método ShowMessagBox

Member Descripción
ShowMessageBox(String message, String caption, MessageBoxImage icon) Muestra un cuadro de mensaje con un icono y un botón Aceptar
ShowMessageBox(string message, string caption, MessageBoxButton button, MessageBoxImage icon) Muestra un cuadro de mensaje con un icono y diferentes combinaciones posibles de botones
ShowMessageBox(excepción de excepción) Muestra un cuadro de mensaje que proporciona información sobre una excepción y tiene un botón Aceptar
ShowMessageBox(String message, String caption, MessageBoxImage icon)
void ShowMessageBox(String message, String caption, MessageBoxImage icon);  

Este método muestra un cuadro de mensaje con un botón Aceptar . Véase la tabla 74.

Tabla 74. Parámetros para el método ShowMessageBox(String message, String caption, MessageBoxImage icon)

Parámetro Descripción
message Mensaje que se va a mostrar en el área de contenido del cuadro de mensaje
caption Texto que se va a mostrar en la barra de título del cuadro de diálogo
icon Tipo de icono que se va a mostrar en el cuadro de mensaje
ShowMessageBox(string message, string caption, MessageBoxButton button, MessageBoxImage icon)
MessageBoxResult ShowMessageBox(string message, string caption, MessageBoxButton button, MessageBoxImage icon);  

Este método muestra un cuadro de mensaje con el conjunto de botones que desea que se muestre e informa del botón en el que ha hecho clic. Consulte la tabla 75.

Tabla 75. Parámetros para el método ShowMessageBox(string message, string caption, MessageBoxButton button, MessageBoxImage icon)

Parámetro Descripción
message Mensaje que se va a mostrar en el área de contenido del cuadro de mensaje
caption Texto que se va a mostrar en la barra de título del cuadro de diálogo
button Qué botones mostrar
icon Tipo de icono que se va a mostrar en el cuadro de mensaje
ShowMessageBox(excepción de excepción)
void ShowMessageBox(Exception exception);  

Este método muestra un cuadro de mensaje que informa de información sobre una excepción. Este cuadro de mensaje tiene un solo botón Aceptar . Consulte la tabla 76.

Tabla 76. Parámetros para el método ShowMessageBox(excepción de excepción)

Parámetro Descripción
Excepción La excepción que desea notificar (el cuadro de diálogo usa una excepción. Mensaje como contenido).
ShowDialogWindow
void ShowDialogWindow(Type viewType, DialogInteraction dialogPayload);  

Este método crea un nuevo cuadro de diálogo, cuyo contenido es el texto que se proporciona en el parámetro viewType . El Diseñador UDI crea una nueva instancia de este tipo y la encapsula en un cuadro de diálogo que tiene los botones Aceptar y Cancelar .

Los datos se pasan al control mediante el parámetro dialogPayload. La solución SampleEditor del directorio SDK tiene un ejemplo de cómo usar esta funcionalidad.

ShowWizardWindow
void ShowWizardWindow(Type viewType, DialogInteraction dialogPayload);  

Este método permite mostrar un editor personalizado dentro de un cuadro de diálogo que incluye los botones Siguiente y Atrás para la navegación. Microsoft no ha proporcionado un ejemplo para usar este método.

Referencia del esquema del archivo de configuración del Asistente para UDI

El Asistente para UDI consume este archivo y lo configura el Diseñador del Asistente para UDI. Este archivo se usa para configurar:

  • Páginas del asistente que se muestran en el Asistente para UDI

  • Secuencia de las páginas del asistente en el Asistente para UDI

  • Configuración de los campos de cada página del asistente

  • Grupos de fase disponibles en el Diseñador del Asistente para UDI

  • Fases disponibles en cada asistente de implementación en el Diseñador del Asistente para UDI

    77 enumera los elementos del archivo de configuración del Asistente para UDI y sus descripciones. El elemento Wizard es el nodo raíz de esta referencia.

Tabla 77. Elementos del archivo de configuración del Asistente para UDI y sus descripciones

Nombre del elemento Descripción
Datos Agrupa los elementos DataItem individuales dentro de un elemento Page y se denomina mediante el atributo Name .
Dataitem Agrupa los elementos Setter individuales dentro de un elemento Page . Puede crear datos jerárquicos incluyendo uno o varios elementos Data dentro de un elemento DataItem . Cada elemento DataItem representa un elemento individual. Por ejemplo, una lista de unidades disponibles podría tener un Objeto DataItem para el nombre para mostrar y otro elemento DataItem para la letra de unidad correspondiente.
Default Especifica un valor predeterminado para el campo especificado en el elemento primario Field o RadioGroup . El valor predeterminado se establece en el valor entre corchetes de este elemento.
Dll Especifica un archivo DLL que el Asistente para UDI y el Diseñador del Asistente para UDI deben cargar y al que se hará referencia.
Dll Agrupa los elementos DLL individuales.
Error Especifica un posible código de error que puede devolver una tarea. HRESULT de la tarea devuelve el valor del código de error y este elemento lo captura para proporcionar información de error más específica.
ExitCode Especifica un posible código de salida para una tarea. Los códigos de salida son códigos de retorno que la tarea espera. Cree un elemento ExitCode para cada código de salida posible. De lo contrario, puede especificar un asterisco (*) en el atributo Value para controlar los códigos devueltos que no aparecen en otros elementos ExitCode .
ExitCodes Agrupa un conjunto de elementos ExitCode y Error para un elemento Task o un elemento Error .
Field Especifica una instancia de un control en un elemento Page que se usa para proporcionar personalización con XML. No todos los controles permiten la personalización con XML, solo los controles que usan el elemento Field .
Fields Agrupa los elementos Field individuales dentro de un elemento Page .
Archivo Especifica el origen y el destino de una operación de copia de archivos mediante el Microsoft. Tipo de tarea Wizard.CopyFilesTask. Puede incluir un elemento File independiente para copiar más de un archivo en una sola tarea.
Page Especifica una instancia de una página e incluye todas las opciones de configuración de la página.
Pageref Especifica una referencia a una instancia de una página dentro de una fase dentro de un StageGroup.
Pages Agrupa los elementos Page individuales.
RadioGroup Especifica un grupo de botones de radio dentro de un elemento Field .
StageGroup Especifica un grupo de una o varias fases.
StageGroups Agrupa un conjunto de grupos de fases dentro de un archivo de configuración del Asistente para UDI.
Setter Especifica un valor de propiedad de un valor para una propiedad denominada en la propiedad Property .
Fase Especifica una fase dentro de un StageGroup y contiene uno o varios elementos PageRef .
Estilo Agrupa los elementos de establecedor individuales que configuran la apariencia del Asistente para UDI, incluido el título que se muestra en la parte superior del asistente y la imagen de banner que se muestra en el Asistente para UDI.
Tarea Especifica una tarea que se va a ejecutar en la página especificada en el elemento primario Page .
Tasks Agrupa un conjunto de tareas para un elemento Page .
Validador Especifica un validador para el control de campo especificado en el elemento field primario.
Asistente Especifica la raíz de todos los demás elementos.

Datos

Este elemento agrupa los elementos DataItem individuales dentro de un elemento Page y recibe el nombre del atributo Name .

Información de elementos

En la tabla 78 se proporciona información sobre el elemento Data .

Tabla 78. Información del elemento Data

Atributo Valor
Número de repeticiones Cero o más dentro de cada elemento Page (este elemento es opcional).
Elementos principales Page, DataItem
Contenido DataItem, Setter
Atributos de elemento

En la tabla 79 se enumeran los atributos del elemento Data y se proporciona una descripción de cada uno.

Tabla 79. Atributos y valores correspondientes para el elemento Data

Atributo Descripción
Name Especifica el nombre del elemento Data
Comentarios

El atributo Name permite que el código recupere un conjunto específico de datos.

Ejemplo

Ninguno.

Dataitem

Este elemento agrupa los elementos Setter individuales dentro de un elemento Page . Puede crear datos jerárquicos incluyendo uno o varios elementos Data dentro de un elemento DataItem . Cada elemento DataItem representa un elemento individual. Por ejemplo, una lista de unidades disponibles podría tener un Objeto DataItem para el nombre para mostrar y otro elemento DataItem para la letra de unidad correspondiente.

Información de elementos

La tabla 80 proporciona información sobre el elemento DataItem .

Tabla 80. Información del elemento DataItem

Atributo Valor
Número de repeticiones Cero o más dentro de cada elemento Data (este elemento es opcional).
Elementos principales Datos
Contenido Datos, establecedor
Atributos de elemento

Este elemento no tiene atributos.

Comentarios

Ninguno.

Ejemplo

Ninguno.

Predeterminada

Este elemento especifica un valor predeterminado para el campo especificado en el elemento primario Field o RadioGroup . El valor predeterminado se establece en el valor entre corchetes de este elemento.

Información de elementos

En la tabla 81 se proporciona información sobre el elemento Default .

Tabla 81. Información de elemento predeterminada

Atributo Valor
Número de repeticiones Cero o más dentro de un elemento Field o RadioGroup (este elemento es opcional).
Elementos principales Field, RadioGroup
Contenido Puede ser cualquier contenido XML con formato correcto, pero normalmente es texto estándar.
Atributos de elemento

Este elemento no tiene atributos.

Comentarios

Ninguno.

Ejemplo

En el ejemplo siguiente, el valor predeterminado del campo Zona horaria se establece en "Hora estándar del Pacífico":

<Field Name="TimeZone" Enabled="true" VarName="OSDTimeZone" Summary="Time Zone:">  
  <Default>Pacific Standard Time</Default>  

Dll

Este elemento especifica un archivo DLL para que el Asistente para UDI y el Diseñador del Asistente para UDI se carguen y hagan referencia a él.

Información de elementos

En la tabla 82 se proporciona información sobre el elemento DLL .

Tabla 82. Información del elemento DLL

Atributo Valor
Número de repeticiones Uno o varios elementos del elemento DLL
Elemento principal Dll
Contenido No se permite ningún contenido para este elemento
Atributos de elemento

En la tabla 83 se enumeran los atributos del elemento DLL y se proporciona una descripción de cada uno.

Tabla 83. Atributos y valores correspondientes para el elemento DLL

Atributo Descripción
Nombre Especifica el nombre del archivo DLL para que haga referencia al Asistente para UDI y al Diseñador del Asistente para UDI.
Comentarios

Ninguno.

Ejemplo
<DLLs>  
  <DLL Name="OSDRefreshWizard.dll" />   
  <DLL Name="SharedPages.dll" />  
</DLLs>  

Dll

Este elemento agrupa los elementos DLL individuales.

Información de elementos

En la tabla 84 se proporciona información sobre el elemento DLL .

Tabla 84. Información del elemento DLL

Atributo Valor
Número de repeticiones Una
Elementos principales Asistente
Contenido Dll
Atributos de elemento

Este elemento no tiene atributos.

Comentarios

Ninguno.

Ejemplo
<DLLs>  
   <DLL Name="OSDRefreshWizard.dll" />  
   <DLL Name="SharedPages.dll" />   
</DLLs>  

Error

Este elemento especifica un posible código de error que puede devolver una tarea. HRESULT de la tarea devuelve y captura el valor del código de error para proporcionar información de error más específica.

Información de elementos

En la tabla 85 se proporciona información sobre el elemento Error .

Tabla 85. Información del elemento Error

Atributo Valor
Número de repeticiones Cero o más dentro de cada elemento ExitCode (este elemento es opcional).
Elementos principales ExitCodes
Contenido Cualquier contenido XML bien formado
Atributos de elemento

En la tabla 86 se enumeran los atributos del elemento Error y se proporciona una descripción de cada uno de ellos.

Tabla 86. Información del elemento Error

Atributo Descripción
State Especifica el estado devuelto de una tarea que encontró un error. Normalmente, el valor de este atributo se establece en Error. Este valor se muestra en la columna Estado de la página del asistente del Asistente para UDI.
Texto Especifica el texto descriptivo sobre la condición de error que encontró la tarea.
Tipo Especifica si este elemento representa un error, una advertencia o un éxito. El valor especificado enType debe ser único dentro de un elemento ExitCodes . Los siguientes son valores válidos para este elemento:

- 0.El elemento representa un éxito.
- 1. El elemento representa una advertencia.
- -1. El elemento representa un error.
Valor Especifica el valor del código que la tarea devolvió como un valor numérico. Especificar el valor de un asterisco (*) indica el elemento predeterminado para los códigos de retorno que no aparecen en otros elementos Error .
Comentarios

Ninguno.

Ejemplo

Ninguno.

ExitCode

Este elemento especifica un posible código de salida para una tarea. Los códigos de salida son códigos de retorno que la tarea espera. Cree un elemento ExitCode para cada código de salida posible. De lo contrario, puede especificar un asterisco (*) en el atributo Value para controlar los códigos devueltos que no aparecen en otros elementos ExitCode .

Información de elementos

La tabla 87 proporciona información sobre el elemento ExitCode .

Tabla 87. Información del elemento ExitCode

Atributo Valor
Número de repeticiones Cero o más dentro de cada elemento ExitCodes (este elemento es opcional).
Elementos principales ExitCodes
Contenido Al menos un elemento ExitCode y cero o más elementos Error
Atributos de elemento

En la tabla 88 se enumeran los atributos del elemento ExitCode y se proporciona una descripción de cada uno.

Tabla 88. Atributos y valores correspondientes para el elemento ExitCode

Atributo Descripción
State Especifica el estado devuelto de una tarea. El valor de este atributo se muestra en la columna Estado de la página del asistente correspondiente del Asistente para UDI. Puede usar cualquier valor para este atributo que sea significativo para la tarea. A continuación se muestran los valores típicos que se usan para este atributo:

-Éxito
-Advertencia
-Error
Texto Especifica el texto descriptivo sobre el código existente de la tarea.
Tipo Especifica si este elemento representa un error, una advertencia o un éxito. El valor especificado en type debe ser único dentro de un elemento ExitCodes . Los siguientes son valores válidos para este elemento:

- 0. El elemento representa un éxito.
- 1. El elemento representa una advertencia.
- -1. El elemento representa un error.
Valor Especifica el valor del código que la tarea devolvió como un valor numérico. Especificar el valor de un asterisco (*) indica el elemento predeterminado para los códigos de retorno que no aparecen en otros elementos ExitCode .
Comentarios

Ninguno.

Ejemplo

Ninguno.

ExitCodes

Este elemento agrupa un conjunto de elementos ExitCode y Error para un elemento Task o Error .

Información de elementos

La tabla 89 proporciona información sobre el elemento ExitCodes .

Tabla 89. Información del elemento ExitCodes

Atributo Valor
Número de repeticiones Uno dentro de cada elemento Task
Elementos principales Tarea
Contenido Error, ExitCode
Atributos de elemento

Este elemento no tiene atributos.

Comentarios

Ninguno.

Ejemplo

Ninguno.

Campo

Este elemento especifica una instancia de un control en un elemento Page que se usa para proporcionar personalización con XML. No todos los controles permiten la personalización con XML, solo los controles que usan el elemento Field .

Información de elementos

En la tabla 90 se proporciona información sobre el elemento Field .

Tabla 90. Información del elemento Field

Atributo Valor
Número de repeticiones Cero o más dentro de cada elemento Field (este elemento es opcional).
Elementos principales Fields
Contenido Valor predeterminado, validador
Atributos de elemento

En la tabla 91 se enumeran los atributos del elemento Field y se proporciona una descripción de cada uno.

Tabla 91. Atributos y valores correspondientes para el elemento Field

Atributo Descripción
Enabled Especifica si el campo está habilitado para la entrada del usuario (el atributo se puede establecer en True o False).
Nombre Especifica el nombre del campo.
Resumen Especifica el texto descriptivo que se muestra en la página del Asistente para resumen para el valor que establece este campo.
Varname Especifica el nombre de la variable de secuencia de tareas leído o configurado mediante el campo del elemento primario Field .
Comentarios

Este elemento puede contener cero o más elementos Default y cero o más elementos Validator .

Ejemplo

Ninguno.

Fields

Este elemento agrupa los elementos Field individuales dentro de un elemento Page .

Información de elementos

En la tabla 92 se proporciona información sobre el elemento Fields .

Tabla 92. Información del elemento Fields

Atributo Valor
Número de repeticiones Cero o más dentro de cada elemento Page (este elemento es opcional).
Elementos principales Page
Contenido Field, RadioGroup
Atributos de elemento

Este elemento no tiene atributos.

Comentarios

Ninguno.

Ejemplo

Ninguno.

Archivo

Este elemento especifica el origen y el destino de una operación de copia de archivos mediante el Microsoft. Tipo de tarea Wizard.CopyFilesTask. Puede incluir un elemento File independiente para copiar más de un archivo en una sola tarea.

Información de elementos

En la tabla 93 se proporciona información sobre el elemento File .

Tabla 93. Información del elemento File

Atributo Valor
Número de repeticiones Uno o más para cada tarea que tiene un tipo de tarea de Microsoft. Wizard.CopyFilesTask
Elementos principales Tarea
Contenido Ninguno
Atributos de elemento

En la tabla 94 se enumeran los atributos del elemento File y se proporciona una descripción de cada uno.

Tabla 94. Atributos y valores correspondientes para el elemento File

Atributo Descripción
Dest Especifica la ruta de acceso completa o relativa a la carpeta de destino del archivo especificado en el atributo Source . Las variables de entorno se permiten como parte de la ruta de acceso.
Source Especifica la ruta de acceso completa o relativa al archivo de origen que Microsoft. Copias del tipo de tarea Wizard.CopyFilesTask. Este atributo admite caracteres comodín para que se puedan copiar varios archivos mediante un único elemento File . Las variables de entorno se permiten como parte de la ruta de acceso.
Comentarios

Ninguno.

Ejemplo

Ninguno.

Page

Este elemento especifica una instancia de una página e incluye todas las opciones de configuración de la página.

Información de elementos

En la tabla 95 se proporciona información sobre el elemento Page .

Tabla 95. Información del elemento Page

Atributo Valor
Número de repeticiones Uno o más dentro de cada elemento Pages
Elementos principales Pages
Contenido Datos, campos, establecedor, tareas
Atributos de elemento

En la tabla 96 se enumeran los atributos del elemento Page y se proporciona una descripción de cada uno.

Tabla 96. Atributos y valores correspondientes para el elemento Page

Atributo Descripción
DisplayName Especifica el nombre descriptivo de la página del asistente que se muestra en el Diseñador del Asistente para UDI. Este nombre suele ser más descriptivo que el atributo Name .
Nombre Especifica el nombre de la página del asistente que se muestra en el Diseñador del Asistente para UDI.
Tipo Especifica el tipo de página del asistente que se relaciona directamente con una página específica del asistente dentro de un archivo DLL.
Comentarios

Ninguno.

Ejemplo

Ninguno.

Pageref

Este elemento especifica una referencia a una instancia de una página dentro de una fase dentro de un StageGroup.

Información de elementos

En la tabla 97 se proporciona información sobre el elemento PageRef .

Tabla 97. Información del elemento PageRef

Atributo Valor
Número de repeticiones Uno o más dentro de un elemento Stage
Elementos principales Fase
Contenido Ninguno
Atributos de elemento

En la tabla 98 se muestra el atributo del elemento PageRef y se proporciona una descripción del mismo.

Tabla 98. Atributos y valores correspondientes para el elemento PageRef

Atributo Descripción
Page Especifica la instancia de una página dentro de una fase dentro de un StageGroup. Establezca este valor en el atributo Name de un elemento Page .
Comentarios

Ninguno.

Ejemplo

Ninguno.

Páginas

Este elemento agrupa los elementos Page individuales.

Información de elementos

En la tabla 99 se proporciona información sobre el elemento Pages .

Tabla 99. Información del elemento Pages

Atributo Valor
Número de repeticiones Una
Elementos principales Asistente
Contenido Page
Atributos de elemento

Este elemento no tiene atributos.

Comentarios

Ninguno.

Ejemplo
<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

Este elemento especifica un grupo de botones de radio con en un elemento Field .

Información de elementos

La tabla 100 proporciona información sobre el elemento RadioGroup .

Tabla 100. Información del elemento RadioGroup

Atributo Valor
Número de repeticiones Cero o más dentro de un elemento Fields (este elemento es opcional).
Elementos principales Fields
Contenido Default
Atributos de elemento

En la tabla 101 se enumeran los atributos del elemento RadioGroup y se proporciona una descripción de cada uno.

Tabla 101. Atributos y valores correspondientes para el elemento RadioGroup

Atributo Descripción
Locked Especifica si el grupo de botones de radio está habilitado para la entrada del usuario. El atributo se puede establecer en:

- True. Especifica que los botones de radio están deshabilitados y los usuarios no pueden seleccionar un botón de radio en el grupo.
- False. Especifica que los botones de radio están habilitados y los usuarios pueden seleccionar un botón de radio en el grupo.
Nombre Especifica el nombre del grupo de opciones de radio.
Comentarios

Ninguno.

Ejemplo

Ninguno.

StageGroup

Este elemento especifica un grupo de fases de implementación.

Información de elementos

La tabla 102 proporciona información sobre el elemento StageGroup .

Tabla 102. Información del elemento StageGroup

Atributo Valor
Número de repeticiones Uno o más dentro de un elemento StageGroups
Elementos principales StageGroups
Contenido Fase
Atributos de elemento

En la tabla 103 se enumeran los atributos del elemento StageGroup y una descripción del atributo.

Tabla 103. Atributos y valores correspondientes para el elemento StageGroup

Atributo Descripción
DisplayName Especifica el nombre descriptivo del grupo de fases que se muestra en el Diseñador del Asistente para UDI. Este nombre suele ser más descriptivo que el atributo Name .
Comentarios

Ninguno.

Ejemplo

Ninguno.

StageGroups

Este elemento agrupa un conjunto de grupos de fases dentro de un archivo de configuración del Asistente para UDI.

Información de elementos

En la tabla 104 se proporciona información sobre el elemento StageGroups .

Tabla 104. Información del elemento StageGroups

Atributo Valor
Número de repeticiones Cero o uno dentro de un elemento Wizard
Elementos principales Asistente
Contenido StageGroup
Atributos de elemento

Este elemento no tiene atributos.

Comentarios

Ninguno.

Ejemplo

Ninguno.

Setter

Este elemento especifica un valor de propiedad para el valor de una propiedad denominada en la propiedad Property .

Información de elementos

La tabla 105 proporciona información sobre el elemento Setter .

Tabla 105. Información del elemento Setter

Atributo Valor
Número de repeticiones Cero o más dentro de cada elemento primario (este elemento es opcional).
Elementos principales Data, DataItem, Page, Style, Task, Validator
Contenido Contiene un valor de cadena en el atributo Property
Atributos de elemento

En la tabla 106 se muestra el atributo del elemento Setter y se proporciona una descripción del mismo.

Tabla 106. Atributos y valores correspondientes para el elemento Setter

Atributo Descripción
Propiedad Especifica el nombre de propiedad que se va a establecer. El nombre de la propiedad se establece en el valor que este atributo corchetes.
Comentarios

Ninguno.

Ejemplo

Ninguno.

Etapa

Este elemento especifica un elemento Stage dentro de un StageGroup y contiene uno o varios elementos PageRef .

Información de elementos

En la tabla 107 se proporciona información sobre el elemento Stage .

Tabla 107. Información del elemento Stage

Atributo Valor
Número de repeticiones Uno o más dentro de un elemento StageGroup
Elementos principales StageGroup
Contenido Pageref
Atributos de elemento

En la tabla 108 se enumeran los atributos del elemento Stage y se proporciona una descripción de cada uno de ellos.

Tabla 108. Atributos y valores correspondientes para el elemento Stage

Atributo Descripción
DisplayName Especifica el nombre descriptivo de la página del asistente que se muestra en el Diseñador del Asistente para UDI. Este nombre suele ser más descriptivo que el atributo Name .
Nombre Especifica el nombre de la fase. El valor de este elemento se usa al iniciar el Asistente para UDI con el parámetro de línea de comandos /stage: name .
Comentarios

Ninguno.

Ejemplo

Ninguno.

Estilo

Este elemento agrupa los elementos setter individuales que configuran la apariencia del Asistente para UDI, incluido el título que se muestra en la parte superior del asistente y la imagen de banner que se muestra en el Asistente para UDI.

Información de elementos

En la tabla 109 se proporciona información sobre el elemento Style.

Tabla 109. Información del elemento Style

Atributo Valor
Número de repeticiones Una
Elementos principales Asistente
Contenido Setter
Atributos de elemento

Este elemento no tiene atributos.

Comentarios

Ninguno.

Ejemplo
<Style>  
  <Setter Property="bannerFilename">UDI_Wizard_Banner.bmp</Setter>   
  <Setter Property="title">Operating System Deployment (OSD) Refresh Wizard</Setter>   
</Style>  

Tarea

Este elemento especifica una tarea que se va a ejecutar en la página especificada en el elemento primario Page .

Información de elementos

En la tabla 110 se proporciona información sobre el elemento Task .

Tabla 110. Información del elemento Task

Atributo Valor
Número de repeticiones Uno o más dentro de un elemento Tasks
Elementos principales Tasks
Contenido ExitCodes, File, Setter
Atributos de elemento

En la tabla 111 se enumeran los atributos del elemento Task y se proporciona una descripción de cada uno.

Tabla 111. Atributos y valores correspondientes para el elemento Task

Atributo Descripción
Depende Especifica si la tarea depende de otra tarea. El valor de este atributo se establece en el atributo Name de otro elemento Task . Nota: Este atributo no se puede configurar mediante el Diseñador del Asistente para UDI. Sin embargo, puede agregar manualmente este atributo a un elemento Task modificando directamente el archivo .xml.
DisplayName Especifica el nombre descriptivo de la tarea que se muestra en el Diseñador del Asistente para UDI. Este nombre suele ser más descriptivo que el atributo Name .
Nombre Especifica el nombre de la tarea. Este nombre debe ser único.
Tipo Especifica el tipo de tarea para la tarea que se va a ejecutar, que se define en el archivo DLL que contiene la tarea.
Comentarios

Ninguno.

Ejemplo

Ninguno.

Tareas

Este elemento agrupa un conjunto de tareas para un elemento Page .

Información de elementos

En la tabla 112 se proporciona información sobre el elemento Tasks .

Tabla 112. Información del elemento Tasks

Atributo Valor
Número de repeticiones Cero o uno dentro de cada elemento Page (este elemento es opcional).
Elementos principales Page
Contenido Tarea
Atributos de elemento

En la tabla 113 se enumeran los atributos del elemento Tasks y se proporciona una descripción de cada uno.

Tabla 113. Atributos y valores correspondientes para el elemento Tasks

Atributo Descripción
NameTitle Especifica el título que aparece en la parte superior de la columna que contiene el nombre de las tareas en la página del asistente adecuada.
StatusTitle Especifica el título que aparece en la parte superior de la columna que contiene el estado de las tareas en la página del asistente adecuada.
Comentarios

Ninguno.

Ejemplo

Ninguno.

Validador

Este elemento especifica un validador para el control de campo especificado en el elemento primario Field .

Información de elementos

En la tabla 114 se proporciona información sobre el elemento Validator .

Tabla 114. Información del elemento Validator

Atributo Valor
Número de repeticiones Cero o uno dentro de un elemento Field
Elementos principales Field
Contenido Setter
Atributos de elemento

En la tabla 115 se muestra el atributo del elemento Validator y se proporciona una descripción del mismo.

Tabla 115. Atributos y valores correspondientes para el elemento Validator

Atributo Descripción
Tipo Especifica el tipo del validador, que se define en el archivo DLL que contiene el validador.
Comentarios

Ninguno.

Ejemplo

Ninguno.

Asistente

Este elemento especifica la raíz de todos los demás elementos.

Información de elementos

En la tabla 116 se proporciona información sobre el elemento Wizard .

Tabla 116. Información de elemento del asistente

Atributo Valor
Número de repeticiones Una
Elementos principales Ninguno
Contenido ARCHIVOS DLL, Páginas, Grupos de fases, Estilo
Atributos de elemento

Este elemento no tiene atributos.

Comentarios

Ninguno.

Ejemplo
<Wizard>  
   + <DLLs>  
   + <Style>  
   + <Pages>  
   + <StageGroups>  
</Wizard>