Installation pilotée par l’utilisateur - Guide du développeur

L’installation pilotée par l’utilisateur (UDI) permet de simplifier le déploiement des systèmes d’exploitation clients Windows®, tels que Windows 8.1, sur les ordinateurs à l’aide de la fonctionnalité de déploiement de système d’exploitation (OSD) dans Microsoft® System Center 2012 R2 Configuration Manager. UDI fait partie de Microsoft Deployment Toolkit (MDT).

Introduction

En règle générale, lors du déploiement de systèmes d’exploitation à l’aide de la fonctionnalité OSD, vous devez fournir toutes les informations nécessaires au déploiement du système d’exploitation. Les informations sont configurées dans des fichiers de configuration ou dans des bases de données (telles que le fichier CustomSettings.ini ou la base de données MDT [MDT DB]). Vous devez fournir tous les paramètres de configuration avant de pouvoir lancer le déploiement.

UDI fournit une interface pilotée par un assistant qui vous permet de fournir des informations de configuration immédiatement avant d’effectuer le déploiement. Ce comportement vous permet de créer des séquences de tâches OSD génériques, puis de fournir des informations spécifiques à l’ordinateur au moment du déploiement, ce qui offre une plus grande flexibilité dans le processus de déploiement.

Public cible

Ce guide est destiné aux développeurs qui créent des pages d’assistant personnalisées pour l’assistant UDI et des éditeurs de page d’assistant personnalisés pour le Designer de l’assistant UDI. Ce guide suppose que vous êtes familiarisé avec le développement d’applications Windows à l’aide :

  • C++, utilisé pour créer des pages d’Assistant personnalisées

  • Microsoft .NET Framework, utilisé pour créer des éditeurs de page d’Assistant personnalisés

  • Windows Presentation Foundation (WPF), utilisé pour créer des éditeurs de page d’Assistant personnalisés

  • Langages pris en charge par WPF, tels que C#, C++ ou Microsoft Visual Basic® .NET, qui sont utilisés pour créer des éditeurs de page d’Assistant personnalisés

À propos de ce guide

Ce guide fournit les informations de référence nécessaires pour vous aider à personnaliser UTI pour votre organisation. Ce guide n’aborde pas de sujets administratifs ou opérationnels, tels que l’installation de MDT (qui inclut UDI), la configuration d’UDI pour déployer des systèmes d’exploitation et des applications, ou l’exécution de déploiements à l’aide de l’assistant UDI. Pour plus d’informations sur ces rubriques, consultez les rubriques UDI dans Utilisation de Microsoft Deployment Toolkit, qui est incluse dans MDT.

Vue d’ensemble du développement UDI

Le développement UDI vous permet d’étendre les fonctionnalités fournies par UDI. En règle générale, le développement UDI est nécessaire lorsque vous souhaitez collecter des informations supplémentaires que le processus de déploiement UDI consomme. Ces informations supplémentaires sont généralement enregistrées sous forme de variables de séquence de tâches lues par les étapes de séquence de tâches d’une séquence de tâches UDI dans Configuration Manager.

UDI Architecture

L’objectif général du développement UDI est de créer des pages d’assistant personnalisées qui peuvent être affichées dans l’assistant UDI. En créant des pages d’assistant personnalisées, vous pouvez étendre les fonctionnalités existantes d’UDI pour répondre aux exigences commerciales et techniques de votre organisation. Une page d’Assistant personnalisée collecte des informations en plus ou à la place des pages d’Assistant fournies par UDI.

La figure 1 illustre la relation entre le UDI Wizard Designer et l’UDI Wizard.

Graphique 1. Relation entre l’assistant UDI et l’assistant UDI Designer figure 1. Relation entre l’assistant UDI et l’assistant UDI Designer

Figure 1. Relation entre l’assistant UDI et l’assistant UDI Designer

Au niveau conceptuel, le développement de l’UDI comprend la création de :

  • Pages d’Assistant personnalisées. Les pages de l’assistant sont affichées dans l’assistant UDI et collectent les informations requises pour terminer le processus de déploiement. Vous créez des pages d’Assistant à l’aide de C++ dans Microsoft Visual Studio®. Les pages d’Assistant personnalisées sont implémentées sous forme de DLL lues par l’Assistant UDI. Le kit de développement logiciel (SDK) UDI inclut un exemple de création de pages d’assistant personnalisées.

  • Éditeurs de page d’Assistant personnalisés. Les éditeurs de page de l’Assistant vous permettent de configurer le comportement de votre page de l’Assistant personnalisé. Les éditeurs de page de l’Assistant personnalisé sont implémentés sous forme de DLL que le Designer de l’Assistant UDI lit. Vous créez des éditeurs de page Assistant à l’aide de :

    • WPF version 4.0

    • Microsoft Prism version 4.0

    • Microsoft Unity Application Block (Unity) version 2.1

      MDT comprend tous les assemblys nécessaires pour créer un éditeur de page d’assistant personnalisé à utiliser dans l’assistant UDI Designer. Le SDK UDI inclut un exemple de création d’éditeurs de page d’assistant personnalisés.

    De plus, le Designer de l’assistant UDI utilise les fichiers de configuration de l’éditeur de page de l’assistant de prise en charge. Vous créez les fichiers de configuration de l’Assistant Éditeur de page dans le cadre du processus de création de vos pages d’Assistant personnalisées et de vos éditeurs de page d’Assistant personnalisés. L’assistant UDI crée Designer les informations XML nécessaires dans le fichier de configuration de l’assistant UDI et le fichier .app correspondant.

Préparation de l’environnement de développement UDI

Avant de commencer à créer vos propres pages d’assistant et éditeurs de page d’assistant personnalisés, effectuez les étapes suivantes pour préparer l’environnement de développement UDI :

  1. Préparez les prérequis de l’environnement de développement UDI comme décrit dans Préparer les prérequis de l’environnement de développement UDI.

  2. Configurez l’environnement de développement UDI comme décrit dans Configurer l’environnement de développement UDI.

  3. Vérifiez que l’environnement de développement UDI est correctement configuré comme décrit dans Vérifier l’environnement de développement UDI.

Préparer les prérequis de l’environnement de développement UDI

Pour préparer les prérequis de l’environnement de développement UDI, procédez comme suit :

  1. Préparez les avantages matériels de l’environnement de développement UDI comme décrit dans Préparer les prérequis matériels de l’environnement de développement UDI.

  2. Préparer les avantages logiciels de l’environnement de développement UDI comme décrit dans Préparer les prérequis logiciels de l’environnement de développement UDI.

Préparer les prérequis matériels de l’environnement de développement UDI

Les prérequis matériels de l’environnement de développement UDI sont les mêmes que ceux qui prérequis pour l’édition de Microsoft Visual Studio que vous utilisez. Pour plus d’informations sur ces exigences, consultez la configuration système requise pour chaque édition dans la documentation de Visual Studio.

Préparer l’environnement de développement UDI Prérequis logiciels

L’environnement de développement UDI dispose des prérequis logiciels suivants :

  • Tout système d’exploitation Windows pris en charge par Visual Studio 2010 (Windows 7 ou Windows Server ® 2008 R2 est recommandé).

    Vous avez besoin d’un système d’exploitation Windows qui prend en charge l’architecture de processeur pour laquelle vous souhaitez développer. Vous pouvez effectuer un développement UDI 32 bits et 64 bits à l’aide d’un système d’exploitation 64 bits. Vous ne faites que du développement UDI 32 bits sur des systèmes d’exploitation 32 bits. Pour cette raison, vous devez utiliser un système d’exploitation 64 bits.

    Remarque

    Les versions IntelItanium (IA-64) du système d’exploitation Windows ne sont pas prises en charge pour les environnements de développement UDI.

    Pour plus d’informations sur les systèmes d’exploitation pris en charge par Visual Studio 2010, consultez la configuration requise pour chaque édition dans la documentation de Visual Studio.

  • Microsoft .NET Framework version 4.0 (requis par Visual Studio 2010)

  • Langage C++ (langage utilisé pour étendre les pages de l’Assistant UDI)

  • Autres langages pris en charge par WPF, tels que C#, Visual Basic .NET ou C++/Common Language Infrastructure, qui sont utilisés pour étendre UDI Assistant Assistant Designer éditeurs de page

    Remarque

    L’exemple de code source pour les éditeurs de page de l’Assistant UDI Assistant Designer est écrit en C#. Installez le langage C# si vous souhaitez utiliser l’exemple de code source.

Configurer l’environnement de développement UDI

Une fois que les conditions préalables de l’environnement de développement UDI sont remplies, effectuez les étapes suivantes pour configurer l’environnement de développement UDI :

  1. Installez Visual Studio 2010.

    Assurez-vous d’installer le langage C++ et tout autre langage pris en charge par WPF.

    Remarque

    L’exemple de code source pour les pages de l’éditeur UDI Wizard Designer est écrit en C#. Installez le langage C# si vous souhaitez utiliser l’exemple de code source.

    Pour plus d’informations sur l’installation de Visual Studio 2010, consultez Installation de Visual Studio.

  2. Installez MDT.

    Pour plus d’informations sur l’installation de MDT, consultez la section « Installation ou mise à niveau vers MDT » du document MDT Utilisation de Microsoft Deployment Toolkit.

  3. Dans Windows Explorer, créez local_folder (où local_folder est un dossier situé sur un disque local de l’ordinateur de développement).

  4. Copiez le dossier installation_folder\SDK dans local_folder (où installation_folder est le dossier dans lequel vous avez installé MDT et local_folder est n’importe quel dossier situé sur un disque local sur l’ordinateur de développement).

    Vous copiez le dossier SDK vers un autre emplacement, car MDT est installé dans le dossier Program Files, dans lequel il n’est pas possible d’écrire sans autorisations élevées. La copie du dossier SDK vers un autre emplacement vous permet de modifier les fichiers dans le dossier SDK sans nécessiter d’autorisations élevées.

  5. Copiez le dossier installation_folder\Templates\Distribution\Tools dans local_folder ( où installation_folder est le dossier dans lequel vous avez installé MDT et local_folder est le dossier que vous avez créé plus tôt dans le processus).

  6. Renommez le dossier local_folder\Tools en local_folder\OSDSetupWizard(où local_folder est le dossier que vous avez créé plus tôt dans le processus).

    Une fois terminée, la structure des dossiers sous local_folder doit ressembler à la structure de dossiers illustrée dans la figure 2 (où local_folder est le dossier que vous avez créé plus tôt dans le processus et qui est indiqué comme UDIDevelopment dans la figure).

    Graphique 2. Structure des dossiers pour le développement de l’UDI Figure 2. Structure de dossiers pour le développement UDI

    Figure 2. Structure de dossiers pour le développement UDI

Vérification de l’environnement de développement UDI

Lorsque l’environnement de développement UDI est configuré, vérifiez qu’il est correctement configuré en veillant à ce que les exemples de projets se construisent correctement dans Visual Studio 2010.

Vérifiez que l’environnement de développement UDI est correctement configuré en déterminant si :

Vérifier que le projet SamplePage se génère correctement

Le projet SamplePage fournit un exemple de création d’une page d’assistant personnalisée pour l’assistant UDI. Pour plus d’informations sur le projet SamplePage, consultez Examiner la solution SamplePage Visual Studio.

Pour vérifier que le projet SamplePage est correctement généré

  1. Démarrez Visual Studio 2010.

  2. Ouvrez le projet SamplePage.

    Le projet SamplePage réside dans le dossier local_folder\SDK\UDI\SamplePage (où local_folder est le dossier que vous avez créé plus tôt dans le processus).

  3. Dans Visual Studio 2010, dans l’Explorateur de solutions, cliquez avec le bouton droit sur le projet SamplePage, puis sélectionnez Propriétés.

    La boîte de dialogue Pages de propriétés SamplePage s’affiche.

  4. Dans la boîte de dialogue Pages de propriétés SamplePage , accédez à Propriétés de configuration/Débogage.

  5. Dans les propriétés de débogage, sous Configuration, sélectionnez Toutes les configurations.

  6. Dans les propriétés de débogage, sous Commande, tapez $(TargetDir)\OSDSetupWizard.exe.

  7. Dans les propriétés de débogage, sous Répertoire de travail, tapez $(TargetDir).

  8. Dans la boîte de dialogue Pages de propriétés SamplePage , accédez à Propriétés de configuration/Événements de build/Événement post-build.

  9. Dans les propriétés d’événement post-build, sous Ligne de commande, tapez ce qui suit :

    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. Dans la boîte de dialogue Pages de propriétés SamplePage, sélectionnez OK.

  11. Enregistrez le projet.

  12. Dans le menu Déboguer , sélectionnez Démarrer le débogage.

    La boîte de dialogue Microsoft Visual Studios’affiche, indiquant que la source est obsolète et vous demande si vous souhaitez générer le projet.

  13. Dans la boîte de dialogue Microsoft Visual Studio , sélectionnez Oui.

    La boîte de dialogue Aucune information de débogage s’affiche, vous informant qu’aucune information de débogage n’est disponible pour OSDSetupWizard.exe.

  14. Dans la boîte de dialogue Aucune information de débogage , sélectionnez Oui.

    L’assistant UDI s’ouvre avec la page de l’assistant personnalisé affichée.

  15. Vérifiez que vous pouvez sélectionner une valeur dans Choisir votre emplacement.

  16. Dans le formulaire de l’Assistant avec un exemple de page , sélectionnez Annuler.

    La boîte de dialogue Assistant Annuler s’affiche.

  17. Dans la boîte de dialogue Annuler l’Assistant , sélectionnez Oui.

  18. Fermez Visual Studio 2010.

Vérifier que le projet SampleEditor est correctement généré

Le projet SampleEditor fournit un exemple de création d’un éditeur de page d’Assistant personnalisé pour le Designer de l’Assistant UDI. Pour plus d’informations sur le projet SampleEditor, consultez Examiner la solution SamplePage Visual Studio.

Pour vérifier que le projet SampleEditor est correctement généré

  1. Démarrez Visual Studio 2010.

  2. Ouvrez le projet SampleEditor.

    Le projet SampleEditor réside dans le dossier local_folder\SDK\UDI\SampleEditor ( où local_folder est le dossier que vous avez créé précédemment dans le processus).

  3. Dans Visual Studio 2010, dans l’Explorateur de solutions, sélectionnez le projet SampleEditor.

  4. Dans le menu Projet , sélectionnez Ajouter une référence.

    La boîte de dialogue Ajouter une référence s’ouvre.

  5. Dans la boîte de dialogue Ajouter une référence , cliquez sur l’onglet Parcourir .

  6. Sous l’onglet Parcourir , accédez à installation_folder\Bin (où installation_folder est le dossier dans lequel vous avez installé MDT). Sélectionnez les fichiers suivants, puis OK :

    • 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

    Remarque

    Vous pouvez sélectionner plusieurs fichiers dans l’onglet Parcourir en maintenant la touche CTRL enfoncée et en sélectionnant les fichiers.

  7. Dans l’Explorateur de solutions, accédez à SampleEditor/References.

  8. Vérifiez qu’aucune des références ne comporte d’avertissements ou d’erreurs.

  9. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le projet SampleEditor, puis sélectionnez Propriétés.

    La boîte de dialogue Pages de propriétés SampleEditor s’affiche.

  10. Dans la boîte de dialogue Pages de propriétés de l’Éditeurd’échantillons , sélectionnez l’onglet Déboguer .

  11. Sous l’onglet Déboguer , sélectionnez Démarrer un programme externe.

  12. Dans Démarrer un programme externe, tapez installation_folder\Bin\UDIDesigner.exe (où installation_folder est le dossier dans lequel vous avez installé MDT), puis sélectionnez OK.

    Conseil

    Vous pouvez sélectionner les points de suspension (...) pour accéder au dossier et sélectionner UDIDesigner.exe.

  13. Dans le menu Fichier , sélectionnez Enregistrer tout.

  14. Copiez le fichier\SDK\SamplePage\SamplePage.dll.config local_folder dans le dossier installation_folder\Bin\Config ( où local_folder est le dossier que vous avez créé sur l’ordinateur de développement plus tôt dans le processus de configuration etinstallation_folder est le dossier dans lequel vous avez installé MDT).

  15. Dans Visual Studio 2010, dans le menu Déboguer , sélectionnez Démarrer le débogage.

    Le Designer de l’assistant UDI démarre.

  16. Dans le UDI Wizard Designer, dans le ruban, sélectionnez Ouvrir.

    La boîte de dialogue Ouvrir s’affiche.

  17. Dans la boîte de dialogue Ouvrir , ouvrez le fichier \SDK\SamplePage\SamplePage\Config.xml local_folder ( où local_folder est le dossier que vous avez créé sur l’ordinateur de développement plus tôt dans le processus de configuration).

    Le fichier Config.xml s’ouvre et le groupe d’étapes personnalisé s’affiche dans le volet d’informations.

  18. Dans le volet d’informations, sélectionnez l’onglet Configurer .

  19. Passez en revue les informations de configuration de la zone Emplacement , notamment les éléments suivants :

    • Bouton Déverrouillé, avec lequel vous activez ou désactivez la zone Localisation

    • Zone Valeur par défaut, dans laquelle vous entrez une valeur par défaut à afficher dans la zone Emplacement

    • Nom d’affichage convivial visible dans la page de résumé, dans laquelle vous entrez la légende des informations affichées sur la page Résumé

    • Zone de liste d’emplacement, qui inclut une liste d’emplacements possibles

  20. Fermez le Designer de l’assistant UDI.

  21. Fermez Visual Studio 2010.

Examen des exemples de SDK UDI

Avant de commencer le développement, passez en revue les exemples fournis dans le SDK UDI. Utilisez les informations de ce guide et le code source des exemples pour vous aider à créer vos propres pages d’assistant UDI personnalisées et éditeurs de page d’assistant.

Parcourez les exemples de SDK UDI en examinant :

Vérifier le contenu du dossier SDK

Lors de la configuration de l’environnement de développement UDI, vous avez copié le dossier SDK du dossier dans lequel vous avez installé MDT vers un autre dossier que vous avez créé. Le tableau 1 répertorie les dossiers situés juste sous le dossier SDK et fournit une brève description de chacun d’entre eux.

Tableau 1. Dossiers dans le SDK UDI

Folder Ce dossier contient
Comprend Les fichiers d’en-tête C++ nécessaires à la création de pages d’assistant personnalisées pour l’assistant UDI
Libs Les fichiers de la bibliothèque C++ qui seront liés à votre page personnalisée ; Il existe des versions 32 bits et 64 bits des bibliothèques de liens statiques. Remarque : Les versions Itanium des bibliothèques (IA-64) ne sont pas disponibles.
SampleEditor Un projet Visual Studio pour la création d’un éditeur personnalisé utilisé pour modifier la page SamplePage dans UDI Wizard Designer, qui est écrite en C#
Exemple de page Projet Visual Studio pour la création d’une page d’assistant UDI personnalisée, qui est écrite en Visual C++

Examiner la solution Visual Studio SamplePage

Avant de commencer à créer vos pages d’assistant et vos éditeurs de page d’assistant personnalisés, effectuez les tâches suivantes pour préparer l’environnement de développement UDI :

Examiner le cycle de vie de la page de l’Assistant

Une page de l’assistant UDI a des méthodes qui correspondent à chaque étape (ou phase) du cycle de vie de la page. Dans le cadre de la création de votre page d’Assistant personnalisée, vous devez remplacer ces méthodes par votre code. Le tableau 2 répertorie les méthodes que vous devrez remplacer et fournit une brève description de chaque méthode, y compris quand utiliser la méthode dans le cycle de vie de la page de l’Assistant.

Tableau 2. Méthodes dans un Cycle de vie d’une page d’Assistant

Méthode Description
OnWindowCreated Cette méthode est appelée une fois, une fois la fenêtre de la page créée.

Pour cette méthode, écrivez du code qui initialise la page pour la première fois et qui n’a besoin d’être exécuté qu’une seule fois. Par exemple, utilisez cette méthode pour initialiser des champs ou pour lire les informations de configuration des éléments Setter dans le fichier de configuration de l’assistant UDI.
OnWindowShown Cette méthode est appelée chaque fois que la page est affichée dans l’assistant UDI. Il est appelé la première fois que la page s’affiche et chaque fois que vous accédez à la page en sélectionnant Suivant ou Retour dans l’assistant.

Pour cette méthode, écrivez du code qui prépare la page à afficher (par exemple, lire les variables de mémoire, les variables de séquence de tâches ou les variables d’environnement), puis mettez à jour la page en fonction des modifications apportées à ces variables.
OnCommonControlEvent Cette méthode peut être appelée chaque fois que la page de l’Assistant s’affiche et reçoit un message WM_NOTIFY d’un enfant (généralement, des contrôles communs).

Pour cette méthode, écrivez du code qui gère WM_NOTIFY en fonction du message de notification. Par exemple, vous pouvez répondre à des événements à partir d’un contrôle commun, comme répondre à des événements de sélection ou double-cliquer sur des événements pour un contrôle TreeView .
OnUnhandledEvent Cette méthode est appelée chaque fois qu’un message de fenêtre non géré se produit pour votre page d’Assistant. Cette méthode permet d’intercepter et de traiter ces messages de fenêtre non gérés autrement.

Pour cette méthode, écrivez du code qui traite les messages de fenêtre pertinents pour la page de votre Assistant. En règle générale, vous n’avez pas besoin de remplacer cette méthode.
OnNextSelected Cette méthode est appelée lorsque vous sélectionnez Suivant dans l’Assistant.

Pour cette méthode, écrivez du code qui effectue toutes les actions nécessaires avant de passer à la page de l’assistant suivante, par exemple, effectuer une validation qui peut prendre beaucoup de temps. Si la validation échoue, vous pouvez annuler la demande suivante et afficher un message.
OnWindowHidden Cette méthode est appelée chaque fois que la page est masquée lorsque la page précédente ou suivante de l’Assistant est affichée.

Pour cette méthode, écrivez du code qui effectue toutes les actions avant que la page ne soit masquée, avant qu’une autre page ne soit affichée. En règle générale, vous n’avez pas besoin de remplacer cette méthode.

Consulter l’exemple de SamplePage

Examinez l’exemple SamplePage à l’aide de la liste suivante, qui représente la séquence d’événements pendant le cycle de vie de la page d’Assistant de l’exemple SamplePage :

  1. L’assistant UDI, OSDSetupWizard.exe, lit les informations de configuration du fichier de configuration de l’assistant UDI dans l’exemple (le fichier Config.xml) comme décrit à l’étape 1 : L’assistant UDI (OSDSetupWizard.exe) lit le fichier Config.xml.

  2. L’assistant UDI charge les DLL requises pour chaque page de l’assistant répertoriée dans le fichier de configuration de l’assistant UDI, comme décrit à l’étape 2 : L’assistant UDI charge la DLL de la page de l’assistant personnalisé.

  3. L’assistant UDI affiche la page de l’assistant personnalisé et permet l’interaction de contrôle souhaitée, comme décrit à l’étape 3 : L’assistant UDI affiche la page de l’assistant personnalisé.

  4. Lorsque la page de l’Assistant personnalisé a collecté les informations, effectuez toutes les tâches nécessaires avant de sélectionner suivant pour passer à l’assistant suivant, comme décrit à l’étape 4 : le bouton Suivant est sélectionné dans la page de l’Assistant personnalisé.

Étape 1 : L’assistant UDI (OSDSetupWizard.exe) lit le fichier Config.xml

Lorsque l’assistant UDI (OSDSetupWizard.exe) démarre, il lit par défaut le fichier de configuration de l’assistant UDI, qui est le fichier UDIWizard_Config.xml, le fichier de configuration principal de l’assistant UDI.

Remarque

L’exemple utilise le fichier Config.xml comme fichier de configuration. Dans MDT, le fichier de configuration par défaut est le fichier UDIWizard_Config.xml, qui se trouve dans le dossier Scripts du package de Files MDT pour la configuration.

Vous pouvez remplacer le fichier de configuration par défaut utilisé par l’assistant UDI en modifiant l’étape de séquence de tâches de l’assistant UDI pour utiliser le paramètre /definition . Pour plus d’informations sur le remplacement du fichier de configuration par défaut utilisé par l’assistant UDI, consultez « Remplacer le fichier de configuration utilisé par l’assistant UDI ».

Les éléments de niveau supérieur dans le fichier Config.xml sont les suivants :

  • Élément DLLs

  • Élément de style

  • Élément Pages

  • Élément StageGroups

    Pour plus d’informations sur le schéma du fichier de configuration de l’assistant UDI et chacun de ces éléments, consultez Référence du schéma du fichier de configuration de l’assistant UDI.

    L’assistant UDI analyse l’élément DLLs à la recherche des fichiers .dll à charger. Dans l’exemple, deux fichiers .dll sont répertoriés : SamplePage.dll et SharedPages.dll. Ces fichiers .dll doivent se trouver dans le même dossier que OSDSetupWizard.exe, le dossier Outils\plateforme (où plateforme est x86 pour la version 32 bits ou x64 pour la version 64 bits).

    L’assistant UDI analyse l’élément Pages à la recherche des pages définies. Dans l’exemple, deux pages sont définies : Personnalisée et SummaryPage. L’attribut Type de l’élément Page est défini dans le fichier PageClassIDs.h et définit de manière unique le type de votre page personnalisée.

    Dans l’exemple, le type défini est Microsoft.SamplePage.LocationPage. Pour votre page personnalisée, remplacez par les éléments suivants pour éviter tout conflit potentiel avec d’autres pages que vous pourriez créer à l’avenir :

  • Le nom de votre organisation est remplacé par Microsoft.

  • Nom de votre projet à la place de SamplePage.

  • Votre nom de page d’Assistant personnalisé à la place de LocationPage.

Étape 2 : L’assistant UDI charge la DLL pour la page de l’assistant personnalisé

Lorsque l’assistant UDI charge votre DLL, il appelle la fonction RegisterFactories , qui doit être implémentée dans votre fichier .dll. Dans l’exemple, cette fonction est implémentée dans le fichier dllmain.cp. Chaque page d’Assistant que vous créez doit implémenter la fonction RegisterFactories .

La fonction RegisterFactories est utilisée pour inscrire la classe de fabrique de votre page d’Assistant avec le registre de fabrique de classes de l’Assistant UDI. Les fabriques à classes sont des classes qui peuvent créer un instance d’une autre classe. La fonction RegisterFactories crée une nouvelle instance d’une classe de fabrique et transmet cette classe au registre de fabrique de classes de l’assistant UDI, qui rend cette classe de fabrique disponible pour l’assistant. L’assistant UDI recherche une classe de fabrique enregistrée avec un ID qui correspond à l’attribut Type de l’élément Page de la page de l’assistant personnalisé.

Dans l’exemple, l’ID est défini en tant que ID_Location dans le fichier PageClassIds.h en tant que Microsoft.SamplePage.LocationPage, ce qui correspond à l’attribut Type de l’élément Page dans le fichier Config.xml. ID_Location est passé en tant que paramètre dans la fonction RegisterFactories implémentée dans le fichier dllmain.ccp.

Vous pouvez créer une fonction à l’aide du modèle de fonction Register_name pour simplifier la création d’une nouvelle fabrique instance et enregistrer le instance nouvellement créé. La valeur de nom fournie à l’aide du modèle de fonction Register doit implémenter l’interface iClassFactory . La classe ClassFactoryImpl gère la plupart des détails de l’implémentation d’une fabrique de classes.

Vous pouvez également utiliser la fonction RegisterFactories pour inscrire des types de tâches et des types de validateur. Pour plus d'informations, consultez les articles suivants :

Remarque

L’exemple contient et enregistre une seule page d’Assistant personnalisé. L’exemple n’inclut pas de tâches personnalisées ni de validateurs et n’inscrit donc pas de tâches personnalisées ou de validateurs.

Étape 3 : L’assistant UDI affiche la page de l’assistant personnalisé

La page de l’Assistant personnalisé dans l’exemple est définie dans le fichier LocationPage.cpp. Les pages d’Assistant sont dérivées de classes de modèles qui fournissent une grande partie des fonctionnalités d’une page. Toutes les pages d’Assistant doivent dériver de la classe de modèle WizardPageImpl, qui implémente l’interface IWizardPage. Chaque page de l’Assistant peut implémenter d’autres classes de modèles facultatives et les interfaces correspondantes en fonction des besoins de la page.

La classe de modèle WizardPageImpl dispose de plusieurs interfaces utiles qui peuvent vous aider à écrire des pages d’assistant personnalisées. Implémentez la classe de modèle WizardPageImpl comme classe de base pour votre page d’Assistant personnalisée.

Pour obtenir la liste des applications disponibles :

  • Classes modèles pour les pages d’assistant, voir Classes d’assistance de la page de l’assistant

  • Interfaces pour les classes de modèles de page de l’Assistant, voir Interfaces de page de l’Assistant

    La page d’Assistant personnalisée dans l’exemple est dérivée de la classe de modèle WizardPageImpl et implémente l’interface IWizardPage. En outre, la page de l’Assistant personnalisé implémente l’interface IFieldCallback . Ces deux éléments sont implémentés dans le fichier LocationPage.cpp.

    L’exemple de page de l’Assistant personnalisé remplace les méthodes suivantes :

  • OnWindowCreated. La méthode OnWindowCreated dans l’exemple de page de l’Assistant appelle les méthodes suivantes :

    • AddField. Cette méthode associe le contrôle de zone IDC_COMBO_LOCATION dans la ressource IDD_LOCATION_PAGE à l’élément de données nommé Emplacement dans le fichier Config.xml.

      En plus de la méthode AddField , vous pouvez utiliser les méthodes AddRadioGroup et AddToGroup pour prendre en charge d’autres contrôles et comportements.

      Remarque

      Veillez à appeler la méthode AddField, AddRadioGroup ou AddToGroup avant d’appeler la méthode InitFields .

    • InitFields. Utilisez cette méthode pour initialiser les champs (contrôles) que vous avez ajoutés au formulaire. Le pointeur de la page est un paramètre. Dans l’exemple, le pointeur this est passé, qui fait référence à la page active.

      Remarque

      Pour prendre en charge l’utilisation de ce pointeur, vous devez implémenter l’interface IFieldCallback en plus des interfaces prises en charge par la classe de modèle WizardPageImpl .

      L’interface IFieldCallback appelle la méthode SetFieldDefault, qui est utilisée pour définir les valeurs par défaut des contrôles autres que les contrôles de zone de texte et de case activée. Dans l’exemple, la méthode SetFieldDefault définit l’index initial du contrôle de zone de liste déroulante en fonction de la valeur par défaut spécifiée dans l’élément Default pour l’élément Field du fichier Config.xml.

      La méthode OnWindowCreated configure le contrôleur de formulaire à l’aide de l’interface IFormController. Pour plus d’informations sur la configuration du contrôleur de formulaire, voir Configuration du formulaire.

  • InitLocations. Cette méthode remplit la zone de liste déroulante à partir de la liste des emplacements dans le fichier Config.xml. L’élément Data et les éléments DataItem enfants du fichier Confg.xml fournissent la liste des valeurs possibles.

  • OnNextSelected. Cette méthode permet d’effectuer les tâches suivantes :

    • Mises à jour la variable de séquence de tâches TSLocation avec la valeur sélectionnée dans la zone de liste déroulante à l’aide de la méthode SaveFields

    • Ajoute des informations qui s’afficheront sur la page Résumé à l’aide de la méthode SaveFields

Étape 4 : le bouton suivant est sélectionné dans la page de l’assistant personnalisé

Lorsque l’utilisateur remplit les champs de la page de l’Assistant personnalisé, il sélectionne Suivant, qui appelle la méthode OnNextSelected . La méthode OnNextSelected effectue toutes les tâches nécessaires avant de passer à la page de l’assistant suivante, par exemple en enregistrant les modifications de configuration apportées sur la page de l’assistant personnalisé.

Pour l’exemple de page d’Assistant personnalisé, le remplacement de la méthode OnNextSelected est implémenté dans le fichier LocationPage.ccp. Dans la méthode OnNextSelected de l’exemple de page de l’Assistant personnalisé, les méthodes suivantes sont appelées :

  1. InitSection. Cette méthode initialise l’en-tête (légende de l’étiquette) pour les données de synthèse affichées sur la page Résumé. En règle générale, vous pouvez définir cette valeur à l’aide de la fonction DisplayName( ). Les données associées à cette légende sont enregistrées à l’aide de la méthode SaveFields.

  2. SaveFields. Cette méthode enregistre les valeurs de champ dans les variables de séquence de tâches et dans les données affichées sur la page Résumé .

Tester la solution SampleEditor Visual Studio

Avant de commencer à créer vos propres pages d’assistant et éditeurs de page d’assistant personnalisés, effectuez les étapes suivantes pour préparer l’environnement de développement UDI :

Examiner l’architecture du Designer de l’Assistant UDI

Le UDI Wizard Designer a été développé à l’aide de WPF, Prism et Unity. Le Designer UDI est utilisé pour éditer le fichier de configuration de l’assistant UDI (UDIWizard_Config.xml), que l’assistant UDI (OSDSetupWizard.exe) lit au moment de l’exécution. L’élément Pages du fichier de configuration de l’Assistant UDI contient une liste de pages qui possède un élément Page distinct pour chaque page de l’Assistant.

Lorsque vous modifiez les paramètres de configuration d’une page d’assistant, l’assistant UDI charge Designer l’éditeur de page personnalisé qui correspond au type de page de l’assistant. Les éditeurs de page d’Assistant personnalisés sont développés comme des contrôles utilisateur WPF. Les pages d’éditeur de page de l’Assistant personnalisé utilisent le modèle de conception MVVM ( Model-View-ViewModel ) pour WPF.

Le modèle de conception MVVM permet de séparer l’interface utilisateur (IU ; présentation) des données présentées. Les données sont une façade sur l’élément Page dans le fichier de configuration de l’assistant UDI (le fichier Config.xml dans l’exemple), auquel on accède à l’aide de la propriété CurrentPage de l’interface IDataService .

Le Designer de l’assistant UDI utilise DependencyAttribute pour obtenir l’accès à la classe DataService basée sur le framework d’injection de dépendances dans Unity. Pour plus d’informations sur l’infrastructure d’interjection des dépendances dans Unity, consultez Injecter un peu de vie dans vos applications – Apprendre à connaître le bloc d’application Unity.

Vérifier les composants configurables d’une page de l’Assistant UDI

Lorsque vous créez votre page d’Assistant personnalisée, certains des paramètres de configuration peuvent être définis dans le code et ne peuvent pas être modifiés une fois que vous avez compilé la page. Cependant, pour les autres paramètres de configuration, vous devrez autoriser la modification de ces paramètres à l’aide du Designer de l’assistant UDI.

En règle générale, les paramètres de configuration que vous souhaitez configurer à l’aide du Designer de l’assistant UDI sont enregistrés dans le fichier de configuration de l’assistant UDI (le fichier Config.xml dans l’exemple). Toutefois, vous pouvez également créer votre propre fichier de configuration distinct, si nécessaire. Un exemple d’utilisation d’un fichier de configuration distinct est le fichier UDIWizard_Config.xml.app, que la tâche de découverte d’application et le type de page de l’Assistant ApplicationPage utilisent.

Voici une liste des paramètres de configuration typiques que vous pouvez gérer à l’aide du UDI Wizard Designer :

  • Champ. Les champs d’utilisation permettent aux utilisateurs de fournir des informations. Les champs apparaissent en tant qu’éléments de champ dans le fichier de configuration de l’assistant UDI (UDIWizard_Config.xml), qui contient les paramètres de configuration de chaque champ. L’éditeur de page de l’Assistant correspondant doit fournir une méthode pour modifier les paramètres de configuration du champ à l’aide de FieldElementControl.

  • Propriétés : Les setters aident à créer des propriétés pour les entités de la page, telles que les pages de l’élément Page , les champs de l’élément Field ou les données des éléments Data ou DataItem . Vous configurez les propriétés dans les éléments Setter . Ajoutez un élément Setter distinct pour chaque propriété que vous souhaitez définir. Vous modifiez les propriétés à l’aide du SetterControl et configurez d’autres éléments Setter à l’aide d’autres contrôles.

  • Données : Les données sont utilisées pour stocker des informations destinées à la page de l’Assistant et à d’autres composants. Vous pouvez définir des données pour des pages ou des champs à l’aide des éléments Data ou DataItem . Les données peuvent être définies dans une structure plate ou hiérarchique grâce à l’utilisation correcte des éléments Data ou DataItem . Le Config.xml de l’exemple du Kit de développement logiciel (SDK) montre comment créer des structures de données plates.

    L’éditeur de page de l’Assistant personnalisé que vous créez doit être en mesure de gérer ces paramètres de configuration.

Consulter l’exemple de EditorPage

L’exemple EditorPage est utilisé pour configurer les paramètres de configuration de la page de l’assistant SamplePage dans le fichier de configuration de l’assistant UDI. L’exemple EditorPage présente les composants principaux suivants :

  • Interface utilisateur pour configurer les paramètres de zone de liste déroulante Emplacement

  • Interface utilisateur permettant d’ajouter ou de modifier un emplacement dans la liste des emplacements possibles, qui sont affichés dans la zone de liste modifiable Emplacement

  • Paramètres de configuration lus et enregistrés dans le fichier de configuration de l’assistant UDI

  • Code de prise en charge pour les autres composants

    Examinez l’exemple EditorPage dans Visual Studio en effectuant les étapes suivantes :

  1. Vérifiez comment l’éditeur de page de l’Assistant SampleEditor est chargé et initialisé dans le Designer de l’Assistant UDI comme décrit dans Assistant Révision Chargement et initialisation de l’éditeur de page.

  2. Examinez l’interface utilisateur utilisée pour modifier la zone de liste modifiable Emplacement dans LocationPageEditor.xaml et LocationPageEditor.xaml.cs fichiers comme décrit dans Passez en revue l’interface utilisateur utilisée pour configurer la zone de liste déroulante Emplacement.

  3. Examinez l’interface utilisateur utilisée pour ajouter ou modifier des emplacements à la liste dans les fichiers AddEditLocationView.xaml et AddEditLocationView.xaml.cs, comme décrit dans Examinez l’interface utilisateur utilisée pour modifier la liste des emplacements possibles.

  4. Examinez le code utilisé pour gérer les informations de configuration enregistrées dans le fichier de configuration de l’assistant UDI comme décrit dans Examinez le code utilisé pour gérer les informations de configuration.

Assistant Révision Chargement et initialisation de l’éditeur de page

Les éditeurs de page de l’assistant personnalisé sont chargés selon les besoins du Designer de l’assistant UDI. Les fichiers de configuration du concepteur UDI Wizard Designer sont chargés au démarrage du UDI Wizard Designer. L’assistant UDI analyse Designer le dossier install_folder\Bin\Config (où install_folder est le nom du dossier dans lequel MDT est installé) pour les fichiers qui ont une extension de fichier .config.

Lors de la configuration de l’environnement de développement UDI, vous avez copié le fichier SamplePage.dll.confg dans le dossier install_folder\Bin\Config. Lorsque vous démarrez le Designer de l’assistant UDI, le fichier SamplePage.dll.confg est trouvé et chargé.

L’assistant UDI utilise Designer les attributs suivants de l’élément Page dans le fichier SamplePage.dll.confg pour charger et initialiser l’exemple EditorPage :

  • DesignerAssembly. Cet attribut détermine le nom de la DLL à charger. Cette DLL doit être placée dans le même dossier que le fichier UDIDesigner.exe, qui est le dossier install_folder\Bin (où install_folder est le nom du dossier dans lequel MDT est installé).

  • Type de concepteur. Cet attribut est le nom de type Microsoft .NET de la classe qui contient le contrôle utilisateur WPF.

  • Type. Utilisez cet attribut pour configurer le type de page de la page de l’assistant personnalisé, chargée par l’assistant UDI. Le UDI Wizard Designer utilise cet attribut pour localiser l’élément Page approprié dans le fichier de configuration UDI Wizard.

  • DLL. Utilisez cet attribut pour configurer l’élément DLL dans le fichier de configuration de l’assistant UDI, créé par le Designer de l’assistant UDI.

  • Description. Utilisez cet attribut pour fournir des informations sur l’éditeur de page de l’Assistant. La valeur de cet attribut est affichée dans la boîte de dialogue Ajouter une nouvelle page dans le Designer de l’assistant UDI, qui est utilisée pour ajouter la page de l’assistant à la « bibliothèque de pages ».

  • DisplayName. Utilisez cet attribut pour fournir le nom de la page de l’assistant personnalisé qui s’affiche dans le Designer de l’assistant UDI. La valeur de cet attribut est affichée dans la boîte de dialogue Ajouter une nouvelle page dans le Designer de l’assistant UDI, qui est utilisée pour ajouter la page de l’assistant à la « bibliothèque de pages ».

    Dans l’exemple, le type de page de l’Assistant personnalisé SamplePage est Microsoft.SamplePage.LocationPage, qui est enregistré dans le fichier Config.xml. Le fichier Config.xml se trouve dans le dossier local_folder\SDK\SamplePage\SamplePage ( où local_folder est le dossier que vous avez créé sur l’ordinateur de développement plus tôt dans le processus de configuration).

Examinez l’interface utilisateur utilisée pour configurer la zone de liste modifiable d’emplacement

Lorsque l’éditeur de page de l’Assistant est chargé et initialisé, l’éditeur de page de l’Assistant SampleEditor est chargé lorsqu’une page avec un type de Microsoft.SamplePage.LocationPage est modifiée. L’interface utilisateur de l’éditeur de page est stockée dans le fichier LocationPageEditor.xaml.

Si vous examinez l’interface utilisateur sous l’onglet Création et le code sous l’onglet XAML , vous pouvez voir la relation entre l’interface utilisateur graphique et les éléments et attributs dans le langage XAML (Extensible Application Markup Language).

Par exemple, si vous examinez l’élément Controls :FieldElementControl dans le XAML, vous pouvez voir comment il est lié à la disposition de l’interface utilisateur correspondante. Utilisez l’élément Controls :FieldElementControl pour définir le contrôle FieldElementControl .

Les paramètres de liaison du fichier XAML lient les champs de l’éditeur de page d’exemple aux informations du fichier de configuration de l’assistant UDI. Par exemple, le code suivant lie la zone de texte Valeur par défaut à l’élément Default dans le fichier de configuration de l’assistant UDI (Config.xml dans l’exemple) :

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

Pour plus d’informations, consultez Comment : rendre les données disponibles pour la liaison en XAML.

Utilisez l’élément Views :CollectionTControl.ColumnCollectionView dans le XAML pour modifier la liste des emplacements disponibles dans l’affichage grille. Vous utilisez la commande CollectionTControl pour afficher la vue de la grille et lier la vue de la grille à l’élément Data avec le nom Location dans le fichier de configuration UDI.

Revoir l’interface utilisateur utilisée pour modifier la liste des emplacements possibles

L’interface utilisateur permettant de modifier la liste des emplacements possibles se compose des éléments suivants :

Vérifier les boutons contextuels du menu et du ruban pour modifier la liste des emplacements

Lorsque vous cliquez avec le bouton droit dans la zone de liste qui contient la liste des emplacements, un menu contextuel s’affiche. Le ruban comporte des boutons correspondants qui vous permettent d’effectuer les mêmes tâches. L’élément de contrôle Views :CollectionsTControl dans le fichier LocationPageEditor.xaml définit les méthodes appelées en fonction de l’action entreprise et des propriétés que vous définissez comme suit :

  • Élément sélectionné. Cette propriété liée aux données est activée lorsque l’utilisateur sélectionne un élément de la liste. Cette propriété est liée à la propriété CurrentLocation dans le modèle d’affichage, qui se trouve dans le fichier LocationPageEditorViewModel.cs et est utilisée par le contrôle CollectionTControl pour transmettre l’élément sélectionné lorsque vous modifiez ou supprimez un élément existant.

  • AddItemAction. Cette action est effectuée lorsque l’utilisateur sélectionne l’option Ajouter un élément dans le menu contextuel ou les boutons correspondants du ruban. Il existe une liaison de données à une propriété dans le modèle d’affichage qui renvoie l’objet AddLocationAction . Cet objet est la méthode AddLocationCallback , située dans le fichier LocationPageEditorViewModel.cs, et affiche la boîte de dialogue dans le fichier AddEditLocationView.xaml.

  • EditItemAction. Cette action est effectuée lorsque l’utilisateur sélectionne l’option Modifier l’élément dans le menu contextuel. Il existe une liaison de données à une propriété dans le modèle de vue qui renvoie l’objet EditLocationAction . Cet objet est la méthode EditLocationCallback , située dans le fichier LocationPageEditorViewModel.cs, et affiche la boîte de dialogue dans le fichier AddEditLocationView.xaml.

  • RemoveAction. Cette action est effectuée lorsque l’utilisateur sélectionne l’option Supprimer l’élément dans le menu contextuel. Il existe une liaison de données à une propriété dans le modèle de vue qui renvoie l’objet RemoveAction . Cet objet est la méthode EditLocationCallback , située dans le fichier LocationPageEditorViewModel.cs, et affiche un message qui confirme la suppression de l’emplacement.

Passez en revue la boîte de dialogue pour ajouter ou modifier des emplacements

Si vous ajoutez un nouvel emplacement à la liste des emplacements ou modifiez un emplacement existant, un message s’affiche dans le fichier AddEditLocationView.xaml. Le message s’affiche à l’aide de la méthode ShowDialogWindow dans le fichier LocationPageEditorViewModel.cs.

L’interface utilisateur du fichier AddEditLocationView.xaml se compose des éléments suivants :

  • Cadre de boîte de dialogue nommé DialogFrame, qui inclut les éléments suivants :

    • Un titre, que vous configurez à l’aide de l’attribut DialogTitle du cadre de boîte de dialogue

    • Un bouton OK, qui définit le status de retour de la propriété Approved sur True (le status de retour est vérifié dans la méthode AddLocationCallback du fichier LocationPageEditorViewModel.cs pour déterminer si l’utilisateur a sélectionné OK.)

    • Un bouton Annuler, qui définit le status de retour comme pour la propriété Approved sur False (le status de retour est vérifié dans la méthode AddLocationCallback du fichier LocationPageEditorViewModel.cs pour déterminer si l’utilisateur a sélectionné Annuler.)

  • Élément WPF qui contient :

    • Une étiquette, que vous configurez à l’aide de l’attribut Contenu

    • Une zone de texte liée à l’élément Data avec le nom Location dans le fichier de configuration UDI (le fichier Config.xml dans l’exemple)

Passez en revue le code utilisé pour gérer les informations de configuration

Les informations de configuration de votre page d’Assistant personnalisé sont stockées dans le fichier de configuration de l’Assistant UDI, qui est :

  • Config.xml fichier dans l’exemple fourni avec le SDK UDI (ce fichier contient uniquement les paramètres de configuration de l’exemple).

  • UDIWizard_Config.xml fichier fourni avec MDT, stocké dans le dossier installation_folder\Templates\Distribution\Scripts ( où installation_folder est le dossier dans lequel vous avez installé MDT) ; Ce fichier contient les paramètres de configuration de toutes les pages et étapes de l’Assistant intégré

    Dans l’exemple SampleEditor, la routine Locations permet de gérer les informations de configuration et se trouve dans le fichier LocationPageEditorViewModel.cs. La routine Locations renvoie une liste des emplacements à partir du fichier de configuration de l’assistant UDI. Plus précisément, la liste renvoyée contient un élément pour chaque élément DataItem dans le fichier de configuration de l’assistant UDI.

Création de pages personnalisées de l’Assistant UDI

Le processus de haut niveau pour créer des pages personnalisées de l’assistant UDI est le suivant :

  1. Faites une copie de la solution SamplePage comme point de départ.

  2. Placez les contrôles (champs) souhaités sur le formulaire.

  3. Écrivez du code pour effectuer les tâches appropriées lors du chargement de la page de l’Assistant (remplacements de la méthode OnWindowCreated ), notamment les étapes suivantes :

    1. Initialisez le formulaire.

    2. Lisez les variables de mémoire, les variables de séquence de tâches, les variables d’environnement ou les informations de fichier XML (telles que les propriétés setter ).

  4. Écrivez du code pour effectuer les tâches appropriées lorsque la page est affichée (remplacements de la méthode OnWindowShowed ), notamment les étapes suivantes :

    1. Activez ou désactivez les contrôles en fonction des informations lues lors du chargement de la page à l’étape 3.

    2. Mettez à jour les contrôles en fonction des informations lues lors du chargement de la page à l’étape 3, par exemple le remplissage des contrôles en fonction des informations lues.

  5. Écrivez du code pour effectuer les tâches appropriées pendant que l’utilisateur interagit avec la page de l’Assistant.

  6. Écrivez du code pour effectuer les tâches appropriées lorsque l’utilisateur sélectionne Suivant dans l’Assistant UDI (remplace la méthode OnNextSelected ), notamment les étapes suivantes :

    1. Mettez à jour les variables mémoire, les variables de séquence de tâches, les variables d’environnement ou les informations de fichier XML.

    2. Mettre à jour les informations de la page récapitulative (si elle n’est pas effectuée par les champs de la page).

  7. Générez la solution.

    Assurez-vous que la version de la DLL que vous créez est la même plateforme de processeur que celle installée de MDT, en particulier la plateforme de processeur de l’environnement de préinstallation de Windows (WinPE). L’assistant UDI peut s’exécuter dans :

    • Le système d’exploitation existant sur l’ordinateur cible. Vous pouvez exécuter les versions 32 bits de votre page d’Assistant sur des systèmes d’exploitation Windows 32 bits ou 64 bits. Toutefois, vous ne pouvez exécuter les versions 64 bits de votre page d’Assistant que sur des systèmes d’exploitation Windows 64 bits.

    • Windows PE sur l’ordinateur cible. Windows PE ne prend pas en charge l’exécution d’applications 32 bits sur une version 64 bits de Windows PE. Vous devez donc avoir créé une version pour votre page d’Assistant pour chaque architecture de processeur de Windows PE que vous envisagez d’utiliser.

  8. Copiez la DLL de la page de l’Assistant personnalisé dans le dossier plateforme installation_folder\Templates\Distribution\Tools\ (où installation_folder est le dossier dans lequel vous avez installé MDT et la plateforme est x86 pour la version 32 bits ou x64 pour la version 64 bits).

  9. Suivez les étapes de création d’un éditeur de page personnalisé.

Création d’éditeurs de page d’Assistant personnalisés

Le processus de haut niveau pour créer des éditeurs de page personnalisés de l’assistant UDI est le suivant :

  1. Faites une copie de la solution SampleEditor comme point de départ.

  2. Créez l’interface utilisateur de l’éditeur de page principale dans un fichier .xaml.

  3. Ajoutez des instances du contrôle FieldElementControl requises par la page de l’Assistant à configurer (si nécessaire).

  4. Ajoutez des instances du contrôle SetterControl requises par la page de l’Assistant à configurer (si nécessaire).

  5. Ajoutez des instances du contrôle CollectionTControl selon les exigences de la page de l’Assistant à configurer (si nécessaire).

  6. Ajoutez l’interface IDataService .

  7. Écrivez le code approprié pour mettre à jour le fichier de configuration de l’assistant UDI en fonction des paramètres de configuration à configurer à l’aide de votre éditeur de page d’assistant personnalisé.

  8. Créez des boîtes de dialogue enfants dans un fichier .xaml et appelez-les à partir de l’éditeur de page principal à l’aide de l’interface IMessageBoxService comme requis par la page de l’assistant à configurer.

  9. Ajoutez les interfaces appropriées au ruban du Designer de l’assistant UDI en fonction des exigences de la page de l’assistant à configurer.

  10. Générez la solution.

    Remarque

    Assurez-vous que la version de la DLL que vous créez est la même plateforme de processeur que celle installée de MDT. Par exemple, si vous installez la version 64 bits de MDT, créez une version 64 bits de votre éditeur de page personnalisé.

  11. Créez un fichier de configuration Designer d’assistant UDI pour charger les DLL nécessaires et mapper l’éditeur de page de l’assistant avec la page d’assistant correspondante (le fichier SamplePage.dll.config dans l’exemple).

    Pour plus d’informations sur les éléments requis pour effectuer le mappage entre la page de l’Assistant et l’éditeur de page de l’Assistant, consultez l’élément DesignerMappings , les éléments enfants et les attributs correspondants.

  12. Copiez le fichier de configuration de l’assistant UDI Designer que vous avez créé à l’étape précédente dans le dossier installation_folder\Bin\Config (où installation_folder est le dossier dans lequel vous avez installé la version de MDT).

  13. Copiez la DLL de votre éditeur de page d’Assistant personnalisé dans le dossier installation_folder\Bin (où installation_folder est le dossier dans lequel vous avez installé MDT).

Création de tâches UDI personnalisées

Les tâches UDI sont des DLL écrites en C++ qui implémentent l’interface ITask. Pour enregistrer la DLL dans la bibliothèque de tâches Designer de l’Assistant UDI, créez un fichier de configuration Designer de l’Assistant UDI (fichier .config) et placez-le dans le dossier installation_folder\Bin\Config (où installation_folder est le dossier dans lequel vous avez installé MDT).

Remarque

Vous pouvez créer une DLL qui contient des pages d’Assistant, des tâches et des validateurs dans le même fichier .dll. Vous pouvez également créer un seul fichier de configuration (Designer.config) de l’Assistant UDI qui contient les paramètres de configuration des pages de l’Assistant, des tâches et des validateurs dans la DLL.

Pour créer des tâches UDI personnalisées

  1. Écrire du code qui implémente l’interface ITask et les méthodes suivantes :

    • Initialisation. Cette méthode est appelée pour initialiser votre tâche.

    • Exécuter. Cette méthode est appelée pour exécuter votre tâche.

  2. Écrire du code qui enregistre la fabrique de classes de tâches personnalisée auprès du registre de fabrique d’usines.

  3. Créez la solution pour votre tâche personnalisée.

    Remarque

    Assurez-vous que la version de la DLL que vous créez est la même plateforme de processeur que celle installée de MDT. Par exemple, si vous installez la version 64 bits de MDT, créez une version 64 bits de votre tâche UDI personnalisée.

  4. Créez un élément de tâche sous l’élément TaskLibrary dans le fichier de configuration Designer de l’assistant UDI, similaire à l’extrait suivant :

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

    Remarque

    Tous les éléments de la tâche doivent inclure le paramètre BitmapFilename . Spécifiez tous les autres paramètres requis par la tâche. Par exemple, dans l’extrait précédent, le paramètre log est utilisé pour spécifier un paramètre pour l’emplacement d’un fichier journal.

  5. Copiez le fichier de configuration de l’assistant UDI Designer créé à l’étape précédente dans le dossier installation_folder\Bin\Config (où installation_folder est le dossier dans lequel vous avez installé MDT).

  6. Copiez la DLL de votre tâche personnalisée dans le dossier plateforme installation_folder\Templates\Distribution\Tools\ (où installation_folder est le dossier dans lequel vous avez installé MDT et la plateforme est x86 pour la version 32 bits ou x64 pour la version 64 bits).

Création de validateurs UDI personnalisés

Les validateurs UDI sont des DLL écrites en C++ qui implémentent l’interface IValidator . Pour enregistrer la DLL dans la bibliothèque de Designer de validation de l’Assistant UDI, créez un fichier de configuration Designer de l’Assistant UDI (fichier .config) et placez-le dans le dossier installation_folder\Bin\Config (où installation_folder est le dossier dans lequel vous avez installé MDT).

Pour créer des validateurs UDI personnalisés

  1. Écrivez du code qui crée une sous-classe de la classe BaseValidator et implémente les méthodes suivantes :

    • Init(IControl *pControl, IWizardPageContainer *pContainer, IStringProperties *pProperties). Le contrôleur de formulaire appelle le membre Init pour initialiser le validateur. Cette méthode doit appeler la méthode Init de la classe BaseValidator . Il lit généralement toutes les propriétés définies pour le validateur à partir du fichier de configuration de l’assistant UDI. Par exemple, le validateur InvalidCharactersValidator récupère la valeur de la propriété InvalidChars à l’aide de cette méthode.

    • Est valide. Le contrôleur de formulaire appelle cette méthode pour voir si le contrôle contient du texte valide. L’exemple suivant de méthode IsValid pour un validateur qui valide que le champ n’est pas vide :

      BOOL IsValid(LPBSTR pMessage)
      {
          __super::IsValid(pMessage);
      
          _bstr_t text;
          m_pText->GetText(text.GetAddress());
          return (text.length() > 0);
      }
      
    • Init(IControl *pControl, LPCTSTR message). Le contrôleur de formulaire appelle ce membre pour chaque frappe de touches et d’autres événements afin que le validateur puisse valider le contenu du contrôle et des messages mis à jour au bas de la page de l’Assistant (ou les effacer).

      En règle générale, il s’agit des seules méthodes que vous devez remplacer. Toutefois, selon le validateur, vous devrez peut-être remplacer d’autres méthodes dans la sous-classe de la classe BaseValidator que vous créez. Pour plus d’informations sur ces autres méthodes, consultez la classe BaseValidator .

  2. Écrire du code qui inscrit la classe de tâche personnalisée auprès de la fabrique du Registre.

  3. Créez la solution pour votre tâche personnalisée.

    Remarque

    Assurez-vous que la version de la DLL que vous créez est la même plateforme de processeur que celle installée de MDT. Par exemple, si vous installez la version 64 bits de MDT, créez une version 64 bits de votre tâche UDI personnalisée.

  4. Créez un élément Validator sous l’élément ValidatorLibrary dans le fichier de configuration du Designer de l’assistant UDI, similaire à l’extrait suivant :

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

    Avertissement

    Tous les éléments du validateur doivent inclure le paramètre Message . Spécifiez tous les autres paramètres requis par le validateur. Par exemple, dans l’extrait précédent, le paramètre MotifNom est utilisé pour spécifier un paramètre pour le nom d’un modèle d’expression régulière prédéfini.

  5. Copiez le fichier de configuration de l’assistant UDI Designer créé à l’étape précédente dans le dossier installation_folder\Bin\Config (où installation_folder est le dossier dans lequel vous avez installé MDT).

  6. Copiez la DLL de votre tâche personnalisée dans le dossier plateforme installation_folder\Templates\Distribution\Tools\ (où installation_folder est le dossier dans lequel vous avez installé MDT et la plateforme est x86 pour la version 32 bits ou x64 pour la version 64 bits).

Référence de l’assistant UDI

Composants de la page de l’Assistant

Vous pouvez utiliser l’un des composants prédéfinis pour créer vos pages personnalisées.

Création d’instances de composant

L’assistant UDI utilise des fabriques de classes pour créer de nouvelles instances d’objets pour vous. Ces fabriques sont enregistrées auprès d’un registre d’usine, en utilisant une chaîne comme clé d’usine. Par exemple, le composant WmiRepository est identifié par la chaîne « Microsoft.Wizard.WmiRepository », qui est disponible dans le fichier d’en-tête IWmiRepository en tant que ID_WmiRepository.

En supposant que vous avez écrit votre page comme une sous-classe de WizardPageImpl, vous pouvez créer une nouvelle instance d’un WmiRepoistory comme ceci :

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

La fonction CreateInstance est une fonction de modèle de type sécurisé permettant de créer de nouvelles instances de composants. PWmiRepository est un pointeur intelligent, il gère donc le comptage des références pour vous.

Composants créables

Il existe un ensemble de composants que vous pouvez inscrire auprès du registre. Le premier ensemble de composants est toujours enregistré, car le fichier exécutable principal de l’assistant UDI le fournit. Les deux autres ensembles de composants sont fournis dans des DLL « facultatives ». Pour que ces composants soient disponibles, la DLL doit être répertoriée dans la section DLL du fichier XML .config. Votre code n’a pas besoin de savoir quel exécutable contient un composant spécifique.

La liste des ID de composant pour les composants (le nom du composant est le même que l’ID mais sans le ID_ initial) enregistrés auprès du registre d’usine (définis dans OSDSetupWizard) est présentée dans le tableau 3.

Tableau 3. ID de composant

ID Description
ID_ACPowerTask (ITask, IWizardComponent) Tâche de contrôle en amont qui garantit que votre ordinateur ne fonctionne pas uniquement sur batterie
ID_AppDiscoveryTask (ITask, IWizardComponent) Une tâche spécialisée pour découvrir les logiciels que vous avez installés sur votre ordinateur
ID_BackgroundTask (IBackgroundTask, IWizardComponent) Peut être utilisé pour exécuter une tâche sur un autre thread
ID_CopyFilesTask (ITask, IWizardComponent) Une tâche pour copier un ou plusieurs fichiers
ID_FormController (IFormController) Vous aimerez ne pas avoir à créer un instance vous-même, car votre page reçoit son propre instance
ID_InvalidCharactersValidator (IValidator) Garantit qu’aucun champ de texte ne contient de caractères d’une liste fournie au validateur
ID_Logger (ILogger) Vous aimerez surtout ne pas avoir à créer un instance vous-même, car votre page reçoit un pointeur vers le instance partagé
ID_NonEmptyValidator (IValidator) Un validateur qui s’assure qu’aucun champ n’est vide
ID_PasswordValidator (IValidator) Un validateur qui garantit que deux champs de texte n’ont pas le même contenu
ID_Regex (IRegEx) Évalue les expressions régulières, recherche de correspondances
ID_RegExValidator (IValidator) Un validateur qui valide par rapport à une expression régulière ou à un modèle connu
ID_SimpleStringProperties (IStringProperties, ISimpleStringProperties) Fournit un moyen simple d’envoyer des propriétés à des tâches sans utiliser XML
ID_ShellExecuteTask (ITask, IWizardComponent) Exécuter un programme externe
ID_SummaryBag (ISummaryBag) Disponible indirectement depuis votre page via la méthode Formulaire
ID_TaskManager (ITaskManager, IBackgroundCallback, IWizardComponent) Gère l’exécution d’un ensemble de tâches et l’interface utilisateur
ID_WmiRepository (IWmiRepository, IWizardComponent) Permet d’exécuter des requêtes WMI (Windows Management Instrumentation)
ID_IXmlDocument (IXmlDocument) Fournit une façade pour la lecture et l’écriture de documents XML

Les OSDRefreshWizard.dll définis, les pages partagées et les autres composants de commande sont présentés dans les tableaux 4 et 5.

Tableau 4. Contrôles d’annuaire

ID Description
ID_Directory (IDirectoire) Une façade pour obtenir des informations de répertoire à partir du système de fichiers

Tableau 5. Définis SharedPages.dll

ID Description
ID_ADHelper (IADHelper) Fournit une façade pour un ensemble limité de fonctionnalités dans Active Directory® Domain Services (AD DS)
ID_CpuInfo (ICpuInfo) Détermine si votre processeur est 32 ou 64 bits
ID_DomainJoinValidator (IDomainJoinValidator) Dispose de certaines méthodes pour vérifier si un ensemble d’informations d’identification est autorisé à joindre un domaine
ID_DriveList (IDriveList, IBindableList, IWizardComponent) Utilise WMI pour obtenir la liste des lecteurs sur votre ordinateur
ID_WiredNetworkTask (ITask) Tâches qui vérifient si vous êtes connecté au réseau avec une carte réseau câblée (au lieu de sans fil)

Composants de contrôle

Vous interagissez avec les contrôles de votre page via la fonction de modèle GetControlWrapper , qui permet d’accéder à l’un des types de composants répertoriés dans le tableau 6.

Tableau 6. Composants

Types de contrôle de boîte de dialogue Description
CONTROL_CHECK_BOX (ICheckBox) Une façade pour travailler avec des contrôles de case activée
CONTROL_COMBO_BOX (IComboBox) Une façade pour les contrôles de zone de liste déroulante
CONTROL_GENERIC (IControl) Vous permet d’utiliser la plupart des types de contrôles pour contrôler l’activation et l’état visible
CONTROL_LIST_VIEW (IListView) Façade donnant accès aux fonctionnalités d’un contrôle d’affichage de liste
CONTROL_PROGRESS_BAR (IProgressBar) Une façade pour travailler avec la position d’un contrôle de barre d’avancement
CONTROL_RADIO_BUTTON (IRadioButton) Une façade pour travailler avec des commandes par bouton radio
CONTROL_STATIC_TEXT (IStaticText) Façade qui fournit une autorisation de lecture/écriture au texte d’un contrôle, par exemple, une étiquette ou une zone de texte
CONTROL_TREE_VIEW (ItreeView) Une façade pour travailler avec une commande d’arborescence

Composant de liste d’images

Ce composant est une façade pour un contrôle ImageList sur votre page. Vous créez une liste d’images via l’interface IListView ou ITreeView .

Composant FormController

L’Assistant crée ce composant pour vous et le transmet à votre page. Vous y accédez à partir de votre page en utilisant la méthode Form , que la classe de base WizardPageImpl implémente.

Composant InvalidCharacterValidator

Il s’agit d’un type de validateur que vous pouvez inclure dans une page. L’ID est ID_InvalidCharactersValidator (défini dans IValidator.h) et a une valeur de texte « Microsoft.Wizard.Validation.InvalidChars ».

Ce validateur recherche une seule propriété (un élément Setter dans le fichier .config) appelée InvalidChars, qui est une liste de caractères non autorisés. Il vérifie les caractères dans une zone de texte ; Si le texte contient des caractères de cette liste, le composant signale un échec.

Composant NonEmptyValidator

Il s’agit d’un type de validateur que vous pouvez inclure dans une page. L’ID est ID_NonEmptyValidator (défini dans IValidator.h), qui a une valeur de texte « Microsoft.Wizard.Validation.NonEmpty ».

Ce validateur signale un échec si la zone de texte (ou tout autre contrôle prenant en charge IStaticText) a une valeur de chaîne vide.

Composant PasswordValidator

Il s’agit d’un type de validateur que vous pouvez inclure dans une page. L’ID est ID_PasswordValidator (défini dans IValidator.h), dont la valeur texte est « Microsoft.Wizard.Validation.Password ».

Ce validateur fonctionne avec deux contrôles de texte différents (contrôles qui prennent en charge IStaticText) et signale un échec s’ils ne contiennent pas les mêmes valeurs. En d’autres termes, il échoue si les zones de texte Mot de passe et Confirmer le mot de passe ne correspondent pas.

Étant donné que ce validateur nécessite deux contrôles, il nécessite plus de configuration que les autres validateurs. La configuration peut ressembler à ceci :

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

Tout d’abord, vous définissez le contrôle Confirmer le mot de passe en tant qu'« enfant » du contrôle de mot de passe . De cette façon, si le contrôleur de formulaire désactive le contrôle de mot de passe , il désactive également le contrôle de confirmation de mot de passe . Ensuite, ajoutez un validateur de mot de passe au formulaire. Enfin, fournissez au validateur de mot de passe l’interface pour le contrôle Confirmer le mot de passe .

En raison de la nécessité de deux contrôles, vous devez utiliser du code pour configurer ce validateur plutôt que le fichier XML .config.

Composant RegExValidator

Il s’agit d’un type de validateur que vous pouvez inclure dans une page. L’ID est ID_RegExValidator (défini dans IValidator.h), qui a une valeur de texte « Microsoft.Wizard.Validation.RegEx ».

Ce validateur compare le contenu d’un contrôle de texte (qui prend en charge IStaticText) à une expression régulière et échoue si le texte ne correspond pas à l’expression régulière.

Vous pouvez également utiliser ce validateur avec un modèle nommé prédéfini. Pour utiliser une expression régulière, le XML doit contenir une propriété setter appelée Pattern. Si vous souhaitez utiliser un modèle nommé à la place, utilisez un setter nommé NamedPattern défini sur l’une des valeurs du tableau 7.

Tableau 7. Créateurs de modèles nommés

Pattern Description
Nom d’utilisateur Vérifie que le texte appartient au domaine de formulaire\utilisateur ou au user@domain
ComputerName Le nom doit comporter entre 1 et 15 caractères et ne peut pas inclure un ensemble de caractères (tels que : et ?)
Workgroup Le nom doit comporter entre 1 et 15 caractères et ne peut pas contenir un ensemble de caractères (par exemple, =, + et ?)

Composant FactoryRegistry

Ce composant garde une trace de toutes les usines et services de classe. Il implémente l’interface IFactoryRegistry et est disponible indirectement via la méthode Container de votre page. En outre, le Registre charge les DLL d’extension. Après avoir chargé une DLL, le Registre recherche une fonction exportée appelée RegisterFactories. Vous devez implémenter cette fonction et y enregistrer les fabriques de classes pour vos pages, tâches et validateurs (et toutes les autres fabriques de classes que vous souhaitez enregistrer). Voici un exemple tiré de l’exemple de projet :

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

Composant enregistreur

Ce composant est disponible pour votre page via la méthode Logger (implémentée par WizardPageImpl). Vous utilisez cette méthode pour écrire des entrées dans le fichier journal. Le contenu du fichier journal est utile pour diagnostiquer les problèmes que les utilisateurs peuvent rencontrer lors de l’exécution de l’assistant UDI.

PropertyBag Component

Le sac de propriétés est un conteneur pour les variables de mémoire. Il est disponible depuis votre page en utilisant Container()->Properties(). Les variables de mémoire sont utiles pour transmettre des données temporaires entre différentes pages.

Composants TSVariableBag et TSRepository

Le composant TSVariableBag vous permet de lire et d’écrire des variables de séquence de tâches. Elle conserve les valeurs en mémoire jusqu’à ce que l’utilisateur sélectionne Terminer (par défaut). Vous pouvez accéder au sac TSVariable via la méthode TSVariables de la page (implémentée par la classe de base WizardPageImpl ). Ces composants enregistrent toutes les lectures et écritures des variables de séquence de tâches.

Composant WmiRepository

Ce composant offre une façade pour l’utilisation des requêtes WMI. Vous pouvez appeler la fonction d’assistance CreateInstance avec ID_WmiRepository pour obtenir une instance de ce composant, qui prend en charge l’interface IWmiRepository. Ce composant renvoie les enregistrements de résultats via l’interface IWmiIterator .

Classes d’assistance de page de l’Assistant

Vous pouvez créer des pages d’assistant UDI personnalisées en utilisant les classes d’assistance intégrées fournies avec le SDK UDI. Le tableau 8 répertorie les classes d’assistance que vous pouvez utiliser pour créer des pages d’Assistant personnalisées.

Tableau 8. Classes d’assistance

Classe d’assistance Description
Classe ClassFactoryImpl Il s’agit d’une classe de base utile pour créer une fabrique de classes que vous pouvez ensuite inscrire auprès du registre de fabrique.
Classe de modèle d’interface Utilisez cette classe de modèle lorsque vous souhaitez créer un composant qui implémente plusieurs interfaces.
Classe d’assistance de chemin d’accès Cette classe fournit des opérations de fichiers/répertoires courantes.
Classe de modèle de pointeur Cette classe fournit un comptage de référence pour la gestion de la durée de vie dans les composants COM. Il est important de libérer les interfaces lorsque vous en avez terminé. Cette classe de modèle gère automatiquement la durée de vie.
Classe PUnknown Cette classe est un pointeur intelligent spécifique à l’interface IUnknown. Pour toutes les autres interfaces, utilisez la classe de modèle Pointer.
Classe d’assistance StringUtil Cette classe fournit des méthodes d’assistance qui facilitent l’utilisation des chaînes.
Classe de modèle SubInterface Cette classe de base facilite l’implémentation d’un composant qui prend en charge une interface qui hérite elle-même d’une autre interface.
Classe de modèle UnknownImpl Cette classe gère la plupart des détails de la création d’un composant COM.
Classe de modèle WizardComponent Cette classe de base est utilisée pour créer des composants qui ont besoin d’accéder aux services de l’Assistant, tels que la création et la journalisation de composants.
Classe de modèle WizardPageImpl Cette classe de base doit être utilisée comme classe de base pour toutes les pages d’Assistant personnalisé

Classe ClassFactoryImpl

Il s’agit d’une classe de base utile pour créer une fabrique de classes que vous pouvez ensuite inscrire auprès du registre de fabrique.

Ce qui suit est un extrait du fichier LocationPage.h dans l’exemple de projet pour définir la classe ClassFactoryImpl .

#pragma once

#include "ClassFactoryImpl.h"

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

L’exemple suivant est un extrait du fichier LocationPage.cpp de la page de l’Assistant Exemple utilisée pour définir la fabrique de classes pour la page.

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

Classe de modèle d’interface

Utilisez cette classe de modèle lorsque vous souhaitez créer un composant qui implémente plusieurs interfaces, par exemple :

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

Ce code crée une chaîne de classes de base qui prend en charge à la fois IFieldCalback et les interfaces prises en charge par WizardPageImpl ( IWizardPage).

Classe d’assistance de chemin d’accès

Cette classe fournit des opérations courantes sur les fichiers/répertoires :

static inline std::wstring GetModulePath(HINSTANCE hModule)

Elle renvoie également le chemin d’accès complet au fichier .exe ou .dll avec le instance que vous fournissez à cette méthode :

static inline std::wstring GetModuleFilename(HINSTANCE hModule)

La classe renvoie le chemin d’accès complet et le nom de fichier du .exe et .dll fichier avec le descripteur instance que vous fournissez à cette méthode :

static inline std::wstring GetDirectoryName(LPCWSTR fullName)

. . . ou simplement le chemin d’accès lors de la suppression du nom de fichier :

static inline std::wstring GetFileName(LPCWSTR fullName)

Étant donné un chemin d’accès avec un nom de fichier, la classe d’assistance de chemin renvoie uniquement le nom de fichier :

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

Enfin, la classe retourne une nouvelle chaîne qui est le chemin d’accès et le nom de fichier combinés (ou un autre chemin d’accès).

Classe de modèle de pointeur

Cette classe est définie dans Pointer.h. Étant donné que les composants COM utilisent le comptage des références pour la gestion de la durée de vie, il est important que vous supprimiez toujours les interfaces lorsque vous avez terminé avec elles. Microsoft fournit une classe de modèle qui gère automatiquement la durée de vie. Par exemple, si vous voulez un pointeur intelligent pour une interface XML, vous pouvez écrire quelque chose comme ceci :

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

La première ligne définit le pointeur intelligent. La deuxième ligne montre la récupération d’un pointeur intelligent via un autre appel. L’opérateur& libère toujours une interface existante si elle en contient une et renvoie l’adresse du pointeur interne. Une fois que vous avez récupéré un pointeur comme celui-ci, l’instance de pointeur appelle Release pour vous lorsque la variable sort de l’étendue. Microsoft vous recommande d’utiliser des pointeurs intelligents au lieu d’appeler AddRef et Release manuellement.

En outre, la classe de pointeur intelligent Pointer appelle QueryInterface pour récupérer d’autres interfaces pour vous. Par exemple, lorsque le registre d’usine crée une nouvelle instance d’un composant, il dispose d’un code comme celui-ci :

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

La première ligne appelle QueryInterface en arrière-plan pour demander l’interface IWizardComponent . Le pointeur intelligent résultant sera égal à nullptr si le composant ne prend pas en charge cette interface.

Classe PUnknown

Cette classe est un pointeur intelligent spécifique à l’interface IUnknown . Pour toutes les autres interfaces, utilisez la classe de modèle Pointer .

Classe d’assistance StringUtil

Cette classe est définie dans Utilities.h et fournit des méthodes d’assistance qui facilitent l’utilisation des chaînes :

static inline int CompareIgnore(LPCWSTR first, LPCWSTR second)

Cette méthode compare deux chaînes tout en ignorant la casse (voir tableau 9).

Tableau 9. Classe d’assistance StringUtil

Renvoie Description
0 Les chaînes correspondent, en ignorant la casse
<0 Première < seconde
>0 Première > seconde

Voici un exemple :

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

Ces méthodes sont un peu comme les méthodes Microsoft .NET Format dans le sens où les paramètres sont sous la forme de {0}. Toutefois, ils n’effectuent aucune mise en forme de l’entrée, juste une substitution :

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)

Il s’agit d’enveloppes autour de StringCchPrintf qui renvoient une chaîne wstring , de sorte que vous n’avez pas à allouer de mémoire pour les chaînes ou les tampons vous-même.

Classe de modèle SubInterface

Cette classe de base facilite l’implémentation d’un composant qui prend en charge une interface qui hérite elle-même d’une autre interface. Par exemple, l’interface ICheckBox hérite d’IControl. Voici comment cette classe est utilisée pour définir le CheckBoxWrapper :

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

L’interface de base est le premier paramètre, tandis que l’interface dérivée est le second.

Classe de modèle UnknownImpl

Cette classe est définie dans UnknownImpl.h et gère la plupart des détails de la création d’un composant COM. Voici un exemple d’utilisation de cette classe de base :

classDirectory :public UnknownImpl<IDirectory>

Ce code définit une classe qui prend en charge l’interface IDirectory .

Classe de modèle WizardComponent

Cette classe est définie dans IWizardComponent.h et constitue une classe de base utile pour créer des composants qui ont besoin d’accéder aux services de l’Assistant, tels que la création et la journalisation de composants.

À titre d’exemple, voici comment le composant CopyFilesTask est défini :

classCopyFilesTask :public WizardComponent<ITask>
{
    ...

Le paramètre de cette classe de modèle est l’interface « principale » que vous souhaitez utiliser pour votre composant, qui dans le cas des tâches est ITask. L’utilisation de WizardComponent signifie que votre composant prend en charge à la fois l’interface que vous fournissez (ITask dans cet exemple) et IWizardComponent.

Chaque fois que vous utilisez le registre de fabrique de classes pour créer un composant, le registre appelle la méthode IWizardComponent-SetContainer> du composant pour fournir l’accès de votre composant aux services de l’assistant.

Classe de modèle WizardPageImpl

Utilisez cette classe comme classe de base pour vos pages personnalisées, par exemple :

class LocationPage :public WizardPageImpl<IDD_LOCATION_PAGE>

Le paramètre est l’ID de ressource pour votre modèle de boîte de dialogue.

Interfaces de page de l’Assistant

L’assistant UDI utilise des interfaces pour accéder aux différents contrôles de votre page. Dans votre page, vous utilisez la fonction GetControlWrapper pour récupérer un wrapper de contrôle. Voici un exemple :

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

Ici, PStaticText est un pointeur intelligent vers l’interface IStaticText . Les pointeurs intelligents appellent automatiquement la méthode COM Release() lorsqu’ils sortent de l’étendue ou que vous transmettez l’adresse d’une variable (comme &pFormat) à une méthode.

IADHelper Interface

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

Initialisez ce composant, en le transmettant à l’enregistreur afin qu’il puisse enregistrer des informations.

HRESULTValidLogon(LPCTSTR userName, LPCTSTR password, LPCTSTR domain)

Cette méthode vérifie si un ensemble d’informations d’identification est valide, comme indiqué dans le tableau 10.

Tableau 10. HResultValidLogon

HResult Description
S_OK Les informations d’identification sont valides
S_FALSE Les informations d’identification ne sont pas valides
E_FAIL Impossible de localiser le contrôleur de domaine ; Pour plus d’informations, consultez les journaux de case activée
HRESULT HasAccess(LPCTSTR username, LPCTSTR password, LPCTSTR domain, LPCTSTR domain, LPCTSTR computerName, LPCTSTR accountDomain)

Cette méthode vérifie si un ensemble d’informations d’identification dispose d’un accès en lecture/écriture à l’objet ordinateur dans AD DS, comme indiqué dans le tableau 11.

Tableau 11. HResult HasAccess

[HRESULT] Description
S_OK L’utilisateur a accès
E_FAIL L’utilisateur n’y a pas accès. Pour plus d’informations, consultez le fichier journal.

IBackgroundTask Interface

__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);
};
Vue d’ensemble

La page de progression utilise cette classe pour exécuter des tâches sur un thread distinct. Vous pouvez également utiliser cette classe chaque fois que vous souhaitez effectuer des opérations sur un thread distinct. Les tâches sont n’importe quelle classe qui prend en charge l’interface ITask .

Cette interface est implémentée par le composant ID_BackgroundTask (« Microsoft.Wizard.BackgroundTask »), défini dans l’interface IBackgroundTask.h.

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

Cette interface initialise le composant, comme indiqué dans le tableau 12.

Tableau 12. HRESULT Init

Paramètre Description
Tâche pTask Pointeur vers la classe qui contient le code que vous souhaitez exécuter sur un autre thread
Id Un nombre que vous pouvez utiliser dans la méthode Finished du rappel pour indiquer quelle tâche s’est exécutée ; Utile si vous démarrez plusieurs tâches avec la même méthode de rappel
Rappel Classe qui implémente la méthode Finished , qui est appelée chaque fois qu’une tâche se termine ; l’appel à la méthode Finished se fera sur le thread d’arrière-plan, et non sur le thread d’interface utilisateur
void Start(void)

Cette méthode démarre la tâche sur un thread d’arrière-plan et renvoie les éléments indiqués dans le tableau 13.

Tableau 13. Retourner le thread d’arrière-plan

Renvoie Description
E_INVALIDARG La tâche est déjà en cours d’exécution, vous ne pouvez donc pas la démarrer immédiatement.
E_FAIL Un problème est survenu pour démarrer le thread.
S_OK Le thread a été lancé.
BOOL Running()

Cette méthode renvoie TRUE si la tâche en arrière-plan est en cours d’exécution et FALSE si elle n’est pas en cours d’exécution.

HRESULT Wait(DWORD, waitMilliseconds)

Cette méthode attend que le thread cesse de s’exécuter ou que le nombre de millisecondes se soit écoulé.

HRESULT Terminate(DWORD, exitCode)

Cette méthode arrête le thread en cours d’exécution (voir Tableau 14 et Tableau 15). L’exécution de ce processus peut prendre un certain temps après le retour de cette méthode.

Tableau 14. HRESULT Terminer le code de sortie

Paramètre Description
exitCode Code de sortie qui sera envoyé à la méthode de rappel terminée, qui sera également disponible à partir de la méthode GetExitCode .

Tableau 15. Codes de résiliation

Renvoie Description
E_FAIL L’appel à arrêter a échoué.
S_OK La demande de fin du thread a réussi.
HRESULT GetExitCode(LPDWORD, pCode, HRESULT *pHresult)

Utilisez cette méthode pour obtenir les résultats de l’exécution de la tâche sur le thread d’arrière-plan (voir tableau 16).

Tableau 16. Codes de résultat

Paramètre Description
pCode (en anglais) Pointeur vers un DWORD qui sera défini sur return ou nullptr si vous n’avez pas besoin de la valeur de retour. À la fermeture, ce paramètre est défini sur STILL_ACTIVE si le thread est en cours d’exécution, le code renvoyé par la méthode Execute de la tâche ou la valeur transmise à la méthode Terminate si vous avez appelé cette méthode.
pHresult Pointeur vers un HRESULT qui sera défini sur return ou nullptr si vous n’avez pas besoin de la valeur HRESULT .
HRESULT Close(void)

Cette méthode libère le thread d’arrière-plan. Il retourne E_INVALIDARG si le thread est en cours d’exécution et S_OK dans le cas contraire.

ICheckBox Interface

__interface ICheckBox : IControl
{
    void Check(BOOL check);
    BOOL IsButtonChecked();
};
void Check(BOOL case activée)

Définissez l’état activé de la case à case activée. Lorsque la méthode a la valeur VRAI, la zone case activée est activée ; lorsque la méthode a la valeur FAUX, la zone case activée est désactivée.

BOOL IsButtonChecked()

Cette méthode signale l’état actuel de la case activée d’une case activée.

IComboBox Interface

__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();
};
Vue d’ensemble

Cette interface est implémentée par le composant CheckBoxWrapper . Vous récupérez un instance de ce composant à l’aide de la fonction d’assistance GetControlWrapper de type CONTROL_COMBO_BOX.

HRESULT Bind([in] IBindableList *pList)

Utilisez cette méthode lorsque vous disposez d’une source de données qui implémente l’interface IBindableList . La zone de liste initialise le contenu avec les légendes de cette liste.

HRESULT Select(int index)

Sélectionnez l’élément dans la zone de liste déroulante de l’index.

int Selected(void)

Cette méthode retourne l’index de l’élément sélectionné ou -1 si rien n’est sélectionné.

void Add([in] LPCTSTR légende)

Ajoutez manuellement un élément à la zone de liste modifiable.

HRESULT GetText([out, retval] LPBSTR pText)

Récupérez la chaîne de l’élément actuellement sélectionné dans la zone de liste modifiable.

void Clear()

Supprimez tous les objets de la zone de liste modifiable.

Interface de contrôle

__interface IControl : IUnknown
{
    HRESULT SetEnable(BOOL enable);
    BOOL IsEnabled(void);
    HRESULT SetVisible(BOOL visible);
};
Vue d’ensemble

Cette interface est implémentée par le composant ControlWrapper . Vous récupérez un instance de ce composant à l’aide de la fonction d’assistance GetControlWrapper de type CONTROL_GENERIC.

HRESULT SetEnable(BOOL enable)

Activez ou désactivez le contrôle.

BOOL IsEnabled(void)

Renvoie TRUE si le contrôle est activé et FALSE dans le cas contraire.

HRESULT SetVisible(BOOL visible)

Afficher ou masquer le contrôle.

ICpuInfo Interface

__interface ICpuInfo : IUnknown
{
    BOOL Is64Bit(void);
};
Vue d’ensemble

Pour obtenir cette interface, il faut créer un nouveau composant ID_CpuInfo . La méthode unique indique si le processeur est 32 ou 64 bits. Notez que si vous disposez d’un système d’exploitation 32 bits sur un ordinateur 64 bits, cette méthode renvoie TRUE, car elle signale uniquement la largeur du processeur (et non le système d’exploitation).

Interface d’établissement
__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);
};
Vue d’ensemble

Le composant Directory , que vous créez à l’aide de ID_Directory, fournit une façade pour l’utilisation des répertoires dans le système de fichiers.

BOOL FileExists(LPCWSTR name)

Cette méthode renvoie TRUE s’il existe un fichier portant le nom que vous fournissez.

BOOL FindFirst([in] LPCWSTR name)

Cette méthode trouve une première correspondance pour le nom que vous fournissez. Elle prend en charge les caractères génériques et renvoie les noms de fichiers et de répertoires. La méthode renvoie VRAI si une correspondance a été trouvée, FAUX dans le cas contraire.

HRESULT FoundName([out, retval] LPBSTR name)

Cette méthode récupère le nom du fichier trouvé avec un appel à FindFirst ou FindNext.

DWORD FoundAttributes(void)

Cette méthode renvoie l’attribut du fichier ou du répertoire le plus récent trouvé. Vous pouvez utiliser le code suivant pour vérifier s’il s’agit d’un répertoire :

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

Trouvez le suivant. Cette méthode renvoie VRAI si une autre correspondance est trouvée, FAUX dans le cas contraire.

void FinishFind(void)

Cette méthode libère les ressources utilisées pour l’opération Rechercher.

IDomainJoinValidator Interface

__interface IDomainJoinValidator : IUnknown
{
    HRESULT Init(ILogger *pLogger, IWizardPageContainer *pContainer, IStaticText *pUsername, IStaticText *pPassword, IStaticText *pComputerName);
    HRESULT IsUsernameValid(LPCWSTR domainName);
    BOOL CanModifyComputerAdEntry(LPCWSTR domainName);
};
Vue d’ensemble

Vous obtenez une instance de cette interface en utilisant la valeur ID_DomainJoinValidator à la fonction de modèle CreateInstance.

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

Initialisez l’instance, comme indiqué dans le tableau 17.

Tableau 17. HRESULT Init - Initialisation d’instance

Paramètre Description
pLogger L’instance de l’enregistreur d’événements (Logger), disponible pour votre page via la méthode Logger de la page
Conteneur Transmet les résultats de la méthode Container de votre page
pUsername Zone de texte contenant le nom d’utilisateur à valider
Mot de passe La zone de texte qui contient le mot de passe à valider
PComputerName Zone de texte qui contient le nom de l’ordinateur qui sera finalement joint au domaine
HRESULT IsUsernameValid(LPCWSTR domainName)

Cette méthode utilise la méthode IADHelper-ValidLogon> pour effectuer le travail. Pour plus d’informations, consultez cette méthode.

BOOL CanModifyComputerAdEntry(LPCWSTR domainName)

Vérifiez si l’utilisateur dispose des droits nécessaires pour modifier l’entrée de l’ordinateur. La majeure partie du travail est effectuée par IADHelper-HasAccess>. Si cette méthode renvoie FALSE, case activée le fichier journal pour plus d’informations.

IDriveList Interface

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

Appelez cette méthode avant d’appeler d’autres composants. Vous devez créer un nouveau WmiRepository avant d’appeler cette méthode.

HRESULT SetWhereClause(LPCTSTR whereClause)

Cette méthode vous permet d’ajouter du texte qui apparaîtra sous la forme d’une clause « where » dans la requête. Par exemple, la ligne suivante renvoie uniquement les lecteurs USB :

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

Définissez la taille minimale du lecteur, en octets, pour les lecteurs qui seront retournés par la requête.

HRESULT Update(void)

il exécute la requête. La liste des lecteurs disponibles après l’appel de cette méthode est triée par lettre de lecteur.

HRESULT AddProperty(ENUM_DISK_QUERY_SECTION section, LPCTSTR propName, LPCTSTR propNameReturned)

Cette méthode ajoute les noms des propriétés supplémentaires que vous souhaitez rendre disponibles dans les résultats de la requête. Appelez cette méthode avant d’appeler Update. Le tableau 18 montre trois des propriétés utiles.

Tableau 18. HRESULT AddProperty : propriétés utiles

Section Propriété Description
DISKQUERY_LOGICALDISK Size Taille, en octets, représentée sous forme de chaîne
DISKQUERY_DISKPARTITION Index du disque Numéro du disque sous forme d’entier, commençant par 0
DISKQUERY_LOGICALDISK VolumeName L’étiquette du volume
size_t Count(void)

Nombre d’enregistrements renvoyés par la requête. Appelez Update avant d’appeler cette méthode.

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

Cette méthode récupère la valeur d’une propriété à partir des résultats de la requête, comme indiqué dans le tableau 19.

Tableau 19. HRESULT GetProperty

Paramètre Description
Index Index de base zéro vers l’enregistrement de résultat
propName Nom de la propriété, par exemple « Taille »
Valeur En retour, ce paramètre contient une valeur variante de la propriété
HRESULT GetCaption(size_t index, LPBSTR pCaption)

Cette méthode récupère la légende d’un enregistrement identique à la propriété Caption.

IImageList Interface

__interface IImageList
{
    HRESULT CreateImageList(int width, int height, UINT flags);
    HImageList GetImageList(void);
    int AddImage(HInstance hInstance, int resourceId);
};
Vue d’ensemble

Cette interface est implémentée par le composant ImageList . Vous récupérez une instance de ce composant à partir de l’interface IListView.

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

Créez une nouvelle liste d’images gérée par ce composant. Appelez cette méthode une seule fois.

HImageList GetImageList(void)

Cette méthode renvoie le handle de la liste d’images au cas où vous auriez besoin d’effectuer d’autres opérations sur cette liste.

int AddImage(HInstance hInstance, int resourceId)

Ajoutez une nouvelle image à la liste des images à partir d’une ressource, comme indiqué dans le tableau 20.

Tableau 20. HRESULT IImageList Interface

Paramètre Description
hInstance Descripteur d’instance du module qui contient la ressource bitmap
resourceId ID de la ressource à charger dans la liste d’images

IListView Interface

__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);
};
Vue d’ensemble

Cette interface est implémentée par le composant ControlWrapper . Vous récupérez un instance de ce composant à l’aide de la fonction d’assistance GetControlWrapper de type CONTROL_LIST_VIEW.

int AddItem([in] LPCTSTR text)

Ajoutez une nouvelle ligne à la zone de liste. La méthode renvoie l’index de l’élément qui vient d’être ajouté.

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

Ajoutez une nouvelle colonne à l’affichage sous forme de liste.

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

Définissez le texte dans une colonne autre que la première colonne de la zone de liste, comme indiqué dans le tableau 21.

Tableau 21. HRESULT SetSubItem

Paramètre Description
index Index de l’élément de liste que vous souhaitez modifier
la colonne Index de la colonne à mettre à jour ; la première colonne est définie avec AddItem, les colonnes deux et suivantes sont définies avec cette méthode
text Chaîne à afficher dans la colonne
int GetWidth(void)

Cette méthode renvoie la largeur de la zone de texte entière.

void SetExtendedStyle(DWORD style)

Cette méthode vous permet de définir des styles étendus dans la zone de liste, par exemple :

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

Cette méthode renvoie l’index de l’élément d’affichage de liste actuellement sélectionné.

HRESULT SelectItem(int index)

Définissez l’élément sélectionné dans la liste sur cet index.

BOOL IsItemChecked(int index)

Cette méthode renvoie VRAI si un élément de la liste est sélectionné. Cette méthode nécessite que vous appeliez SetExtendedStyle pour définir le style de la case à case activée.

int GetItemCount(void)

Cette méthode renvoie le nombre d’éléments dans l’affichage liste.

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

Créez une liste d’images et attachez-la à l’affichage sous forme de liste.

int AddImage(HINSTANCE hInstance, int resourceId)

Ajoutez une image à la liste d’images de l’affichage de liste. Vous devez d’abord appeler CreateImageList.

HRESULT SetImage(int index, int imageIndex)

Définissez l’image qui s’affichera sur le côté gauche d’un élément d’affichage de liste spécifique.

HRESULT Clear(void)

Supprimez tous les éléments de l’affichage liste.

IProgressBar Interface

__interface IProgressBar : IControl
{
    HRESULT SetPercentage(int position);
    int GetPercentage(void);
};
Vue d’ensemble

Cette interface est implémentée par le composant ProgressBarWrapper . Vous récupérez une instance de ce composant à l’aide de la fonction d’assistance GetControlWrapper de type CONTROL_PROGRESS_BAR.

HRESULT SetPercentage(int position)

Définissez la position de la barre de progression à l’aide d’un nombre compris entre 0 et 100. Par défaut, les nouvelles barres de progression Win32® ont une plage maximale de 100.

int GetPercentage(void)

Cette méthode renvoie la position actuelle de la barre de progression.

IRadioButton Interface

__interface IRadioButton : IControl
{
public:
    void SetGroup(int firstId, int lastId);
    void CheckRadio(int id);
    BOOL IsButtonChecked(int id);
    void EnableRadio(int id, BOOL enable);
};
Vue d’ensemble

Cette interface est implémentée par le composant RadioButtonWrapper . Vous récupérez un instance de ce composant à l’aide de la fonction d’assistance GetControlWrapper de type CONTROL_RADIO_BUTTON.

void SetGroup(int firstId, int lastId)

Fournissez à l’enveloppe la plage de cases d’option qui doit être traitée en tant que groupe. Appelez cette méthode avant d’appeler CheckRadio.

void CheckRadio(int id)

Définissez la case d’option spécifique pour qu’elle soit la seule du groupe de cases d’option sélectionnées. Appelez SetGroup avant d’appeler cette méthode.

BOOL IsButtonChecked(int id)

Cette méthode renvoie TRUE si la case d’option est actuellement sélectionnée, FALSE dans le cas contraire.

void EnableRadio(int id, BOOL enable)

Cette méthode active ou désactive une case d’option.

IStaticText Interface

__interface IStaticText : IControl
{
    HRESULT SetText([in] LPCTSTR pText);
    HRESULT GetText([out, retval] LPBSTR pText);
};
Vue d’ensemble

Cette interface est implémentée par le composant StaticTextWrapper . Vous récupérez un instance de ce composant à l’aide de la fonction d’assistance GetControlWrapper de type CONTROL_STATIC_TEXT.

HRESULT SetText([in] LPCTSTR pText)

Définissez le texte du contrôle.

HRESULT GetText([out, retval] LPBSTR pText)

Cette méthode renvoie la valeur actuelle du texte du contrôle.

ITask Interface

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

Implémentez cette interface si vous souhaitez que votre composant soit disponible en tant que tâche dans la page de contrôle en amont ou si vous souhaitez utiliser le composant BackgroundTask pour effectuer un travail sur un thread d’arrière-plan.

Voici les composants qui implémentent l’interface 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 vous écrivez une tâche pour la page de contrôle en amont, appelez cette méthode pour initialiser votre tâche. Le fichier .config contient du code XML qui peut ressembler à ceci :

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

Le paramètre pProperties donne accès aux trois valeurs de setter, tandis que le paramètre pTaskSettings donne accès à l’élément Task et à ses enfants. La plupart des tâches n’ont besoin que de lire les données du paramètre pProperties .

Exécuter
HRESULT Execute(LPDWORD pReturnCode)

C’est ici que vous écrivez le code qui effectue la tâche. Cette méthode doit retourner S_OK s’il n’y a pas d’erreurs, et elle peut retourner un autre HRESULT si une erreur s’est produite pendant l’exécution de la tâche. Les valeurs autres que S_OK renvoyées par cette méthode sont mises en correspondance avec <les éléments d’erreur> de la <section ExitCodes> si vous utilisez la page de contrôle en amont.

Le paramètre pReturnCode doit être mis à jour avec un nombre qui indique l’état de la tâche. Ces valeurs sont mises en correspondance entre la page de contrôle en amont et <les éléments ExitCode> .

ITreeView Interface

__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);
};
Vue d’ensemble

Cette interface est implémentée par le composant TreeViewWrapper . Vous récupérez un instance de ce composant à l’aide de la fonction d’assistance GetControlWrapper de type CONTROL_TREE_VIEW.

void EnableCheckboxes(void)

Cette méthode active les zones case activée dans le contrôle d’arborescence en définissant le style TVS_CHECKBOXES.

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

Ajoutez une nouvelle liste d’images au contrôle d’arborescence. Le paramètre flags est passé dans l’appel à la fonction ImageList_Create Win32.

int AddImage(HINSTANCE hInstance, int resourceId)

Ajoutez une image à la liste des images à partir d’une ressource (resourceId) dans le module avec le handle d’instance hInstance.

HTREEITEM AddItem(LPCTSTR text, HTREEITEM hParent = NULL)

Ajoutez un nœud à l’arborescence. Le nouveau nœud est ajouté au niveau supérieur si hParent a la valeur NULL. Sinon, fournissez le handle de l’élément parent où vous souhaitez ajouter le nouvel élément. Cette méthode renvoie le handle au nouvel élément.

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

Définit l’image à utiliser pour un élément d’arborescence. Vous pouvez définir à la fois l’image normale et l’image développée.

void Clear(void)

Supprimez tous les éléments de l’arborescence.

BOOL SetFirstVisible(HTREEITEM item)

Assurez-vous que l’élément d’arborescence est visible. L’arborescence défile si nécessaire pour rendre cet élément visible.

BOOL SelectItem(élément HTREEITEM)

Définissez l’élément actuellement sélectionné sur l’élément que vous fournissez. Vous pouvez appeler SetFirstVisible après cela pour vous assurer que l’élément nouvellement sélectionné est visible.

void CheckItem(élément HTREEITEM, UINT checkState)

La méthode définit essentiellement l’image qui sera affichée pour la zone case activée dans l’arborescence. Ces images se trouvent dans un contrôle ImageList distinct géré par l’arborescence. Par défaut, cette liste d’images contient trois images, présentées dans le tableau 22.

Table 22.void CheckItem Image List Default

checkState Description
0 Vide
1 Désactivé
2 Sélectionné
HTREEITEM SelectedItem(void)

Cette méthode renvoie le handle de l’élément d’arborescence actuellement sélectionné.

int SetItemHeight(SHORT height)

Cette méthode définit la hauteur de tous les éléments du contrôle d’arborescence en pixels. Elle renvoie la hauteur précédente, en pixels.

HRESULT EnableItem(élément HTREEITEM, BOOL enable)

Cette méthode active ou désactive un seul élément de l’arborescence. La désactivation d’un élément avec des enfants ne désactive pas les enfants.

void Expand(HTREEITEM, hItem, BOOL expand)

Cette méthode développe ou réduit un nœud dans l’arborescence.

HTREEITEM GetChild(HTREEITEM hParent)

Cette méthode renvoie le premier enfant d’un élément d’arborescence ou NULL s’il n’y a pas d’enfants.

HTREEITEM GetParent(HTREEITEM, hNode)

Cette méthode renvoie le handle du parent d’un nœud dans l’arborescence ou NULL si le nœud est au niveau supérieur.

HTREEITEM GetNextItem(HTREEITEM hPrevious)

Vous pouvez appeler cette méthode avec un handle que GetChild retourne pour itérer sur tous les enfants d’un nœud. Cette méthode retourne le frère suivant dans l’arborescence qui partage le même parent.

UINT IsChecked(élément HTREEITEM)

Cette méthode renvoie 0 si le nœud d’arborescence n’est pas sélectionné et 1 s’il l’est.

BOOL IsEnabled(élément HTREEITEM)

Cette méthode renvoie TRUE si le nœud d’arborescence est activé, FALSE dans le cas contraire.

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

Cette méthode est à usage interne uniquement.

HRESULT SetEventHandler(ITreeViewEvent *pEventHandler)

Appelez cette méthode si vous souhaitez recevoir une notification lorsque l’élément sélectionné change ou que l’utilisateur modifie l’état de case activée d’un élément d’arborescence. Vous devez implémenter ITreeViewEvent dans votre composant pour recevoir ces rappels.

void SetSelectedBackColor(COLORREF color)

Définissez la couleur d’arrière-plan utilisée pour l’élément sélectionné.

IWmiIteration Interface

__interface IWmiIterator : IUnknown
{
    HRESULT Next(void);
    HRESULT GetProperty(LPCTSTR propertyName, [out] LPVARIANT pValue);
};
Vue d’ensemble

Vous utilisez généralement cette interface, avec IWmiRepository, lorsque vous travaillez avec des appels WMI. L’interface IWmiIteration vous permet d’itérer dans les valeurs renvoyées par une requête.

HRESULT Next(void)

Passer à l’élément suivant des résultats de la requête, comme indiqué dans le tableau 23.

Tableau 23. HRESULT : la requête suivante (void) renvoie

HRRESULT Description
S_OK Déplacé au résultat suivant ; vous pouvez utiliser GetProperty pour récupérer les propriétés de ce résultat.
S_FALSE Il n’y a plus d’éléments dans la liste.
E_NOT_SET Il n’y a aucun résultat de requête
HRESULT GetProperty(LPCTSTR propertyName, [out] LPVARIANT pValue)

Cette méthode extrait la valeur d’une propriété à partir de l’enregistrement de résultat actuel, comme indiqué dans le tableau 24 et le tableau 25.

Tableau 24. HRESULT GetProperty

Paramètre Description
propertyName Nom de la propriété que vous souhaitez récupérer
Valeur p Pointe vers une structure VARIANT qui, en retour, contient la valeur de la propriété

Tableau 25. HRESULT GetProperty Result

[HRESULT] Description
S_OK La valeur de la propriété a été récupérée.
WBEM_E_NOT_FOUND Il n’y a aucune propriété avec ce nom.
E_NOT_VALID_STATE Il n’existe aucun enregistrement actif.

Remarque

La méthode GetProperty peut renvoyer d’autres codes d’erreur WMI que ceux répertoriés dans le tableau 25. Les valeurs répertoriées sont les résultats communs qui sont retournés.

IWmiRepository Interface

__interface IWmiRepository : IUnknown
{
    HRESULT SetNamespace(LPCWSTR namespaceName);
    HRESULT ExecQuery(LPCWSTR query, [out] IWmiIterator **ppIterator);
};
Vue d’ensemble

Cette interface est implémentée par le composant WmiRepository (ID_WmiRepository).

HRESULT SetNamespace(LPCWSTR namespaceName)

Cette méthode définit l’espace de noms WMI qui sera utilisé pour la requête. Appelez cette méthode avant d’appeler ExecQuery. Si vous n’appelez pas cette méthode, l’espace de noms sera root\cimv2. Cette méthode renvoie toujours S_OK.

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

Exécutez une requête sur l’espace de noms WMI défini avec un appel à SetNamespace, comme indiqué dans le Tableau 26 et le Tableau 27.

Tableau 26. HRESULT ExecQuery

Paramètre Description
Query Chaîne de la requête WMI que vous voulez exécuter
ppIterator Passez un pointeur vers un pointeur d’interface, qui au retour sera rempli d’une interface, vous donnant accès aux résultats de la requête

Tableau 27. HRESULT Résultat de la requête

[HRESULT] Description
S_OK Requête réussie
Other Si la requête n’a pas abouti, renvoie un HRESULT WMI

IFormController Interface

__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);
 };
Vue d’ensemble

Chaque page de l’assistant UDI a son propre contrôleur de formulaire qui implémente cette interface. Ce contrôleur vous permet de connecter les données de champ du fichier XML .config aux contrôles de votre page. Le contrôleur de formulaire gère ensuite la plupart des détails pour vous.

Configuration du formulaire

En règle générale, configurez le contrôleur de formulaire dans la méthode OnWindowCreated de votre page. Pour ce faire, il faut généralement appeler les méthodes indiquées dans le tableau 28.

Tableau 28. OnWindowCreated Méthode

Méthode Description
Init Initialise le contrôleur de formulaire
AddField Fournit une connexion entre un champ du fichier XML .config qui est un nom de chaîne et un contrôle dans la boîte de dialogue de votre page qui est un ID
AddRadioGroup Permet de connecter une case d’option à un groupe et à un contrôle dans la boîte de dialogue
AddToGroup Permet aux contrôles « enfants » qui sont activés ou désactivés en même temps que leur parent ou en fonction du bouton radio sélectionné
InitFields Appeler après avoir appelé toutes les méthodes Add pour configurer le formulaire
Validate Effectue la validation initiale
Traitement des événements de formulaire

Ajoutez l’appel suivant à votre méthode OnControlEvent :

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

Cet appel transmet les événements au contrôleur de formulaire afin que celui-ci puisse traiter les événements liés au formulaire.

Enregistrer les données du formulaire

Dans la méthode OnNextSelected , appelez les méthodes de formulaire indiquées dans le tableau 29.

Tableau 29. Méthode OnNextSelected

Méthode Description
InitSection Fournit le nom de la section qui s’affichera sur la page Résumé de cette page
SaveFields Enregistrer les valeurs de champ dans les variables de séquence de tâches et dans la page Résumé
Init
HRESULT Init(IWizardPageView *pView, IWizardPageContainer *pContainer)

Vous appelez généralement cette méthode vers le début de la méthode OnWindowCreated de votre page. La commande doit ressembler à ceci :

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

Cette méthode s’appelle en interne et vous ne devez pas l’appeler vous-même. Il fournit le code XML de la page au contrôleur de formulaire.

Valider
HRESULT Validate(void)

Cette méthode exécute tous les validateurs attachés aux contrôles. Si un validateur ne réussit pas, le contrôleur de formulaire affiche un message d’avertissement et désactive le bouton Suivant , puis arrête le traitement des validateurs. En règle générale, vous n’avez besoin d’appeler cette méthode qu’à la fin de votre méthode OnWindowCreated ; il renvoie toujours S_OK.

AddToGroup
AddToGroup(int groupControlId, int controlId)

Cette méthode ajoute une commande en tant qu'"enfant » d’une boîte case activée ou d’un bouton radio, comme indiqué dans le tableau 30. Tous ces contrôles enfants sont désactivés lorsque le contrôle parent n’est pas sélectionné. La méthode renvoie toujours S_OK.

Tableau 30. AddToGroup

Paramètre Description
groupControlId ID du boîtier case activée ou de la case d’option qui contrôlera l’état d’activation de la commande enfant
ID contrôlé ID du contrôle que vous souhaitez ajouter en tant qu’enfant
UpdateCheckGroup
HRESULT UpdateCheckGroup(int groupControlId)

Cette méthode met à jour le statut d’activation ou de désactivation des contrôles enfants d’un groupe en fonction du status du contrôle parent. En règle générale, vous n’avez pas besoin d’appeler cette méthode vous-même, car le contrôleur de formulaire l’appelle pour vous.

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

Appelez cette méthode uniquement si vous avez un validateur que vous souhaitez créer dans le code plutôt qu’avec le XML. Cette méthode renvoie toujours S_OK.

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

Appelez cette méthode uniquement si vous avez un validateur que vous souhaitez créer dans le code plutôt qu’avec le XML.

DisableValidation
HRESULT DisableValidation(int controlId, BOOL disable)

Appelez cette méthode pour désactiver explicitement le validateur d’un contrôle ou rétablir la validation normale, comme indiqué dans le tableau 31. Cette méthode est utile, par exemple, lorsque vous avez des règles d’activation/désactivation pour les contrôles qui ne sont pas couverts par la validation de formulaire et que vous devez désactiver la validation d’un contrôle. En d’autres termes, vous n’appelleriez normalement pas cette méthode. Cette méthode renvoie toujours S_OK.

Tableau 31. HRESULT DisableValidation

Paramètre Description
controlId Le contrôle pour lequel vous souhaitez activer ou désactiver la validation
Disable Définir sur TRUE pour désactiver la validation et sur FALSE pour restaurer la validation normale
AddField
HRESULT AddField(LPCWSTR fieldName, int controlId, BOOL suppressLog, DialogControlTypes type)

Ajoutez un mappage de contrôle entre le nom d’un élément Field du fichier XML .config et l’ID de contrôle dans la boîte de dialogue de votre page, comme indiqué dans le tableau 32. Vous devez appeler cette méthode avant l’appel à InitFields, car InitFields utilise ces informations. Cette méthode renvoie toujours S_OK.

Tableau 32. HRESULT AddField

Paramètre Description
Nom de champ Nom du champ tel qu’il apparaît dans le fichier XML de votre page
controlId ID du contrôle dans le modèle de boîte de dialogue de votre page
suppressLog Définissez la valeur TRUE si vous ne souhaitez pas que les valeurs de ce champ soient écrites dans le fichier journal ; Définissez toujours ce paramètre sur TRUE pour les champs de mot de passe ou de code confidentiel
Type Type de contrôle, qui est l’un des suivants :

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

Cette méthode ajoute une commande à un groupe de boutons radio nommés, comme indiqué dans le tableau 33. Vous devez l’appeler avant la méthode InitFields , car cette méthode utilise des attributs sur l’élément RadioGroup pour contrôler les paramètres de tous les contrôles de bouton radio dans le groupe. Les groupes de radios peuvent être verrouillés, par exemple, de sorte que toutes les cases d’option sont désactivées, mais que les commandes enfants soient activées ou désactivées uniquement en fonction de la case d’option sélectionnée. Cette méthode renvoie toujours S_OK.

Tableau 33. HRESULT AddRadioGroup

Paramètre Description
GroupName Chaîne définissant un groupe de cases d’option sur cette page
radioControlId ID d’une seule case d’option à ajouter à ce groupe
EnableRadioGroup
HRESULT EnableRadioGroup(LPCWSTR groupName, BOOL enable)

Cette méthode vous permet d’activer ou de désactiver un groupe entier de cases d’option. La désactivation d’un groupe de cases d’option désactive tous les contrôles de bouton de radio dans le groupe, ainsi que les enfants des boutons de radio qui ont été ajoutés avec AddToGroup. Voir tableau 34 et tableau 35.

Tableau 34. EnableRadioGroup

Paramètre Description
GroupName Nom d’un groupe de cases d’option que vous avez déjà défini avec un appel à AddRadioGroup
Enable Définissez la valeur TRUE pour activer le groupe de cases d’option et FALSE pour désactiver le groupe

Tableau 35. HRESULT EnableRadioGroup

[HRESULT] Description
S_OK Groupe activé ou désactivé
E_INVALIDARG Il n’existe aucune case d’option avec le nom que vous avez fourni
InitFields
HRESULT InitFields(IFieldCallback *pFieldCallback = nullptr)

Avant d’appeler cette méthode, appelez AddField pour chaque champ que le XML peut contrôler. Cette méthode renvoie toujours S_OK.

Le paramètre pFieldCallback est facultatif. Si vous le fournissez, le contrôleur de formulaire appelle SetFieldDefault pour les contrôles qui ne sont ni CONTROL_STATIC_TEXT ni CONTROL_CHECK_BOX. Ce comportement vous permet de récupérer une valeur par défaut à partir du XML et de la définir vous-même dans le contrôle.

SaveFields
HRESULT SaveFields(IFieldCallback *pFieldCallback = nullptr)

Cette méthode enregistre les valeurs de champ dans les variables de séquence de tâches et dans les données de synthèse qui s’afficheront sur la page Résumé . La mise à disposition d’un pointeur dans pFieldCallback vous permet de gérer l’enregistrement des valeurs pour les contrôles qui ne prennent pas en charge CONTROL_STATIC_TEXT.

IsFieldDisabled
BOOL IsFieldDisabled(int controlId)

Cette méthode permet de déterminer si un champ a été désactivé dans le code XML.

InitSection
HRESULT InitSection(LPCWSTR key, LPCWSTR sectionCaption)

Cette méthode initialise les données de synthèse qui seront affichées sur la page Résumé , comme indiqué dans le tableau 36. Appelez cette méthode dans votre méthode OnNextSelected avant d’appeler SaveFields. Cette méthode renvoie toujours S_OK.

Tableau 36. HRESULT InitSection

Paramètre Description
Clé Ce paramètre doit être propre à votre page. Il permet de s’assurer que chaque page contient ses propres informations récapitulatives.
sectionCaption En-tête qui s’affichera sur la page Résumé pour les informations récapitulatives de cette page. En règle générale, vous utilisez DisplayName() comme valeur pour ce paramètre.
AddSummaryItem
HRESULT AddSummaryItem(LPCWSTR first, LPCWSTR second)

Cette méthode vous permet d’ajouter des éléments récapitulatifs à la page Résumé au-delà des éléments définis avec le XML. Voir tableau 37.

Tableau 37. HRESULT AddSummaryItem

Paramètre Description
First La légende de l’élément de résumé, affichée sur le côté gauche
Second La valeur qui sera affichée sur le côté droit
SuppressLogValue
HRESULT SuppressLogValue(LPCWSTR tsVariableName)

Appelez cette méthode pour les variables de séquence de tâches dont vous ne souhaitez pas que les valeurs soient écrites dans le fichier journal. Appelez cette méthode pour les variables de séquence de tâches qui stockent des mots de passe, des codes confidentiels ou d’autres valeurs sensibles qu’un utilisateur peut entrer.

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

Cette méthode enregistre la valeur d’un contrôle de texte à la fois pour une variable de séquence de tâches et pour la section de résumé. En règle générale, vous n’avez pas besoin d’appeler cette méthode vous-même, car le contrôleur de formulaire effectue cette opération pour tous les champs. Voir tableau 38.

Tableau 38. HRESULT SaveText

Paramètre Description
controlId ID de la zone de texte qui contient la valeur que vous souhaitez enregistrer (ou tout autre contrôle qui peut renvoyer du texte)
tsVariableName Nom de la variable de séquence de tâches que vous souhaitez modifier
summaryCaption La légende sur la page Résumé pour cette valeur
LoadText
HRESULT LoadText(int controlId, LPCWSTR tsVariableName)

Cette méthode lit la valeur d’une variable de séquence de tâches et définit la zone de texte sur cette valeur.

ControlEvent
void ControlEvent(WORD eventId, WORD controlId)

Appelez cette méthode sur votre méthode OnControlEvent pour vous assurer que le contrôleur de formulaire peut traiter les événements de contrôle, ce qu’il doit faire pour fonctionner correctement. Les valeurs que vous passez à cette méthode sont les mêmes que celles transmises à la méthode OnControlEvent .

IsValid
BOOL IsValid(void)

Cette méthode renvoie le status de la validation la plus récente du formulaire. Si l’un des validateurs de contrôle a signalé une erreur, cette méthode renvoie FALSE. En d’autres termes, elle renvoie VRAI uniquement si tous les contrôles de la page sont valides.

IValidator Interface

__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);
};
Vue d’ensemble

Les validateurs sont des composants qui peuvent valider un contrôle unique sur votre page. La façon la plus simple d’implémenter un validateur est d’en faire une sous-classe de la classe BaseValidator , qui est définie dans le fichier d’en-tête BaseValidator.h.

HRESULT Init(IControl *pControl, LPCTSTR message)

Si vous créez un validateur dans le code, vous pouvez appeler cette méthode pour initialiser le validateur. Voir tableau 39.

Tableau 39. HRESULT Init

Paramètre Description
pControl Contrôle que votre validateur doit valider
Message Message à afficher sur la page si le contrôle n’est pas valide
HRESULT Init(IControl *pControl, IWizardPageContainer *pContainer, IStringProperties *pProperties)

Le contrôleur de formulaire appelle cette méthode pour initialiser les validateurs qu’il crée en fonction du XML de la page. Voir tableau 40.

Tableau 40. Méthode d’initialisation HRESULT

Paramètre Description
pControl Contrôle que votre validateur doit valider
Conteneur Si votre validateur a besoin d’accéder à l’enregistreur ou doit créer d’autres composants
Propriétés Fournit l’accès aux propriétés (éléments setter) pour votre validateur
BOOL, IsValid(LPBSTR pMessage)

Cette méthode renvoie TRUE si le contrôle est valide ou FALSE si le contrôle n’est pas valide. Au retour, pMessage doit être rempli avec un nouveau BSTR qui contient le message à afficher lorsque le contrôle n’est pas valide.

HRESULT SetProperty(int propertyId, LPVARIANT pValue)

Vous pouvez implémenter cette méthode si vous avez besoin de valeurs supplémentaires qui ne sont pas fournies dans le XML.

HRESULT SetProperty(int propertyId, IUnknown *pUnknown)

Vous pouvez implémenter cette méthode si vous avez besoin de valeurs supplémentaires qui ne sont pas fournies dans le XML.

HRESULT SetProperty)(int propertyId, LPCTSTR pValue)

Vous pouvez implémenter cette méthode si vous avez besoin de valeurs supplémentaires qui ne sont pas fournies dans le XML.

IRegEx Interface

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

Cette méthode est implémentée par le composant ID_Regex (IRegex.h) et prend en charge le traitement des expressions régulières.

BOOL MatchesRegex(entrée LPCTSTR, expression régulière LPCTSTR)

Cette méthode exécute l’expression régulière sur le texte d’entrée. Elle utilise la fonction regex_match de la bibliothèque standard C++ pour effectuer le travail réel. La méthode renvoie VRAI s’il y a des correspondances, FAUX dans le cas contraire.

HRESULT GetMatch(size_t index, LPBSTR pValue)

Cette méthode vous permet de récupérer les correspondances de l’appel MatchesRegex le plus récent. Notez qu’il n’y a pas de traitement d’erreur dans cette méthode et qu’elle retourne S_OK ou lève une exception.

ISummaryInfo Interface

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

Vous ne devriez pas avoir besoin d’utiliser cette interface directement. Utilisez plutôt IFormController.

ISummaryBag

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

Vous ne devriez pas avoir besoin d’utiliser cette interface directement. Utilisez plutôt IFormController.

ITSVariableBag Interface

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

Cette interface permet d’accéder aux variables de séquence de tâches. Vous pouvez accéder à cette interface en utilisant la méthode TSVariables() de votre page.

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

Cette méthode lit la valeur d’une variable de séquence de tâches.

Remarque

Les valeurs sont mises en cache après la première lecture.

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

Cette méthode définit la valeur d’une variable de séquence de tâches. Cette valeur est enregistrée en mémoire. Les valeurs de séquence de tâches sont écrites une fois que vous sélectionnez Terminer dans l’assistant UDI.

void Clear(void)

Cette méthode supprime toutes les valeurs de séquence de tâches qui ont été enregistrées en mémoire.

HRESULT Remove([in] LPCTSTR variableName)

Cette méthode supprime une valeur de séquence de tâches spécifique de la mémoire. La prochaine fois que vous appelez GetValue avec le même nom de séquence de tâches, la méthode tente de la récupérer à partir de la séquence de tâches.

HRESULT SuppressLogValue([in] LPCTSTR variableName)

Chaque fois que des variables de séquence de tâches sont écrites, par exemple lorsque vous sélectionnez Terminer dans l’Assistant UDI, les noms et les valeurs sont écrits dans le fichier journal. Appelez cette méthode pour supprimer la journalisation des valeurs sensibles, telles que les mots de passe ou les codes PIN, pour une variable de séquence de tâches spécifique.

void Save(void)

Cette méthode enregistre toutes les valeurs de séquence de tâches qui ont été définies avec des appels à SetValue.

ITSVariableRepository Interface

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

Cette interface est destinée à un usage interne de TSVariableBag pour la lecture et l’écriture de variables de séquence de tâches.

IWizardFinish Interface

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

Cette interface est utile dans les scénarios avancés où vous souhaitez effectuer un traitement supplémentaire lorsque vous sélectionnez Terminer ou Annuler dans l’assistant UDI. L’assistant UDI contient une tâche de fin qui enregistre les variables de séquence de tâches lorsque vous sélectionnez Terminer. Si vous annulez l’Assistant, la tâche définit uniquement la variable de séquence de tâches OSDSetupWizCancelled sur TRUE et n’enregistre pas les modifications apportées aux autres variables de séquence de tâches.

Si vous créez votre propre composant de finition, vous devez l’inscrire avec un code comme celui-ci :

Register<MyFinishTaskFactory>(ID_MyFinishTask, pRegistry);

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

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

pService->Register(pFinish);

IBindableList Interface

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

Implémentez cette interface si vous avez un composant de source de données que vous souhaitez lier à une zone de liste déroulante en appelant sa méthode Bind .

size_t Count(void)

Cette méthode renvoie le nombre d’éléments contenus dans la liste.

HRESULT GetCaption(size_t index, LPBSTR pCaption)

Cette méthode renvoie la légende de l’élément à un index spécifique.

IDataNodes Interface

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

Cette interface permet d’accéder à des données hiérarchiques qui peuvent être enregistrées dans une page. Vous obtenez cette interface via les méthodes de l’interface ISettingsProperties , qui est disponible sur votre page via la méthode Paramètres .

Les données dans le fichier XML d’une page peuvent ressembler à ceci

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

Calling Settings()->GetDataNode(L"Network », &pData) vous donne une instance IDataNodes avec deux éléments de données (chacun ayant à son tour deux propriétés).

size_t Count()

Cette méthode renvoie le nombre d’éléments DataItem .

HRESULT SetCaptionProperty(LPCTSTR captionProperty)

Le composant qui prend en charge cette interface prend également en charge IBindableList, ce qui permet de remplir facilement une zone de liste modifiable avec les données XML de la page. Cette méthode contrôle la propriété (setter) de chaque élément DataItem qui sera utilisée pour cette liaison. Par exemple, vous pourriez appeler cette méthode avec DisplayName, et elle utiliserait cette propriété setter pour la liaison de données. La zone de liste déroulante contenait alors Public et Dev Team en tant qu’objets.

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

Cette méthode obtient une propriété de l’un des éléments DataItem . Voir tableau 41 et tableau 42.

Tableau 41. DataItem GetProperty

Paramètre Description
Index Valeur d’index (commençant par 0) du DataItem pour lequel vous souhaitez récupérer une valeur de propriété
propertyName Nom de la propriété setter pour laquelle vous souhaitez récupérer une valeur
propertyValue Au retour, contient la valeur de chaîne d’une propriété

Tableau 42. HRESULT GetProperty

[HRESULT] Description
S_OK La propriété a été récupérée.
E_INVALIDARG L’index est au-delà de la fin du tableau.
HRESULT GetNode(size_t index, [out] ISettingsProperties **ppNode)

Cette méthode est similaire à GetProperty, mais au lieu de retourner une valeur à partir d’un DataItem, elle retourne l’intégralité du DataItem encapsulée dans une interface ISettingsProperties . Voir tableau 43 et tableau 44.

Tableau 43. HRESULT GetNode

Paramètre Description
Index Valeur d’index (commençant par 0) du DataItem pour lequel vous souhaitez récupérer une valeur de propriété
ppNode À la fermeture, l’interface ISettingsProperties qui encapsule le nœud DataItem

Tableau 44. HRESULT Résultats GetNode

[HRESULT] Description
S_OK Le nœud a été récupéré.
E_INVALIDARG L’index est au-delà de la fin du tableau.

IFactoryRegistry Interface

__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);
};
Vue d’ensemble

Lorsque vous créez une page personnalisée, vous devez au minimum créer une fabrique de pages, une classe qui implémente IClassFactory. (Vous pouvez utiliser ClassFactoryImpl comme classe de base pour votre fabrique.)

void Register(LPCTSTR type, IClassFactory *pFactory)

Cette méthode inscrit une fabrique de classes auprès du registre. Voir tableau 45.

Tableau 45. IClassFactory void Register

Paramètre Description
Type Chaîne identifiant la fabrique que vous inscrivez ; En règle générale, ce paramètre doit avoir le nom de votre société dans la chaîne pour garantir son unicité
pFactory Un pointeur vers votre fabrique de classes instance
HRESULT LoadAndRegister(LPCTSTR dllName, ILogger *pLogger)

Cette méthode est à usage interne uniquement.

BOOL Contient(type LPCTSTR)

Cette méthode est généralement destinée à un usage interne. Il vérifie si une fabrique de classes a été enregistrée pour un type.

HRESULT GetFactory(LPCTSTR type, IClassFactory **ppFactory)

Cette méthode vous permet de récupérer la fabrique de classes. En règle générale, vous appelez CreateInstance. Cependant, si vous allez créer un grand nombre du même composant, il est plus efficace de récupérer la fabrique et de lui demander ensuite de créer les instances pour vous.

HRESULT CreateInstance(LPCTSTR type, IUnknown **ppInstance)

Cette méthode crée une nouvelle instance d’un composant, en fonction de son type. Utilisez plutôt la méthode de modèle CreateInstance , qui permet la création d’objets de type sécurisé.

HRESULT SetContainer(IWizardPageContainer *pContainer)

Cette méthode est à usage interne uniquement.

HRESULT RegisterService(REFGUID iid, IUnknown *pService)

Les services sont des instances uniques d’un composant qui peuvent être utilisées à plusieurs endroits. Vous pouvez utiliser cette méthode pour inscrire un service sur une page, puis récupérer cette même instance à partir d’une autre page.

HRESULT GetService(REFGUID iid, IUnknown **ppService)

Cette méthode récupère un service qui a été précédemment inscrit avec un appel à RegisterService.

HRESULT SetLanguage(LANGID languageId)

Cette méthode définit la langue de l’assistant UDI sur l’identificateur de langue que vous avez fourni dans le paramètre languageId .

LANGID GetLanguage()

Cette méthode renvoie la valeur de l’identificateur de langue que vous avez fourni avec le paramètre de ligne de commande /locale pour l’assistant UDI. La méthode renvoie l’une des valeurs suivantes :

  • Valeur de l’identificateur de langue fourni avec le paramètre de ligne de commande /locale

  • 0, si vous n’avez pas fourni le paramètre de ligne de commande /locale

ILogger Interface

__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);
};
Vue d’ensemble

L’assistant UDI enregistre les informations dans un fichier journal, ce qui permet de résoudre les problèmes trouvés sur le terrain. Il est judicieux que vos pages consignent des informations. Vous pouvez obtenir un pointeur vers cette interface à partir de votre page à l’aide de la méthode Logger() de la page. Les lignes du fichier journal contiennent un nombre de « niveau » qui représente les messages d’erreur, normaux, détaillés ou de débogage.

Remarque

Les messages de débogage ne sont enregistrés dans le fichier journal que si la prise en charge du débogage est activée. Vous pouvez activer la prise en charge du débogage en ajoutant la ligne suivante à l’élément Style dans le fichier .config :

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

Cette méthode est à usage interne uniquement.

Journal de déplacement
HRESULT MoveLog(LPCWSTR logFilename)

Cette méthode est à usage interne uniquement.

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

Cette méthode est à usage interne uniquement.

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

Cette méthode est à usage interne uniquement.

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

Appelez cette méthode pour consigner des informations sur une erreur. Voir tableau 46.

Tableau 46. Erreur HRESULT

Paramètre Description
Erreur Code d’erreur renvoyé par un appel (Ce code sera affiché dans l’entrée du journal sous forme de nombre.)
Composant Chaîne qui identifie la source de l’erreur, qui est généralement votre page ou le composant que vous avez écrit
Message Message qui explique la cause de l’erreur
Erreur 2
HRESULT Error2(HRESULT error, LPCTSTR component, LPCTSTR message, LPCTSTR message2)

Cette méthode est similaire à la méthode Erreur , mais vous permet de fournir un message en deux parties. Le message final comportera « message », puis « message2 » dans le fichier de sortie. Il s’agit simplement d’une méthode pratique.

Normal
HRESULT Normal(LPCTSTR component, LPCTSTR message)

Cette méthode enregistre un message normal. Voir la description de la méthode Erreur pour les paramètres.

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

Cette méthode enregistre un message normal. Voir la description de la méthode Error2 pour les paramètres.

Détaillé
HRESULT Verbose(LPCTSTR component, LPCTSTR message)

Cette méthode enregistre un message détaillé. Voir la description de la méthode Erreur pour les paramètres.

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

Cette méthode enregistre un message détaillé. Voir la description de la méthode Error2 pour les paramètres.

Débogage
HRESULT Debug(LPCWSTR component, LPCWSTR message)

Cette méthode enregistre un message de débogage. Voir la description de la méthode Erreur pour les paramètres. Les messages de débogage ne sont enregistrés dans le fichier que s’ils sont activés. Pour plus d’informations, consultez la section Vue d’ensemble.

EnableDebug
HRESULT EnableDebug(BOOL debug)

Cette méthode est à usage interne uniquement.

Fermer
HRESULT Close(void)

Cette méthode est à usage interne uniquement.

GetLogFilename
HRESULT GetLogFilename(LPBSTR pFilename)

Cette méthode récupère le nom du fichier journal.

IOrientation Interface

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

Cette interface est destinée à un usage interne uniquement.

Interface d’actualisation

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

Cette interface est destinée à un usage interne uniquement.

ISettingsProperties Interface

__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);
};
Vue d’ensemble

Cette interface permet d’accéder aux données de page. Pour atteindre le niveau supérieur des données de page, utilisez la méthode Settings() de la page.

HRESULT GetAttribute(LPCTSTR attributeName, LPBSTR attributeValue)

Cette méthode vous permet de récupérer les valeurs des attributs sur le nœud principal, qui est le nœud Page lorsque vous utilisez la méthode Settings() de la page.

IStringProperties * Propriétés()

Cette méthode permet d’accéder aux valeurs de propriété setter sous le nœud principal. Pour une page, il s’agit des propriétés de niveau supérieur.

HRESULT SelectNodes(LPCTSTR, xPath, IXMLDOMNodeList **ppList)

Appelez cette méthode si vous souhaitez obtenir directement une liste de nœuds XML à l’aide d’une expression XPath. Il est préférable d’utiliser l’une des autres méthodes si vous le pouvez. N’utilisez cette méthode que si vous ne pouvez pas accéder aux nœuds d’une autre manière.

HRESULT SelectSingleNode(LPCTSTR xPath, IXMLDOMNode **ppNode)

Appelez cette méthode si vous souhaitez obtenir directement un seul nœud XML à l’aide d’une expression XPath. Il est préférable d’utiliser l’une des autres méthodes si vous le pouvez. Utilisez cette méthode uniquement si vous ne pouvez pas atteindre un nœud d’une autre manière.

HRESULT GetDataNode(LPCTSTR name, ISettingsProperties **ppNode)

Récupérez un élément de données en fonction de l’attribut Name de cet élément.

HRESULT : GetDataNodes(IDataNodes, **ppNodes)

Cette méthode récupère une liste d’éléments DataItem sous le nœud actuel. Au niveau de la page, appelez GetDataNode pour récupérer une interface ISettingsProperty pour les données. Ensuite, sur cette instance, appelez GetDataNodes pour récupérer la liste des enregistrements. Par exemple, étant donné ce code 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)

Cette méthode offre un moyen rapide d’accéder à l’ensemble des nœuds DataItem sous un nœud de données spécifique. En utilisant le XML de l’exemple GetDataNodes , le code suivant fait exactement la même chose que les quatre lignes de code de l’exemple sous GetDataNodes , mais avec une vérification des erreurs :

ISimpleStringProperties Interface

ISimpleStringProperties Interface

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

En soi, cette interface peut ne pas être utile. Toutefois, elle est implémentée par le composant ID_SimpleStringProperties , qui implémente également l’interface IStringProperties . Vous pouvez utiliser ce composant dans les cas où vous devez transmettre un ensemble de propriétés à un autre composant, par exemple une tâche, mais que vous souhaitez ajouter des valeurs par programme au lieu d’utiliser des valeurs de XML. Voici un exemple d’utilisation de cette interface :

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

Cette interface fournit un accès simple à un ensemble d’éléments de réglage qui proviennent de XML. Cette interface est disponible pour les propriétés d’une page en utilisant Settings()->Properties().

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

Cette méthode récupère une valeur de propriété unique. Voir tableau 47 et tableau 48.

Tableau 47. IHRESULT Obtenir la valeur de la propriété

Paramètre Description
propertyName Nom de la propriété que vous souhaitez lire
Valeur pProp À la sortie, contient la valeur de la propriété sous la forme d’une chaîne (cette valeur sera nullptr si cette propriété n’existe pas.)

Tableau 48. IHRESULT Obtenir des résultats de valeur de propriété

[HRESULT] Description
S_OK La valeur de la propriété est récupérée.
E_INVALIDARG Aucune propriété ne porte le nom que vous avez fourni.

ITaskManager Interface

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

Cette interface est implémentée par le composant TaskManager (ID_TaskManager dans ITaskManager.h), qui est le composant qui exécute les tâches sur la page de contrôle en amont. Vous pouvez utiliser directement la page de contrôle en amont, ce que vous faites la plupart du temps, ou créer votre propre page, en laissant ce composant faire la majeure partie du travail.

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

Vous devez appeler cette méthode avant d’appeler une autre méthode. Il initialise le composant TaskManager . Voir tableau 49.

Tableau 49. HRESULT Init

Paramètre Description
pPageView Fournit l’accès à la page qui exécutera les tâches (cette page doit avoir un ensemble spécifique de contrôles, qui sont décrits dans les paramètres suivants.)
idListView ID de contrôle d’un contrôle ListView qui affiche la liste des tâches et le statut de celles-ci
idMessage ID de contrôle d’une zone de texte qui sera utilisée pour afficher un message pour la tâche que vous sélectionnez
idRetryButton ID de contrôle d’un bouton sur lequel vous pouvez sélectionner pour réexécuter les tâches
pPageInfo Une enveloppe autour du XML de la page (TaskManager charge l’ensemble des tâches à exécuter à partir de ce XML.)
Rappel Peut être null (si ce paramètre n’est pas Null, TaskManager appelle la méthode Started lorsqu’il démarre une tâche et la méthode Finished pour chaque tâche qui termine son exécution.)
HRESULT SetFailMessage(LPCWSTR message)

Cette méthode définit le message qui s’affichera en cas d’échec d’une ou plusieurs tâches.

HRESULT Start(void)

Cette méthode démarre toutes les tâches. Chaque tâche est démarrée sur un thread distinct.

HRESULT GetTaskMessage(size_t index, LPBSTR message)

Cette méthode est à usage interne uniquement. Il récupère le message actuel d’une tâche en fonction de son index dans la liste des tâches.

HRESULT GetResultType)(size_t index, LPBSTR type)

Cette méthode récupère le « type » actuel d’une tâche. Le tableau 50 indique les types disponibles.

Tableau 50. HRESULT GetResultType

Type Description
0 Représente une tâche qui a réussi
1 Représente une tâche qui a renvoyé un avertissement
-1 Représente une tâche ayant échoué

Le type est récupéré en examinant le code de sortie ou d’erreur de la tâche et en recherchant une correspondance dans l’élément <XML ExitCodes> de la tâche.

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

Cette méthode est utilisée par les pages d’avancement et de contrôle en amont pour récupérer la propriété setter BitmapFilename afin qu’elle puisse afficher une image en regard du message de la tâche que vous mettez en surbrillance. En d’autres termes, vous pouvez ajouter un setter personnalisé au XML de la tâche, puis le récupérer avec cette méthode.

int GetSelectedIndex(void)

Cette méthode récupère l’index de la tâche actuellement sélectionnée, ce qui est utile si vous souhaitez récupérer des informations supplémentaires sur la tâche (voir méthode GetProperty ) à afficher pour la tâche sélectionnée. Les pages de progression et de contrôle en amont utilisent cette méthode pour afficher une image de la tâche sélectionnée.

HRESULT Wait(DWORD, waitMilliseconds)

Cette méthode est principalement utile avec les tests unitaires afin que le test puisse s’assurer que les tâches se terminent avant la fin du test unitaire. Normalement, vous n’appelleriez pas cette méthode. Il revient soit lorsque toutes les tâches ont terminé leur exécution, soit lorsque le temps d’attente est écoulé.

size_t FailedCount(void)

Cette méthode renvoie le nombre de tâches actuellement marquées comme ayant échoué.

size_t WarningCount(void)

Cette méthode renvoie le nombre de tâches actuellement marquées comme avertissement.

size_t SucceedCount(void)

Cette méthode renvoie le nombre de tâches actuellement marquées comme réussies.

size_t RunningCount(void)

Cette méthode renvoie le nombre de tâches en cours d’exécution.

void OnCommonControlEvent(WORD controlId, LPNMHDR pInfo)

Appelez cette méthode à partir de OnCommonControlEvent de votre page afin que le Gestionnaire des tâches puisse traiter les événements dont il a besoin.

void OnControlEvent(WORD eventId, WORD controlId)

Appelez cette méthode à partir de OnControlEvent de votre page afin que le Gestionnaire des tâches puisse traiter les événements dont il a besoin.

void EnableButtons(BOOL enable)

Cette méthode est à usage interne uniquement.

IWizardComponent Interface

__interface IWizardComponent : IUnknown
{
    HRESULT SetContainer(IWizardPageContainer *pContainer);
};
Vue d’ensemble

En règle générale, vous n’implémentez pas cette interface directement, mais via la classe de modèle WizardComponent . Si votre composant implémente cette interface et que vous avez inscrit une fabrique de classes auprès du Registre, votre composant reçoit un pointeur vers l’instance IWizardPageContainer lors de sa création. Cela vous aide, par exemple, à accéder à l’enregistreur ou au registre pour créer d’autres composants dont votre composant pourrait avoir besoin.

IWizardDialogController Interface

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

Cette interface est destinée à un usage interne uniquement.

IWizardDialogView Interface

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

Cette interface est destinée à un usage interne uniquement.

IWizardPage Interface

__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 NextSelected(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);
};
Vue d’ensemble

Cette interface est implémentée par WizardPageImpl, vous n’aurez donc généralement pas à l’implémenter vous-même. L’Assistant appelle toutes ces méthodes pour vous lorsqu’il interagit avec vos pages personnalisées.

IWizardPageContainer Interface

__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);
};
Vue d’ensemble

Cette interface est disponible pour votre page via la méthode Container (implémentée par WizardPageImpl) et vous donne accès aux différents services de l’assistant.

ILogger * Logger(void)

Utilisez cette méthode pour écrire des messages dans le fichier journal, par exemple :

Logger()->Verbose(s_component, L"Message for log file");
IPropertyBag * Propriétés(void)

Cette méthode permet d’accéder aux variables de « mémoire », qui sont des propriétés qui sont en mémoire uniquement lorsque l’Assistant UDI est en cours d’exécution. Ces propriétés sont disponibles pour d’autres pages soit dans le code, soit dans le XML en utilisant la syntaxe $memoryVarName$.

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

Cette méthode vous permet de créer une nouvelle instance de n’importe quel composant qui a été enregistré. Cependant, il est préférable d’utiliser la fonction de modèle CreateInstance, car elle est fortement typée.

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

Cette méthode vous permet de récupérer un service qui a été inscrit. Toutefois, il est préférable d’appeler la fonction de modèle GetService , qui est fortement typée (au lieu d’utiliser IUnknown).

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

Cette méthode gère l’utilisation de variables à l’intérieur de valeurs de chaîne. Il prend en charge les formats indiqués dans le Tableau 51 et le Tableau 52.

Tableau 51. HRESULT ReplaceVariables

Format Description
$Name$ Remplace la valeur d’une variable de mémoire avec ce nom (s’il n’y a pas de variable de mémoire avec ce nom, le « jeton » sera supprimé.)
%Name % Soit une variable de séquence de tâches, soit une variable d’environnement. L’ordre est le suivant :

1. Utilisez la valeur d’une variable de séquence de tâches, le cas échéant.
2. Utilisez la valeur d’une variable d’environnement, le cas échéant.
3. Sinon, supprimez ce texte de la chaîne.

Tableau 52. Paramètre HRESULT

Paramètre Description
Source La chaîne d’entrée, qui peut contenir n’importe quelle combinaison de $ variables et % ou rien du tout
pDest Au retour, contient une nouvelle chaîne qui a tous les jetons remplacés conformément au tableau 51
HRESULT GotoPage(LPCTSTR pageName)

Cette méthode n’a pas été entièrement testée. L’idée est que vous pouvez basculer directement vers une page spécifique en fonction du nom de la page tel que défini dans le fichier XML .config. L’appel de cette méthode contourne la méthode OnNextSelected sur votre page. En outre, le comportement de cette méthode est susceptible de changer, utilisez-la donc à vos risques et périls.

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

Cette méthode affiche une zone de message avec le texte et la légende que vous fournissez. Le paramètre uType correspond à toute valeur que vous pouvez fournir à la fonction MessageBox Win32.

BOOL InPreview(void)

Cette méthode renvoie TRUE si vous avez lancé l’Assistant en mode « aperçu » en spécifiant le commutateur /preview . En mode aperçu, le bouton Suivant n’est jamais désactivé. Cette méthode vous permet de contourner le code en mode prévisualisation, par exemple, qui pourrait entraîner des problèmes lorsque vous n’avez pas de données valides sur la page.

HWND GetHwnd(void)

Cette méthode renvoie le HWND de la boîte de dialogue principale. Utilisez cette méthode avec précaution. Généralement, l’interface de programmation d’applications UDI Wizard est conçue de manière à ce que vous ne travailliez jamais directement avec des poignées de fenêtre.

IWizardPageView Interface

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

Cette interface est disponible pour le code de votre page via la méthode View (implémentée par WizardPageImpl).

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

L’assistant UDI utilise des wrappers, qui sont en fait des façades pour interagir avec les contrôles de votre page. L’utilisation de ces façades au lieu des commandes réelles facilite grandement l’écriture de tests pour votre page, car vous pouvez fournir des façades fictives à partir de vos tests.

Au lieu d’utiliser cette méthode directement, il est préférable d’utiliser la méthode de modèle GetControlWrapper , dont le type est fort, par exemple :

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

Cette méthode renvoie le handle de fenêtre de votre page. En règle générale, vous ne devriez pas avoir besoin d’accéder à cette poignée de fenêtre.

HWND : GetControl(int, itemId)

S’il le faut, vous pouvez appeler cette méthode pour obtenir le handle de fenêtre d’un contrôle sur votre page. (Il est préférable d’appeler la fonction de modèle GetControlWrapper ).

HRESULT Show (nulle)

Cette méthode est à usage interne uniquement.

HRESULT Hide(void)

Cette méthode est à usage interne uniquement.

HRESULT Focus(int, itemId)

Définissez le focus d’entrée sur un contrôle spécifique.

IWizardPage * Page(void)

Cette méthode est à usage interne uniquement.

IFormController * Form(void)

Cette méthode est à usage interne uniquement.

HRESULT FocusWizardButton(bouton WizardButton)

Définit le focus sur l’un des boutons de l’Assistant. WizardButtons a deux valeurs : BackButton et NextButton.

HRESULT SetEnable(WizardButtons button, BOOL enable)

Demander l’activation ou la désactivation d’un des boutons de l’Assistant. Il se peut que le bouton ne corresponde pas à l’état que vous demandez. Par exemple, si vous exécutez l’assistant UDI avec le commutateur /preview , les boutons seront toujours activés. WizardButtons a deux valeurs : BackButton et NextButton.

void ShowWarningMessage(LPCTSTR message)

Cette méthode affiche un message d’avertissement en bas de la zone de contenu de la page. Ce message peut être n’importe quel texte.

void HideWarningMessage(void)

Masquer un message d’avertissement affiché avec un appel à ShowWarningMessage.

IXmlDocument Interface

__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);
};
Vue d’ensemble

Cette interface est implémentée par le composant ID_IXmlDocument , qui est une façade conçue pour faciliter l’utilisation des documents XML en C++.

HRESULT Load(LPCTSTR filename)

Cette méthode charge un document XML à partir d’un fichier externe. Il renvoie S_OK si le fichier a été chargé sans erreur ou S_FALSE si une erreur s’est produite. En cas d’erreur, vous pouvez obtenir le message d’erreur en appelant GetParseErrorMessage.

HRESULT LoadXml(LPCTSTR xml)

Cette méthode charge un document XML à partir d’une chaîne au lieu d’un fichier externe. À l’exception de la source de lecture du XML, le comportement est le même que celui de la méthode Load .

HRESULT Save(LPCWSTR filename)

Cette méthode enregistre le document XML qui est en mémoire dans un fichier externe.

HRESULT : GetParseErrorMessage(LPBSTR, pMessage)

Cette méthode renvoie une nouvelle chaîne avec le message d’erreur lors du chargement du document XML, le cas échéant. Il revient toujours S_OK.

HRESULT SelectNodes(LPCTSTR xpath, IXMLDOMNodeList **ppNodes)

Cette méthode vous permet d’utiliser une expression XPath pour récupérer une collection de nœuds du document. Il revient toujours S_OK.

HRESULT SelectSingleNode(LPCTSTR xpath, IXMLDOMNode **ppNode)

Cette méthode vous permet d’utiliser une expression XPath pour récupérer un nœud du document. Il revient toujours S_OK.

HRESULT AddSchema(LPCTSTR filename, LPCTSTR ns)

Cette méthode ajoute le nom d’un fichier de schéma externe qui sera utilisé pour valider le schéma de votre document XML lors de son chargement. L’espace de noms que vous fournissez est la chaîne que vous pouvez utiliser dans les requêtes XPath, bien que cela n’ait pas été testé.

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

Cette méthode ajoute un nouvel attribut à un nœud existant dans le document XML. Voir tableau 53.

Tableau 53. HRESULT AddAttribute

Paramètre Description
pNode Nœud auquel vous souhaitez ajouter un attribut
Nom Nom du nouvel attribut
Valeur Valeur du nouvel attribut
HRESULT CreateNode(DOMNodeType type, LPCWSTR name, LPCWSTR ns, IXMLDOMNode **ppNode)

Appelez cette méthode pour créer un nœud :

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

Une fois que vous avez créé un nœud, vous pouvez l’ajouter en tant qu’enfant à un autre nœud en appelant la méthode appendChild du parent.

Fonctions d’assistance

Fonction de modèle CreateInstance

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

Cette fonction est définie dans IWizardPageContainer.h et fournit une enveloppe de type sécurisé sur la méthode IWizardPageContainer-CreateInstance>, par exemple :

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

Ce code crée un nouveau composant ID_Directory pour récupérer l’interface IDirectory de ce composant.

Fonction de modèle GetService

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

Cette fonction est définie dans IWizardPageContainer.h et fournit une enveloppe de type sécurisé par rapport à la méthode IWizardPageContainer-GetService>, par exemple :

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

Cette fonction récupère le composant de séquence de tâches, qui prend en charge l’interface ITSVariableBag . (Pour ITSVariableBag, vous pouvez utiliser la méthode TSVariables de la classe WizardPageImpl à la place.)

Assistant UDI Référence du schéma du fichier de configuration du Designer

Ce fichier est consommé par le UDI Wizard Designer. Un fichier distinct est créé pour chaque fichier .dll personnalisé, qui peut contenir des éditeurs de page d’Assistant personnalisés, des tâches personnalisées ou des validateurs personnalisés. Le fichier doit se terminer par .config et se trouver dans le dossier installation_folder\Bin\Config ( où installation_folder est le dossier dans lequel vous avez installé MDT).

Le tableau 54 répertorie les éléments du fichier de configuration du Designer de l’Assistant UDI et leurs descriptions. L’élément DesignerConfig est le nœud racine de cette référence.

Tableau 54. Éléments du fichier de configuration du Designer de l’assistant UDI et leurs descriptions

Nom de l’élément Description
DesignerConfig Spécifie la racine de tous les autres éléments
DesignerMappings Regroupe un ensemble d’éléments de page
Page Spécifie un éditeur de page d’assistant à charger dans le Designer d’assistant UDI, qui est utilisé pour modifier les paramètres de configuration d’une page d’assistant
Param Spécifie un paramètre qui est transmis à l’élément Tâche ou Validateur parent et qui correspond à un élément Setter dans le fichier de configuration de l’assistant UDI Remarque : Les attributs de cet élément sont différents si le parent est l’élément Tâche ou Validateur .
Tâche Spécifie une tâche dans la bibliothèque de tâches
TaskItem Spécifie un groupe de paramètres qui sont transmis à la tâche
Bibliothèque de tâches Regroupe un ensemble d’éléments de tâche
Validateur Spécifie un validateur dans la bibliothèque de validateurs
ValidatorLibrary Regroupe un ensemble d’éléments du programme de validation

DesignerConfig

Cet élément spécifie la racine de tous les autres éléments.

Informations sur l’élément

Le tableau 55 fournit des informations sur l’élément DesignerConfig .

Tableau 55. Informations sur l’élément DesignerConfig

Attribut Valeur
Nombre d’occurrences Un : Cet élément est obligatoire.
Éléments parents Aucun
Sommaire DesignerMappings, TaskLibrary, ValidatorLibrary
Attributs d’élément

Cet élément n’a aucun attribut.

Remarques

Aucun.

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

DesignerMappings

Cet élément regroupe un ensemble d’éléments de page .

Informations sur l’élément

Le tableau 56 fournit des informations sur l’élément DesignerMappings .

Tableau 56. Informations sur l’élément DesignerMappings

Attribut Valeur
Nombre d’occurrences zéro ou un dans l’élément DesignerConfig (Cet élément est facultatif s’il n’existe aucune page d’Assistant personnalisé dans la DLL qui correspond à ce fichier de configuration de l’Assistant UDI Designer.)
Éléments parents DesignerConfig
Sommaire Page
Attributs d’élément

Cet élément n’a aucun attribut.

Remarques

Aucun.

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

Cet élément spécifie un éditeur de page d’assistant à charger dans le Designer d’assistant UDI, qui est à son tour utilisé pour modifier les paramètres de configuration d’une page d’assistant.

Informations sur l’élément

Le tableau 57 fournit des informations sur l’élément Page .

Tableau 57. Informations sur les éléments de page

Attribut Valeur
Nombre d’occurrences Une ou plusieurs pour chaque page d’Assistant définie dans l’élément DesignerMappings
Éléments parents DesignerMappings
Sommaire Tout contenu XML bien formé
Attributs d’élément

Le tableau 58 répertorie les attributs de l’élément Page et une description pour chacun.

Tableau 58. Attributs et valeurs correspondantes pour l’élément Page

Attribut Description
Description Spécifie le texte qui fournit des informations sur le paramètre, qui est affiché dans le Designer de l’assistant UDI
DesignerAssembly Spécifie le nom du fichier .dll associé à l’éditeur de page de l’Assistant (le fichier .dll doit exister dans le dossier installation_folder\Bin (où installation_folder est le dossier dans lequel vous avez installé MDT).
Type de concepteur Spécifie le nom de l’éditeur de page de l’Assistant dans le fichier .dll spécifié dans l’attribut DesignerAssembly (il s’agit du type Microsoft .NET pour l’éditeur de page de l’Assistant, avec l’espace de noms Microsoft .NET complet.)
DisplayName Spécifie le nom convivial de l’éditeur de page, qui s’affiche dans le Designer de l’assistant UDI
DLL (en anglais) Spécifie le nom du fichier .dll associé à la page de l’Assistant (le fichier .dll doit exister dans le dossier installation_folder\Templates\Distribution\Tools\platform (où installation_folder est le dossier dans lequel vous avez installé MDT et platform est x86 pour la version 32 bits ou x64 pour la version 64 bits). Remarque : Assurez-vous que l’architecture du processeur DLL correspond à l’architecture du processeur MDT installé. Par exemple, si vous avez installé une version 32 bits de MDT, veillez à utiliser une DLL 32 bits pour la page de l’Assistant.
Image Spécifie le nom d’une image de la page au format PNG (Portable Network Graphics) (le fichier .png doit exister dans le dossier installation_folder\Bin\Images (où installation_folder est le dossier dans lequel vous avez installé MDT.)
Type Spécifie l’éditeur de page de l’Assistant et doit correspondre au nom utilisé lors de l’enregistrement de la page personnalisée
Remarques

Le UDI Wizard Designer utilise l’élément Page comme un modèle pour créer le XML initial d’un nouvel assistant. Le Designer de l’assistant UDI effectue une validation de schéma pour s’assurer que la page et les éléments enfants ont un format valide. Cet élément fournit un mappage entre le type de page de l’assistant UDI et les informations dont le designer de l’assistant UDI a besoin pour éditer et créer des pages de ce type à l’aide d’un éditeur de page personnalisé.

Exemple

Aucun.

Param

Cet élément spécifie un paramètre qui est transmis à l’élément Task ouValidator parent et correspond à un élément Setter dans le fichier de configuration de l’assistant UDI.

Remarque

Les attributs de cet élément sont différents si le parent est l’élément Tâche ou Validateur .

Informations sur l’élément

Le tableau 59 fournit des informations sur l’élément Param .

Tableau 59. Informations sur l’élément de paramètre

Attribut Valeur
Nombre d’occurrences Une ou plusieurs pour chaque élément parent TaskItem ou Validator
Éléments parents Élément de tâche, validateur
Sommaire Tout contenu XML bien formé
Attributs d’élément

Le tableau 60 répertorie les attributs de l’élément Param et fournit une description de chacun.

Tableau 60. Attributs et valeurs correspondantes de l’élément Param

Attribut Description
Description Spécifie le texte qui fournit des informations sur le paramètre, qui est affiché dans le Designer de l’assistant UDI Remarque : Cet attribut est valide uniquement pour l’élément Validator.
DisplayName Spécifie le nom convivial du paramètre de validation, qui est affiché pour la page appropriée de l’assistant UDI dans la Designer de l’assistant UDI (ce nom est généralement plus descriptif que l’attribut Name (Remarque : Cet attribut n’est valide que pour l’élément Validator.
Nom Spécifie le nom du paramètre qui est transmis à la tâche ou au validateur, en fonction de l’élément parent (cet attribut deviendra l’attribut Property d’un élément Setter dans le fichier de configuration de l’assistant UDI.) Remarque : Ce paramètre est utilisé pour les éléments parents TaskItem et Validator .
Remarques

Aucun.

Exemple

Aucun.

Tâche

Cet élément spécifie une tâche dans la bibliothèque de tâches.

Informations sur l’élément

Le tableau 61 fournit des renseignements sur l’élément Tâche .

Tableau 61. Informations sur l’élément de tâche

Attribut Valeur
Nombre d’occurrences Un ou plusieurs éléments dans l’élément TaskLibrary (cet élément n’est pas facultatif si l’élément TaskLibrary est spécifié.)
Éléments parents Bibliothèque de tâches
Sommaire TaskItem
Attributs d’élément

Le tableau 62 énumère les attributs de l’élément Tâche et fournit une description de chacun.

Tableau 62. Attributs et valeurs correspondantes pour l’élément de tâche

Attribut Description
Description Spécifie le texte qui fournit des informations sur la tâche, qui est affiché dans le Designer de l’assistant UDI
DLL (en anglais) Spécifie le nom du fichier .dll associé à la tâche (le fichier .dll doit exister dans le dossier installation_folder\Templates\Distribution\Tools\platform (où installation_folder est le dossier dans lequel vous avez installé MDT et la plateforme est x86 pour la version 32 bits ou x64 pour la version 64 bits).
Nom Spécifie le nom de la tâche, qui est affiché dans la page appropriée de l’assistant UDI et dans le designer de l’assistant UDI
Type Spécifie le type de tâche, qui est inscrit dans le Registre d’usine et utilisé pour appeler une tâche spécifique dans un fichier .dll
Remarques

Aucun.

Exemple

Aucun.

TaskItem

Cet élément spécifie un groupe de paramètres qui sont transmis à la tâche.

Informations sur l’élément

Le tableau 63 fournit des informations sur l’élément TaskItem .

Tableau 63. Informations sur l’élément TaskItem

Attribut Valeur
Nombre d’occurrences Une ou plusieurs pour chaque élément de tâche
Éléments parents Tâche
Sommaire Param
Attributs d’élément

Le tableau 64 répertorie les attributs de l’élément TaskItem et fournit une description de chacun.

Tableau 64. Attribut et valeurs correspondantes pour l’élément TaskItem

Attribut Description
Type Spécifie le type d’élément qui sera créé dans le fichier de configuration de l’assistant UDI. Un élément XML correspondant à la valeur de cet attribut est créé. Par exemple, si la valeur de cet attribut est File, alors un élément File sera créé dans le fichier de configuration de l’assistant UDI.

Actuellement, les seules valeurs prises en charge sont :

- qui nécessite deux éléments enfants Param (un élément enfant Param dont l’attribut Name est défini sur Source et un autre élément enfant Param dont l’attribut Name est défini sur Dest)
- Setter, qui nécessite un élément enfant Param
Remarques

Aucun.

Exemple

Aucun.

Bibliothèque de tâches

Cet élément regroupe un ensemble d’éléments Task .

Informations sur l’élément

Le tableau 65 fournit des informations sur l’élément TaskLibrary .

Tableau 65. Informations sur les éléments de la bibliothèque de tâches

Attribut Valeur
Nombre d’occurrences zéro ou un dans l’élément DesignerConfig (Cet élément est facultatif s’il n’y a aucune tâche personnalisée dans la DLL qui correspond à ce fichier de configuration de l’assistant Designer de l’UDI .)
Éléments parents DesignerConfig
Sommaire Tâche
Attributs d’élément

Cet élément n’a aucun attribut.

Remarques

Aucun.

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

Validateur

Cet élément spécifie un validateur dans la bibliothèque de validateurs.

Informations sur l’élément

Le tableau 66 fournit des informations sur l’élément Validator .

Tableau 66. Informations sur l’élément du validateur

Attribut Valeur
Nombre d’occurrences zéro ou plus dans l’élément ValidatorLibrary (cet élément est facultatif.)
Éléments parents ValidatorLibrary
Sommaire Param
Attributs d’élément

Le tableau 67 répertorie les attributs de l’élément Validator et fournit une description de chacun.

Tableau 67. Attributs et valeurs correspondantes pour l’élément valideur

Attribut Description
Description Spécifie le texte qui fournit des informations sur le validateur, qui est affiché dans le Designer de l’assistant UDI
DisplayName Spécifie le nom convivial du validateur affiché dans le Designer de l’assistant UDI (ce nom est généralement plus descriptif que l’attribut Name).
DLL (en anglais) Spécifie le nom du fichier .dll associé au validateur (le fichier .dll doit exister dans le dossier installation_folder\Templates\Distribution\Tools\platform (où installation_folder est le dossier dans lequel vous avez installé MDT et la plateforme est x86 pour la version 32 bits ou x64 pour la version 64 bits).
Nom Spécifie le nom du validateur, qui est affiché dans la page appropriée de l’assistant UDI et dans le designer de l’assistant UDI
Type Spécifie le type de validateur, qui est inscrit avec le facteur de Registre et utilisé pour appeler un validateur spécifique dans un fichier .dll
Remarques

Aucun.

Exemple

Aucun.

ValidatorLibrary

Cet élément regroupe un ensemble d’éléments du programme de validation .

Informations sur l’élément

Le tableau 68 fournit des informations sur l’élément ValidatorLibrary .

Tableau 68. Informations sur les éléments ValidatorLibrary

Attribut Valeur
Nombre d’occurrences Zéro ou un dans l’élément DesignerConfig (Cet élément est facultatif s’il n’y a aucun validateur personnalisé dans la DLL qui correspond à ce fichier de configuration de l’Assistant UDI Designer.)
Éléments parents DesignerConfig
Sommaire Validateur
Attributs d’élément

Cet élément n’a aucun attribut.

Remarques

Aucun.

Exemple

<DesignerConfig> + <TaskLibrary> - <ValidatorLibrary> +<Validator DLL=" » Description="Nécessite du texte dans un champ » Type="Microsoft.Wizard.Validation.NonEmpty » Name="NonEmpty »> +<Validator DLL=" » Description="Ne permet pas la présence de certains caractères dans un champ » Type="Microsoft.Wizard.Validation.InvalidChars » Name="InvalidChars »> +<Validator DLL=" » Description="Doit suivre un modèle prédéfini » Type="Microsoft.Wizard.Validation.RegEx » Name= » NamedPattern »> +<Validator DLL=" » Description="Exiger que le contenu corresponde à une expression régulière » Type="Microsoft.Wizard.Validation.RegEx » Name="RegEx"></ValidatorLibrary> + <DesignerMappings></DesignerConfig>

Référence du Designer de l’Assistant UDI

Contrôles

Les contrôles utilisés pour créer des éditeurs de page d’Assistant personnalisés à utiliser dans UDI Wizard Designer sont des instances WPF UserControl. Le tableau 69 répertorie les contrôles que vous pouvez utiliser pour créer des éditeurs de page d’Assistant personnalisés.

Tableau 69. Contrôles pouvant être utilisés pour créer des éditeurs de page d’Assistant personnalisés

Contrôle Description
CollectionTControl Ce contrôle est utilisé pour modifier les données stockées dans l’élément Data d’un élément Page .
FieldElementControl Ce contrôle permet de modifier un champ, généralement associé à un contrôle TextBox de la page .xaml.
SetterControl Ce champ permet de modifier la valeur d’un élément de réglage dans le fichier de configuration de l’assistant UDI.

CollectionTControl

Ce contrôle offre de nombreuses possibilités d’édition des données. La meilleure façon d’apprendre à utiliser ce contrôle est d’examiner l’exemple, qui montre comment modifier les données sous l’élément Data d’une page. En particulier, l’exemple montre comment ajouter, supprimer et modifier des éléments dans ce contrôle.

FieldElementControl

Utilisez ce contrôle pour modifier un champ, qui est généralement lié à un contrôle TextBox sur la page .xaml.

Exemple

L’extrait suivant d’un fichier .xaml illustre l’utilisation de FieldElementControl pour configurer la valeur par défaut d’un champ sur une page d’Assistant à l’aide d’un contrôle TextBox enfant :

<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>
Propriétés
Données de champ

Cette propriété de chaîne contient des informations permettant de connecter FieldElementControl au XML sous-jacent pour le champ. La connexion est établie sur une propriété de l’interface de l’éditeur de page. L’extrait suivant d’un fichier .xaml illustre l’utilisation de la propriété FieldData :

FieldData="{Binding DataContext.Location, ElementName=ControlRoot}"

Dans cet extrait, l’interface de l’éditeur de page s’appelle ControlRoot et est spécifiée dans le paramètre ElementName . La liaison s’effectue à la propriété DataContext.Location de l’interface de l’éditeur de page ControlRoot . DataContext est un modèle d’affichage qui pointe vers l’élément Page dans le fichier de configuration de l’assistant UDI. Location est une propriété de la vue qui renvoie une liste des emplacements possibles et est définie par un élément Data dans le fichier de configuration de l’assistant UDI. Chaque emplacement est défini par un élément DataItem dans le fichier de configuration de l’assistant UDI.

HeaderText

Cette propriété de chaîne vous permet de spécifier un en-tête pour le contrôle FieldElementControl . L’en-tête sert de titre au contrôle et est mis en forme sous forme de texte orange en gras affiché juste au-dessus du contrôle.

Texte d’instruction

Cette propriété de chaîne vous permet de spécifier du texte d’information pour le contrôle FieldElementControl . En règle générale, le texte est utilisé pour fournir une brève description du champ et expliquer comment la configuration du champ affecte la page de l’assistant correspondant.

HideEnableButton

Cette propriété booléenne vous permet de contrôler la visibilité du bouton qui change d’état entre Déverrouillé et Verrouillé (activé ou désactivé). Si cette option est définie sur :

  • True, le bouton n’est pas visible

  • False, le bouton est visible (il s’agit de la valeur par défaut).

HideDefaultTab

Cette propriété booléenne vous permet de contrôler la visibilité de la section qui contient le contrôle utilisé pour définir la valeur par défaut. Bien que la propriété fasse référence à un onglet, il n’y a pas d’onglet sur le FieldElementControl mais plutôt une section qui peut être masquée. Si cette option est définie sur :

  • Certes, la section n’est pas visible

  • False, la section est visible (il s’agit de la valeur par défaut).

HideBorder

Cette propriété booléenne vous permet de contrôler la visibilité de la bordure autour du contrôle de champ. Si cette option est définie sur :

  • Certes, la bordure n’est pas visible

  • False, la bordure est visible (il s’agit de la valeur par défaut).

HideImage

Cette propriété booléenne vous permet de contrôler la visibilité de l’image configurée par la propriété FieldImageSource . Si cette option est définie sur :

  • Certes, l’image n’est pas visible

  • False, l’image est visible (il s’agit de la valeur par défaut).

HideValidationTab

Cette propriété booléenne vous permet de contrôler la visibilité de la section où la liste des validateurs est gérée. Bien que la propriété fasse référence à un onglet, il n’y a pas d’onglet sur le FieldElementControl mais plutôt une section qui peut être masquée. Si cette option est définie sur :

  • Certes, la section n’est pas visible

  • False, la section est visible (il s’agit de la valeur par défaut).

HideSummaryTab

Cette propriété booléenne vous permet de contrôler la visibilité de la section dans laquelle vous configurez la légende du résumé du champ. La légende et la valeur correspondante du champ sont affichées sur un type de page de l’Assistant SummaryPage dans un flux d’étapes. Bien que la propriété fasse référence à un onglet, il n’y a pas d’onglet sur le FieldElementControl mais plutôt une section qui peut être masquée. Si cette option est définie sur :

  • Certes, la section n’est pas visible

  • False, la section est visible (il s’agit de la valeur par défaut).

HideTaskSequenceTab

Cette propriété booléenne vous permet de contrôler la visibilité de la section dans laquelle vous configurez la variable de séquence de tâches qui correspond au champ. Bien que la propriété fasse référence à un onglet, il n’y a pas d’onglet sur le FieldElementControl mais plutôt une section qui peut être masquée. Si cette option est définie sur :

  • Certes, la section n’est pas visible

  • False, la section est visible (il s’agit de la valeur par défaut).

SetterControl

Utilisez cette commande pour modifier la valeur d’un élément Setter dans le fichier de configuration de l’assistant UDI. Ce contrôle contient un contrôle enfant utilisé pour modifier la valeur de l’élément de setter .

Exemple

L’extrait suivant d’un fichier .xaml illustre l’utilisation de SetterControl pour modifier un élément Setter nommé KeyLocationSetter à l’aide d’un contrôle TextBox enfant.

<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>
Propriétés
SetterData

Vous devez le lier à une propriété de votre vue ou à un modèle de vue qui se connecte au setter. Cette opération est similaire à la façon dont vous lieriez un champ, comme décrit pour FieldElementControl.

HeaderText

Cette propriété vous permet de définir le texte qui apparaîtra dans l’en-tête du contrôle. Considérez cette propriété comme un titre de contrôle ; Par défaut, il s’affiche sous forme de texte orange en gras.

Texte d’instruction

Définissez cette propriété sur le texte que vous souhaitez voir apparaître sous l’en-tête, généralement un texte d’instruction indiquant à l’utilisateur de votre éditeur personnalisé quand et pourquoi il souhaite modifier le comportement du champ.

Interfaces

Le tableau 70 répertorie les interfaces que vous pouvez utiliser pour créer des éditeurs de page d’Assistant personnalisés.

Tableau 70. Interfaces qui peuvent être utilisées pour créer des éditeurs de page d’Assistant personnalisés

Interface Description
IDataService Utilisez cette interface pour connecter des champs aux éléments de données dans le fichier de configuration de l’assistant UDI.
IMessageBoxService Cette interface permet d’accéder aux méthodes que vous pouvez utiliser pour afficher les boîtes de message.

IDataService

Cette interface contient plusieurs propriétés et méthodes, mais il n’y a qu’une seule propriété dont vous aurez besoin. Cette propriété est la seule documentée ici.

Vous pouvez utiliser l’injection de dépendances pour obtenir un pointeur vers cette interface en utilisant du code comme celui-ci dans votre classe :

[Dependency]
public IDataService DataService { get; set; }
Propriétés

Le Tableau 71 répertorie les propriétés de l’interface IDataService .

Tableau 71. Propriétés de l’interface IDataService

Interface Description
CurrentPage Cette propriété permet d’accéder aux éléments, attributs et valeurs XML dans le contexte de la page active en cours de modification dans le fichier de configuration de l’assistant UDI
CurrentPage
XElement CurrentPage { get; set; }

Cette propriété permet d’accéder au fichier XML pour la page active. Vous ne devez jamais définir cette propriété, mais vous êtes libre de modifier le XML de votre page. L’éditeur de page exemple montre des exemples de modification du code XML. Vous utilisez cette propriété principalement lorsque vous disposez de données personnalisées. Pour les champs et les propriétés (setters), vous pouvez utiliser des contrôles prédéfinis qui prennent en charge tous les détails.

IMessageBoxService

Cette interface permet d’accéder aux méthodes que vous pouvez utiliser pour afficher les boîtes de message. Vous vous demandez peut-être pourquoi vous avez besoin d’une interface pour afficher une boîte de message. En réalité, ce n’est pas le cas : Microsoft utilise cette interface dans le code, car elle facilite l’écriture de tests automatisés pour les pages Designer.

Cependant, l’utilisation de ces méthodes offre un avantage utile : les boîtes de dialogue ont toujours le « propriétaire » défini sur l’assistant UDI, ce qui garantit que la boîte de dialogue est correctement regroupée avec la fenêtre principale.

Vous pouvez utiliser l’injection de dépendances pour obtenir un pointeur vers cette interface en utilisant du code comme celui-ci dans votre classe :

[Dependency]
public IMessageBoxService MessageBoxes { get; set; }
Méthodes

Le Tableau 72 répertorie les méthodes de l’interface IMessageBoxService .

Tableau 72. Méthodes pour l’interface IMessageBoxService

Méthode Description
ShowMessageBox Cette méthode surchargée est utilisée pour afficher une boîte de message avec les membres suivants :

- ShowMessageBox(Message de chaîne, légende de chaîne, icône MessageBoxImage)
- ShowMessageBox(string message, string légende, bouton MessageBoxButton, icône MessageBoxImage)
- ShowMessageBox(Exception exception)
ShowDialogWindow Utilisez cette méthode pour créer une boîte de dialogue.
ShowWizardWindow Utilisez cette méthode pour afficher un éditeur personnalisé à l’intérieur d’une boîte de dialogue qui inclut des boutons Suivant et Précédent pour la navigation.
ShowMessageBox

Cette méthode affiche une boîte de message qui est un enfant de l’éditeur de page de l’Assistant personnalisé. Ce membre est surchargé : le tableau 73 contient une liste des membres et une brève description de chacun. Pour des informations complètes sur chaque membre (y compris la syntaxe, l’utilisation et les exemples), consultez la section qui correspond à chaque membre.

Tableau 73. Membres surchargés pour la méthode ShowMessagBox

Member Description
ShowMessageBox(Message de chaîne, légende de chaîne, icône MessageBoxImage) Affiche une zone de message avec une icône et un bouton OK
ShowMessageBox(string message, string légende, bouton MessageBoxButton, icône MessageBoxImage) Affiche une zone de message avec une icône et différentes combinaisons possibles de boutons
ShowMessageBox(Exception exception) Affiche une zone de message qui fournit des informations sur une exception et qui comporte un bouton OK
ShowMessageBox(Message de chaîne, légende de chaîne, icône MessageBoxImage)
void ShowMessageBox(String message, String caption, MessageBoxImage icon);

Cette méthode affiche une zone de message avec un bouton OK . Voir tableau 74.

Tableau 74. Paramètres de la méthode ShowMessageBox(String message, String légende, MessageBoxImage icon)

Paramètre Description
message Message à afficher dans la zone de contenu de la zone de message
caption Texte à afficher dans la barre de titre de la boîte de dialogue
icon Type d’icône à afficher dans la zone de message
ShowMessageBox(string message, string légende, bouton MessageBoxButton, icône MessageBoxImage)
MessageBoxResult ShowMessageBox(string message, string caption, MessageBoxButton button, MessageBoxImage icon);

Cette méthode affiche une zone de message avec l’ensemble de boutons que vous souhaitez afficher et indique le bouton que vous avez sélectionné. Voir tableau 75.

Tableau 75. Paramètres de la méthode ShowMessageBox(string message, string légende, bouton MessageBoxButton, icône MessageBoxImage)

Paramètre Description
message Message à afficher dans la zone de contenu de la zone de message
caption Texte à afficher dans la barre de titre de la boîte de dialogue
bouton Quels boutons afficher
icon Type d’icône à afficher dans la zone de message
ShowMessageBox(Exception exception)
void ShowMessageBox(Exception exception);

Cette méthode affiche une boîte de message qui fournit des informations sur une exception. Cette boîte de message ne comporte qu’un seul bouton OK . Voir tableau 76.

Tableau 76. Paramètres de la méthode ShowMessageBox(exception d’exception)

Paramètre Description
Exception L’exception que vous souhaitez signaler (La boîte de dialogue utilise exception. Message comme le contenu.)
ShowDialogWindow
void ShowDialogWindow(Type viewType, DialogInteraction dialogPayload);

Cette méthode crée une nouvelle boîte de dialogue, dont le contenu est le texte que vous fournissez dans le paramètre viewType . Le UDI Designer crée une nouvelle instance de ce type et l’encapsule dans une boîte de dialogue comportant les boutons OK et Annuler.

Vous transmettez des données à votre contrôle à l’aide du paramètre dialogPayload. La solution SampleEditor dans le répertoire SDK contient un exemple d’utilisation de cette fonctionnalité.

ShowWizardWindow
void ShowWizardWindow(Type viewType, DialogInteraction dialogPayload);

Cette méthode vous permet d’afficher un éditeur personnalisé à l’intérieur d’une boîte de dialogue qui inclut des boutons Suivant et Retour pour la navigation. Microsoft n’a pas fourni d’exemple d’utilisation de cette méthode.

Référence du schéma du fichier de configuration de l’Assistant UDI

Ce fichier est consommé par l’assistant UDI et configuré par le Designer de l’assistant UDI. Ce fichier permet de configurer :

  • Pages de l’assistant affichées dans l’assistant UDI

  • La séquence des pages de l’assistant dans l’assistant UDI

  • Paramètres des champs de chaque page de l’Assistant

  • StageGroups disponibles dans le Designer de l’assistant UDI

  • Étapes disponibles dans chaque assistant de déploiement dans l’assistant UDI Designer

    77 répertorie les éléments du fichier de configuration de l’assistant UDI et leurs descriptions. L’élément Assistant est le nœud racine de cette référence.

Tableau 77. Éléments du fichier de configuration de l’assistant UDI et leurs descriptions

Nom de l'élément Description
Données Regroupe les éléments DataItem individuels au sein d’un élément Page et est nommé par l’attribut Name (Nom ).
élément de données Regroupe les éléments Setter individuels au sein d’un élément Page . Vous pouvez créer des données hiérarchiques en incluant un ou plusieurs éléments de données dans un élément DataItem . Chaque élément DataItem représente un élément individuel. Par exemple, une liste de lecteurs disponibles peut avoir un DataItem pour le nom complet et un autre élément DataItem pour la lettre de lecteur correspondante.
Default Spécifie une valeur par défaut pour le champ spécifié dans l’élément parent Field ou RadioGroup . La valeur par défaut est définie sur la valeur entre crochets de cet élément.
DLL (en anglais) Spécifie une DLL qui doit être chargée et référencée par l’assistant UDI et le designer de l’assistant UDI.
DLL (DLL) Regroupe les éléments de DLL individuels.
Erreur Spécifie un code d’erreur possible qu’une tâche peut renvoyer. La valeur du code d’erreur est renvoyée par le HRESULT de la tâche et est bloquée par cet élément pour fournir des informations plus spécifiques sur l’erreur.
Code de sortie Spécifie un code de sortie possible pour une tâche. Les codes de sortie sont les codes de retour attendus par la tâche. Créez un élément ExitCode pour chaque code de sortie possible. Sinon, vous pouvez spécifier un astérisque (*) dans l’attribut Value pour gérer les codes de retour non répertoriés dans d’autres éléments ExitCode .
Codes de sortie Regroupe un ensemble d’éléments ExitCode et Error pour un élément de tâche ou d’erreur.
Field Spécifie une instance d’un contrôle dans un élément Page utilisé pour fournir une personnalisation avec XML. Tous les contrôles n’autorisent pas la personnalisation avec XML : seuls les contrôles qui utilisent l’élément Field .
Fields Regroupe les éléments de champ individuels au sein d’un élément de page .
Fichier Spécifie la source et la destination d’une opération de copie de fichier à l’aide du type de tâche Microsoft.Wizard.CopyFilesTask . Vous pouvez inclure un élément Fichier distinct pour copier plusieurs fichiers dans une même tâche.
Page Spécifie un instance d’une page et inclut tous les paramètres de configuration de la page.
Réf. page Spécifie une référence à une instance d’une page dans une phase dans un groupe de phases.
Pages Regroupe les éléments individuels de la page .
Groupe radio Spécifie un groupe de boutons radio dans un élément Field .
Groupe d’étapes Spécifie un groupe d’une ou plusieurs étapes.
Groupes de scènes Regroupe un ensemble de groupes d’étapes dans un fichier de configuration de l’Assistant UDI.
Setter Spécifie le paramètre de propriété d’une valeur pour une propriété nommée dans la propriété Propriété .
Stade Spécifie une étape au sein d’un StageGroup et contient un ou plusieurs éléments PageRef .
Style Regroupe les éléments de réglage individuels qui configurent l’apparence de l’assistant UDI, y compris le titre affiché en haut de l’assistant et l’image de bannière affichée sur l’assistant UDI.
Tâche Spécifie une tâche à exécuter sur la page spécifiée dans l’élément Page parent.
Tâches Regroupe un ensemble de tâches pour un élément Page .
Validateur Spécifie un validateur pour le contrôle de champ spécifié dans l’élément Field parent.
Assistant Spécifie la racine de tous les autres éléments.

Data

Cet élément regroupe les éléments DataItem individuels au sein d’un élément Page et est nommé par l’attribut Name .

Informations sur l’élément

Le tableau 78 fournit des renseignements sur l’élément de données .

Tableau 78. Informations sur les éléments de données

Attribut Valeur
Nombre d’occurrences zéro ou plus dans chaque élément Page (cet élément est facultatif.)
Éléments parents Page, DataItem
Sommaire DataItem, Setter
Attributs d’élément

Le tableau 79 énumère les attributs de l’élément de données et fournit une description de chacun.

Tableau 79. Attributs et valeurs correspondantes de l’élément de données

Attribut Description
Nom Spécifie le nom de l’élément Data
Remarques

L’attribut Name permet au code de récupérer un ensemble spécifique de données.

Exemple

Aucun.

élément de données

Cet élément regroupe les éléments Setter individuels au sein d’un élément Page . Vous pouvez créer des données hiérarchiques en incluant un ou plusieurs éléments de données dans un élément DataItem . Chaque élément DataItem représente un élément individuel. Par exemple, une liste de lecteurs disponibles peut avoir un DataItem pour le nom complet et un autre élément DataItem pour la lettre de lecteur correspondante.

Informations sur l’élément

Le tableau 80 fournit des informations sur l’élément DataItem .

Tableau 80. Informations sur l’élément DataItem

Attribut Valeur
Nombre d’occurrences zéro ou plus dans chaque élément de données (cet élément est facultatif).
Éléments parents Données
Sommaire Données, Setter
Attributs d’élément

Cet élément n’a aucun attribut.

Remarques

Aucun.

Exemple

Aucun.

Par défaut

Cet élément spécifie une valeur par défaut pour le champ spécifié dans l’élément parent Field ou RadioGroup . La valeur par défaut est la valeur entre crochets de cet élément.

Informations sur l’élément

Le tableau 81 fournit des informations sur l’élément Par défaut .

Tableau 81. Informations sur l’élément par défaut

Attribut Valeur
Nombre d’occurrences Zéro ou plus dans un élément Champ ou RadioGroupe (Cet élément est facultatif.)
Éléments parents Field, RadioGroup
Sommaire Il peut s’agir de n’importe quel contenu XML bien formé, mais il s’agit généralement de texte standard
Attributs d’élément

Cet élément n’a aucun attribut.

Remarques

Aucun.

Exemple

Dans l’exemple suivant, la valeur par défaut du champ Fuseau horaire est définie sur « Heure Standard du Pacifique » :

<Field Name="TimeZone" Enabled="true" VarName="OSDTimeZone" Summary="Time Zone:">
  <Default>Pacific Standard Time</Default>

DLL (en anglais)

Cet élément spécifie une DLL que l’assistant UDI et le designer de l’assistant UDI doivent charger et référencer.

Informations sur l’élément

Le tableau 82 fournit des informations sur l’élément DLL .

Tableau 82. Informations sur les éléments DLL

Attribut Valeur
Nombre d’occurrences Un ou plusieurs dans l’élément DLLs
Élément parent DLL (DLL)
Sommaire Aucun contenu autorisé pour cet élément
Attributs d’élément

Le tableau 83 répertorie les attributs de l’élément DLL et fournit une description de chacun.

Tableau 83. Attributs et valeurs correspondantes de l’élément DLL

Attribut Description
Nom Spécifie le nom de la DLL que l’Assistant UDI et le Designer de l’Assistant UDI doivent référencer.
Remarques

Aucun.

Exemple
<DLLs>
  <DLL Name="OSDRefreshWizard.dll" />
  <DLL Name="SharedPages.dll" />
</DLLs>

DLL (DLL)

Cet élément regroupe les éléments DLL individuels.

Informations sur l’élément

Le tableau 84 fournit des informations sur l’élément DLLs .

Tableau 84. Informations sur l’élément des DLL

Attribut Valeur
Nombre d’occurrences Un
Éléments parents Assistant
Sommaire DLL (en anglais)
Attributs d’élément

Cet élément n’a aucun attribut.

Remarques

Aucun.

Exemple
<DLLs>
   <DLL Name="OSDRefreshWizard.dll" />
   <DLL Name="SharedPages.dll" />
</DLLs>

Erreur

Cet élément spécifie un code d’erreur possible qu’une tâche peut renvoyer. La valeur du code d’erreur est renvoyée et bloquée par le HRESULT de la tâche pour fournir des informations plus spécifiques sur l’erreur.

Informations sur l’élément

Le tableau 85 fournit des informations sur l’élément Error .

Tableau 85. Informations sur l’élément d’erreur

Attribut Valeur
Nombre d’occurrences zéro ou plus dans chaque élément ExitCode (cet élément est facultatif.)
Éléments parents Codes de sortie
Sommaire Tout contenu XML bien formé
Attributs d’élément

Le tableau 86 répertorie les attributs de l’élément Error et fournit une description de chacun.

Tableau 86. Informations sur l’élément d’erreur

Attribut Description
État Spécifie l’état de retour d’une tâche qui a rencontré une erreur. En règle générale, la valeur de cet attribut est définie sur Error. Cette valeur est affichée dans la colonne État sur la page de l’assistant dans l’assistant UDI.
Text Spécifie le texte descriptif de la condition d’erreur rencontrée par la tâche.
Type Indique si cet élément représente une erreur, un avertissement ou une réussite. La valeur spécifiée dansType doit être unique dans un élément ExitCodes . Les valeurs suivantes sont valides pour cet élément :

- **0.**L’élément représente un succès.
- 1. L’élément représente un avertissement.
- -1. L’élément représente une erreur.
Valeur Spécifie la valeur du code que la tâche a renvoyé sous forme de valeur numérique. La spécification de la valeur d’un astérisque (*) indique l’élément par défaut pour les codes de retour qui ne sont pas répertoriés dans les autres éléments Error .
Remarques

Aucun.

Exemple

Aucun.

Code de sortie

Cet élément spécifie un code de sortie possible pour une tâche. Les codes de sortie sont les codes de retour attendus par la tâche. Créez un élément ExitCode pour chaque code de sortie possible. Sinon, vous pouvez spécifier un astérisque (*) dans l’attribut Value pour gérer les codes de retour non répertoriés dans d’autres éléments ExitCode .

Informations sur l’élément

Le tableau 87 fournit des renseignements sur l’élément ExitCode .

Tableau 87. ExitCode Informations sur l’élément

Attribut Valeur
Nombre d’occurrences zéro ou plus dans chaque élément ExitCodes (cet élément est facultatif.)
Éléments parents Codes de sortie
Sommaire Au moins un élément ExitCode et zéro ou plusieurs éléments d’erreur
Attributs d’élément

Le tableau 88 répertorie les attributs de l’élément ExitCode et fournit une description de chacun.

Tableau 88. Attributs et valeurs correspondantes pour l’élément ExitCode

Attribut Description
État Spécifie l’état de retour d’une tâche. La valeur de cet attribut est affichée dans la colonne État de la page d’assistant correspondante dans l’assistant UDI. Vous pouvez utiliser toutes les valeurs de cet attribut qui sont significatives pour votre tâche. Les valeurs suivantes sont des valeurs classiques utilisées pour cet attribut :

- Réussite
- Avertissement
- Erreur
Text Spécifie le texte descriptif du code existant de la tâche.
Type Indique si cet élément représente une erreur, un avertissement ou une réussite. La valeur spécifiée dans le type doit être unique dans un élément ExitCodes . Les valeurs suivantes sont valides pour cet élément :

- 0. L’élément représente une réussite.
- 1. L’élément représente un avertissement.
- -1. L’élément représente une erreur.
Valeur Spécifie la valeur du code que la tâche a renvoyé sous forme de valeur numérique. La spécification de la valeur d’un astérisque (*) indique l’élément par défaut pour les codes de retour qui ne sont pas répertoriés dans les autres éléments ExitCode .
Remarques

Aucun.

Exemple

Aucun.

Codes de sortie

Cet élément regroupe un ensemble d’éléments ExitCode et Error pour un élément de tâche ou d’erreur .

Informations sur l’élément

Le tableau 89 fournit des renseignements sur l’élément ExitCodes .

Tableau 89. Informations sur l’élément ExitCodes

Attribut Valeur
Nombre d’occurrences Un dans chaque élément de tâche
Éléments parents Tâche
Sommaire Erreur, ExitCode
Attributs d’élément

Cet élément n’a aucun attribut.

Remarques

Aucun.

Exemple

Aucun.

Field

Cet élément spécifie une instance d’un contrôle dans un élément Page utilisé pour fournir une personnalisation avec XML. Tous les contrôles n’autorisent pas la personnalisation avec XML : seuls les contrôles qui utilisent l’élément Field .

Informations sur l’élément

Le tableau 90 fournit des renseignements sur l’élément Champ .

Tableau 90. Informations sur les éléments de champ

Attribut Valeur
Nombre d’occurrences zéro ou plus dans chaque élément de champ (cet élément est facultatif.)
Éléments parents Fields
Sommaire Valeur par défaut, validateur
Attributs d’élément

Le tableau 91 énumère les attributs de l’élément Field et fournit une description de chacun.

Tableau 91. Attributs et valeurs correspondantes pour l’élément field

Attribut Description
Enabled Indique si le champ est activé pour la saisie utilisateur (l’attribut peut être défini sur true ou false).
Nom Spécifie le nom du champ
Résumé Spécifie le texte descriptif affiché sur la page de l’Assistant Synthèse pour la valeur définie par ce champ
VarName Spécifie le nom de la variable de séquence de tâches lu ou configuré à l’aide du champ dans l’élément Field parent
Remarques

Cet élément peut contenir zéro ou plusieurs éléments par défaut et zéro ou plusieurs éléments de validation .

Exemple

Aucun.

Champs

Cet élément regroupe les éléments de champ individuels au sein d’un élément Page .

Informations sur l’élément

Le tableau 92 fournit des renseignements sur l’élément Champs .

Tableau 92. Champs Informations sur les éléments

Attribut Valeur
Nombre d’occurrences zéro ou plus dans chaque élément Page (cet élément est facultatif.)
Éléments parents Page
Sommaire Field, RadioGroup
Attributs d’élément

Cet élément n’a aucun attribut.

Remarques

Aucun.

Exemple

Aucun.

Fichier

Cet élément spécifie la source et la destination d’une opération de copie de fichier à l’aide du type de tâche Microsoft.Wizard.CopyFilesTask . Vous pouvez inclure un élément Fichier distinct pour copier plusieurs fichiers dans une même tâche.

Informations sur l’élément

Le tableau 93 fournit des informations sur l’élément Fichier .

Tableau 93. Informations sur l’élément de fichier

Attribut Valeur
Nombre d’occurrences Une ou plusieurs pour chaque tâche dont le type de tâche est Microsoft.Wizard.CopyFilesTask
Éléments parents Tâche
Sommaire Aucun
Attributs d’élément

Le tableau 94 répertorie les attributs de l’élément File et fournit une description de chacun.

Tableau 94. Attributs et valeurs correspondantes pour l’élément de fichier

Attribut Description
Dest Spécifie le chemin complet ou relatif au dossier de destination du fichier spécifié dans l’attribut Source . Les variables d’environnement sont autorisées dans le chemin d’accès.
Source Spécifie le chemin d’accès complet ou relatif au fichier source copié par le type de tâche Microsoft.Wizard.CopyFilesTask . Cet attribut prend en charge les caractères génériques, de sorte que plusieurs fichiers peuvent être copiés à l’aide d’un seul élément File . Les variables d’environnement sont autorisées dans le chemin d’accès.
Remarques

Aucun.

Exemple

Aucun.

Page

Cet élément spécifie un instance d’une page et inclut tous les paramètres de configuration de la page.

Informations sur l’élément

Le tableau 95 fournit des informations sur l’élément Page .

Tableau 95. Informations sur les éléments de page

Attribut Valeur
Nombre d’occurrences Un ou plusieurs dans chaque élément Pages
Éléments parents Pages
Sommaire Données, Champs, Setter, Tâches
Attributs d’élément

Le tableau 96 répertorie les attributs de l’élément Page et fournit une description de chacun.

Tableau 96. Attributs et valeurs correspondantes pour l’élément Page

Attribut Description
DisplayName Spécifie le nom convivial de la page de l’assistant affichée dans le Designer de l’assistant UDI. Ce nom est généralement plus descriptif que l’attribut Nom .
Nom Spécifie le nom de la page de l’assistant affichée dans le Designer de l’assistant UDI.
Type Spécifie le type de page d’Assistant directement liée à une page d’Assistant spécifique dans une DLL.
Remarques

Aucun.

Exemple

Aucun.

Réf. page

Cet élément spécifie une référence à une instance d’une page dans une phase dans un groupe de scènes.

Informations sur l’élément

Le tableau 97 fournit des informations sur l’élément PageRef .

Tableau 97. Informations sur l’élément PageRef

Attribut Valeur
Nombre d’occurrences Un ou plusieurs éléments d’étape
Éléments parents Stade
Sommaire Aucun
Attributs d’élément

Le tableau 98 répertorie l’attribut de l’élément PageRef et fournit une description de celui-ci.

Tableau 98. Attributs et valeurs correspondantes pour l’élément PageRef

Attribut Description
Page Spécifie l’instance d’une page dans une phase dans un groupe de phases. Définissez cette valeur sur l’attribut Name d’un élément Page .
Remarques

Aucun.

Exemple

Aucun.

Pages

Cet élément regroupe les éléments individuels de la page .

Informations sur l’élément

Le tableau 99 fournit des informations sur l’élément Pages .

Tableau 99. Informations sur l’élément Pages

Attribut Valeur
Nombre d’occurrences Un
Éléments parents Assistant
Sommaire Page
Attributs d’élément

Cet élément n’a aucun attribut.

Remarques

Aucun.

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

Groupe radio

Cet élément spécifie un groupe de boutons radio dans un élément Field .

Informations sur l’élément

Le tableau 100 fournit des informations sur l’élément RadioGroup .

Tableau 100. Informations sur l’élément du groupe radio

Attribut Valeur
Nombre d’occurrences zéro ou plus dans un élément Fields (cet élément est facultatif.)
Éléments parents Fields
Sommaire Default
Attributs d’élément

Le tableau 101 répertorie les attributs de l’élément RadioGroup et fournit une description de chacun.

Tableau 101. Attributs et valeurs correspondantes pour l’élément RadioGroup

Attribut Description
Locked Spécifie si le groupe de boutons radio est activé pour la saisie utilisateur. L’attribut peut être défini sur :

- C’est vrai. Spécifie que les cases d’option sont désactivées et que les utilisateurs ne peuvent pas sélectionner de case d’option dans le groupe.
- Faux. Spécifie que les cases d’option sont activées et que les utilisateurs peuvent sélectionner une case d’option dans le groupe.
Nom Spécifie le nom du groupe d’options radio.
Remarques

Aucun.

Exemple

Aucun.

Groupe d’étapes

Cet élément spécifie un groupe d’étapes de déploiement.

Informations sur l’élément

Le tableau 102 fournit des informations sur l’élément StageGroup .

Tableau 102. Informations sur l’élément StageGroup

Attribut Valeur
Nombre d’occurrences Un ou plusieurs dans un élément StageGroups
Éléments parents Groupes de scènes
Sommaire Stade
Attributs d’élément

Le tableau 103 répertorie les attributs de l’élément StageGroup et une description de l’attribut.

Tableau 103. Attributs et valeurs correspondantes pour l’élément StageGroup

Attribut Description
DisplayName Spécifie le nom convivial du groupe d’étapes affiché dans le UDI Wizard Designer. Ce nom est généralement plus descriptif que l’attribut Nom .
Remarques

Aucun.

Exemple

Aucun.

Groupes de scènes

Cet élément regroupe un ensemble de groupes d’étapes dans un fichier de configuration UDI Wizard.

Informations sur l’élément

Le tableau 104 fournit des informations sur l’élément StageGroups .

Tableau 104. Informations sur l’élément StageGroups

Attribut Valeur
Nombre d’occurrences Zéro ou un dans un élément d’Assistant
Éléments parents Assistant
Sommaire Groupe d’étapes
Attributs d’élément

Cet élément n’a aucun attribut.

Remarques

Aucun.

Exemple

Aucun.

Setter

Cet élément spécifie un paramètre de propriété pour la valeur d’une propriété nommée dans la propriété Property .

Informations sur l’élément

Le tableau 105 fournit des informations sur l’élément Setter .

Tableau 105. Informations sur l’élément de réglage

Attribut Valeur
Nombre d’occurrences zéro ou plus dans chaque élément parent (cet élément est facultatif).
Éléments parents Data, DataItem, Page, Style, Tâche, Validateur
Sommaire Contient une valeur de chaîne dans l’attribut Propriété
Attributs d’élément

Le tableau 106 répertorie l’attribut de l’élément Setter et fournit une description de celui-ci.

Tableau 106. Attributs et valeurs correspondantes pour l’élément setter

Attribut Description
Propriété Spécifie le nom de la propriété en cours de définition. Le nom de la propriété est défini sur la valeur que cet attribut met entre crochets.
Remarques

Aucun.

Exemple

Aucun.

Phase

Cet élément spécifie une étape dans un StageGroup et contient un ou plusieurs éléments PageRef .

Informations sur l’élément

Le tableau 107 fournit des renseignements sur l’élément Étape .

Tableau 107. Informations sur les éléments d’étape

Attribut Valeur
Nombre d’occurrences Un ou plusieurs dans un élément StageGroup
Éléments parents Groupe d’étapes
Sommaire Réf. page
Attributs d’élément

Le tableau 108 répertorie les attributs de l’élément Stage et fournit une description de chacun.

Tableau 108. Attributs et valeurs correspondantes pour l’élément d’étape

Attribut Description
DisplayName Spécifie le nom convivial de la page de l’assistant affichée dans le Designer de l’assistant UDI. Ce nom est généralement plus descriptif que l’attribut Nom .
Nom Spécifie le nom de la scène. La valeur de cet élément est utilisée lors du démarrage de l’assistant UDI avec le paramètre de ligne de commande /stage : name .
Remarques

Aucun.

Exemple

Aucun.

Style

Cet élément regroupe les éléments Setter individuels qui configurent l’apparence de l’assistant UDI, y compris le titre affiché en haut de l’assistant et l’image de bannière affichée sur l’assistant UDI.

Informations sur l’élément

Le tableau 109 fournit des informations sur l’élément Style.

Tableau 109. Informations sur les éléments de style

Attribut Valeur
Nombre d’occurrences Un
Éléments parents Assistant
Sommaire Setter
Attributs d’élément

Cet élément n’a aucun attribut.

Remarques

Aucun.

Exemple
<Style>
  <Setter Property="bannerFilename">UDI_Wizard_Banner.bmp</Setter>
  <Setter Property="title">Operating System Deployment (OSD) Refresh Wizard</Setter>
</Style>

Tâche

Cet élément spécifie une tâche à exécuter sur la page spécifiée dans l’élément Page parent.

Informations sur l’élément

Le tableau 110 fournit des renseignements sur l’élément Tâche .

Tableau 110. Informations sur l’élément de tâche

Attribut Valeur
Nombre d’occurrences Un ou plusieurs dans un élément Tasks
Éléments parents Tâches
Sommaire ExitCodes, File, Setter
Attributs d’élément

Le tableau 111 énumère les attributs de l’élément Tâche et fournit une description de chacun.

Tableau 111. Attributs et valeurs correspondantes pour l’élément de tâche

Attribut Description
Dépend de Spécifie si la tâche dépend d’une autre tâche. La valeur de cet attribut est définie sur l’attribut Name d’un autre élément Tâche . Remarque : Cet attribut ne peut pas être configuré à l’aide du Designer de l’Assistant UDI. Cependant, vous pouvez ajouter manuellement cet attribut à un élément de tâche en modifiant directement le fichier .xml.
DisplayName Spécifie le nom convivial de la tâche affichée dans le Designer de l’assistant UDI. Ce nom est généralement plus descriptif que l’attribut Nom .
Nom Spécifie le nom de la tâche. Ce nom doit être unique.
Type Spécifie le type de tâche pour la tâche à exécuter, qui est défini dans la DLL qui contient la tâche.
Remarques

Aucun.

Exemple

Aucun.

Tâches

Cet élément regroupe un ensemble de tâches pour un élément de page .

Informations sur l’élément

Le tableau 112 fournit des informations sur l’élément Tâches .

Tableau 112. Informations sur l’élément Tâches

Attribut Valeur
Nombre d’occurrences Zéro ou un dans chaque élément Page (cet élément est facultatif.)
Éléments parents Page
Sommaire Tâche
Attributs d’élément

Le tableau 113 répertorie les attributs de l’élément Tâches et fournit une description de chacun.

Tableau 113. Attributs et valeurs correspondantes pour l’élément Tasks

Attribut Description
NameTitle Indique la légende qui s’affiche en haut de la colonne qui contient le nom des tâches dans la page appropriée de l’Assistant.
Titre d’état Indique la légende qui s’affiche en haut de la colonne qui contient le status des tâches dans la page appropriée de l’Assistant.
Remarques

Aucun.

Exemple

Aucun.

Validateur

Cet élément spécifie un validateur pour le contrôle de champ spécifié dans l’élément Field parent.

Informations sur l’élément

Le tableau 114 fournit des informations sur l’élément Validator .

Tableau 114. Informations sur l’élément du validateur

Attribut Valeur
Nombre d’occurrences Zéro ou un dans un élément de champ
Éléments parents Field
Sommaire Setter
Attributs d’élément

Le tableau 115 répertorie l’attribut de l’élément Validator et en fournit une description.

Tableau 115. Attributs et valeurs correspondantes pour l’élément valideur

Attribut Description
Type Spécifie le type de validateur, qui est défini dans la DLL contenant le validateur
Remarques

Aucun.

Exemple

Aucun.

Assistant

Cet élément spécifie la racine de tous les autres éléments.

Informations sur l’élément

Le tableau 116 fournit des informations sur l’élément Assistant .

Tableau 116. Informations sur les éléments de l’Assistant

Attribut Valeur
Nombre d’occurrences Un
Éléments parents Aucun
Sommaire DLLs, Pages, StageGroups, Style
Attributs d’élément

Cet élément n’a aucun attribut.

Remarques

Aucun.

Exemple
<Wizard>
   + <DLLs>
   + <Style>
   + <Pages>
   + <StageGroups>
</Wizard>