Dela via


Användardriven installation – utvecklarguide

Användardriven installation (UDI) förenklar distributionen av Windows-klientoperativsystem®, till exempel Windows 8.1, till datorer som använder operativsystemsdistributionsfunktionen (OSD) i Microsoft® System Center 2012 R2 Configuration Manager. UDI är en del av Microsoft Deployment Toolkit (MDT).

Inledning

När du distribuerar operativsystem med osd-funktionen måste du vanligtvis ange all nödvändig information för att distribuera operativsystemet. Informationen konfigureras i konfigurationsfiler eller i databaser (till exempel CustomSettings.ini-filen eller MDT-databasen [MDT DB]). Du måste ange alla konfigurationsinställningar innan du kan starta distributionen.

UDI tillhandahåller ett guidedrivet gränssnitt som gör att du kan ange konfigurationsinformation direkt innan du utför distributionen. Med det här beteendet kan du skapa allmänna OSD-aktivitetssekvenser och sedan ange datorspecifik information vid tidpunkten för distributionen, vilket ger större flexibilitet i distributionsprocessen.

Målgrupp

Den här guiden är skriven för utvecklare som skapar anpassade guidesidor för UDI-guiden och anpassade sidredigerare för UDI-guiden Designer. Den här guiden förutsätter att du är bekant med utvecklingen av Windows-program med hjälp av:

  • C++, som används för att skapa anpassade guidesidor

  • Microsoft .NET Framework, som används för att skapa anpassade sidredigerare för guider

  • Windows Presentation Foundation (WPF), som används för att skapa anpassade sidredigerare för guider

  • Språk som WPF stöder, till exempel C#, C++ eller Microsoft Visual Basic® .NET, som används för att skapa anpassade sidredigerare för guider

Om den här guiden

Den här guiden innehåller nödvändig referensinformation som hjälper dig att anpassa UTI för din organisation. Den här guiden beskriver inte administrativa eller operativa ämnen, till exempel installation av MDT (som inkluderar UDI), konfiguration av UDI för att distribuera operativsystem och program eller utföra distributioner med hjälp av UDI-guiden. Mer information om dessa ämnen finns i UDI-ämnena i Använda Microsoft Deployment Toolkit, som ingår i MDT.

Översikt över UDI-utveckling

Med UDI-utveckling kan du utöka de funktioner som UDI tillhandahåller. Normalt krävs UDI-utveckling när du vill samla in ytterligare information som UDI-distributionsprocessen använder. Den här ytterligare informationen sparas vanligtvis som aktivitetssekvensvariabler som aktivitetssekvenssteg i en UDI-aktivitetssekvens i Configuration Manager läsa.

UDI-arkitektur

Målet med UDI-utveckling på hög nivå är att skapa anpassade guidesidor som kan visas i UDI-guiden. Genom att skapa anpassade guidesidor kan du utöka de befintliga funktionerna i UDI så att de uppfyller organisationens affärskrav och tekniska krav. En anpassad guidesida samlar in information utöver eller i stället för de guidesidor som UDI tillhandahåller.

Bild 1 illustrerar relationen mellan UDI-guiden Designer och UDI-guiden.

Bild 1. Relationen mellan UDI-guiden och UDI-guiden Designer bild 1. Relation mellan UDI-guiden och UDI-guiden Designer

Bild 1. Relation mellan UDI-guiden och UDI-guiden Designer

På konceptuell nivå omfattar UDI-utveckling skapandet av:

  • Anpassade guidesidor. Guidesidor visas i UDI-guiden och samlar in den information som krävs för att slutföra distributionsprocessen. Du skapar guidesidor med C++ i Microsoft Visual Studio®. De anpassade guidesidorna implementeras som DLL:er som UDI-guiden läser. UDI Software Development Kit (SDK) innehåller ett exempel på hur du skapar anpassade guidesidor.

  • Anpassade sidredigerare för guider. Du använder guidens sidredigerare för att konfigurera beteendet för din anpassade guidesida. De anpassade sidredigerarna i guiden implementeras som DLL:er som UDI-guiden Designer läser. Du skapar sidredigerare med hjälp av:

    • WPF version 4.0

    • Microsoft Prism version 4.0

    • Microsoft Unity Application Block (Unity) version 2.1

      MDT innehåller alla sammansättningar som krävs för att skapa en anpassad guide sidredigerare för användning i UDI-guiden Designer. UDI SDK innehåller ett exempel på hur du skapar anpassade sidredigerare för guider.

    Dessutom använder UDI-guiden Designer stöd för konfigurationsfiler för guidens sidredigerare. Du skapar konfigurationsfilerna för guidens sidredigerare som en del av processen för att skapa anpassade guidesidor och anpassade sidredigerare för guider. UDI-guiden Designer skapar nödvändig XML-information i konfigurationsfilen för UDI-guiden och motsvarande .app fil.

Förbereda UDI-utvecklingsmiljön

Innan du börjar skapa egna anpassade guidesidor och sidredigerare ska du utföra följande steg för att förbereda UDI-utvecklingsmiljön:

  1. Förbered kraven för UDI-utvecklingsmiljön enligt beskrivningen i Förbereda UDI-utvecklingsmiljöns förutsättningar.

  2. Konfigurera UDI-utvecklingsmiljön enligt beskrivningen i Konfigurera UDI-utvecklingsmiljön.

  3. Kontrollera att UDI-utvecklingsmiljön är korrekt konfigurerad enligt beskrivningen i Verifiera UDI-utvecklingsmiljön.

Förbereda förutsättningar för UDI-utvecklingsmiljön

Utför följande steg för att förbereda UDI-utvecklingsmiljöns krav:

  1. Förbered maskinvarukraven för UDI-utvecklingsmiljön enligt beskrivningen i Förbereda maskinvarukraven för UDI Development Environment.

  2. Förbered kraven för UDI-utvecklingsmiljön enligt beskrivningen i Förbereda programvarukraven för UDI Development Environment.

Förbereda maskinvarukraven för UDI Development Environment

Maskinvarukraven för UDI-utvecklingsmiljön är samma maskinvarukrav för den version av Microsoft Visual Studio som du använder. Mer information om dessa krav finns i systemkraven för varje utgåva i Visual Studio-dokumentationen.

Förbereda programvarukraven för UDI Development Environment

UDI-utvecklingsmiljön har följande programvarukrav:

  • Alla Windows-operativsystem som Visual Studio 2010 stöder (Windows 7 eller Windows Server® 2008 R2 rekommenderas.)

    Du behöver ett Windows-operativsystem som stöder den processorarkitektur som du vill utveckla. Du kan utföra 32-bitars och 64-bitars UDI-utveckling med hjälp av ett 64-bitars operativsystem. Du utför bara 32-bitars UDI-utveckling på 32-bitars operativsystem. Därför bör du använda ett 64-bitars operativsystem.

    Obs!

    IntelItanium-versioner (IA-64) av Windows-operativsystemet stöds inte för UDI-utvecklingsmiljöer.

    Mer information om de operativsystem som Visual Studio 2010 stöder finns i systemkraven för varje utgåva i Visual Studio-dokumentationen.

  • Microsoft .NET Framework version 4.0 (krävs av Visual Studio 2010)

  • C++-språk (det språk som används för att utöka sidor i UDI-guiden)

  • Andra språk som WPF stöder, till exempel C#, Visual Basic .NET eller C++/Common Language Infrastructure, som används för att utöka UDI-guiden Designer sidredigerare för guider

    Obs!

    Exempelkällkoden för UDI-guiden Designer guidens sidredigerare är skriven i C#. Installera C#-språket om du vill använda exempelkällkoden.

Konfigurera UDI-utvecklingsmiljön

När UDI-utvecklingsmiljöns krav är uppfyllda utför du följande steg för att konfigurera UDI-utvecklingsmiljön:

  1. Installera Visual Studio 2010.

    Se till att du installerar språket C++ och andra språk som WPF stöder.

    Obs!

    Exempelkällkoden för UDI-guiden Designer redigerarsidor skrivs i C#. Installera C#-språket om du vill använda exempelkällkoden.

    Mer information om hur du installerar Visual Studio 2010 finns i Installera Visual Studio.

  2. Installera MDT.

    Mer information om hur du installerar MDT finns i avsnittet "Installera eller uppgradera till MDT" i MDT-dokumentet Använda Microsoft Deployment Toolkit.

  3. I Utforskaren skapar du local_folder (där local_folder finns på en lokal enhet på utvecklingsdatorn).

  4. Kopiera mappen installation_folder\SDK till local_folder (där installation_folder är mappen där du installerade MDT och local_folder är en mapp som finns på en lokal enhet på utvecklingsdatorn).

    Du kopierar SDK-mappen till en annan plats eftersom MDT är installerat i mappen Programfiler, som inte kan skrivas till utan utökade behörigheter. Om du kopierar SDK-mappen till en annan plats kan du ändra filerna i SDK-mappen utan att kräva utökade behörigheter.

  5. Kopiera mappen installation_folder\Templates\Distribution\Tools till local_folder (där installation_folder är mappen där du installerade MDT och local_folder är mappen som du skapade tidigare i processen).

  6. Byt namn på mappen local_folder\Tools till local_folder\OSDSetupWizard (där local_folder är mappen som du skapade tidigare i processen).

    När den är klar bör mappstrukturen under local_folder se ut som mappstrukturen som illustreras i bild 2 (där local_folder är den mapp som du skapade tidigare i processen och visas som UDIDevelopment i bilden).

    Bild 2. Mappstruktur för UDI-utveckling Bild 2. Mappstruktur för UDI-utveckling

    Bild 2. Mappstruktur för UDI-utveckling

Verifiera UDI-utvecklingsmiljön

När UDI-utvecklingsmiljön har konfigurerats kontrollerar du att UDI-utvecklingsmiljön är korrekt konfigurerad genom att se till att exempelprojekten byggs korrekt i Visual Studio 2010.

Kontrollera att UDI-utvecklingsmiljön är korrekt konfigurerad genom att avgöra om:

Kontrollera att SamplePage-projektet byggs korrekt

SamplePage-projektet innehåller ett exempel på hur du skapar en anpassad guidesida för UDI-guiden. Mer information om SamplePage-projektet finns i Granska Visual Studio-lösningen SamplePage.

Kontrollera att SamplePage-projektet byggs korrekt

  1. Starta Visual Studio 2010.

  2. Öppna SamplePage-projektet.

    SamplePage-projektet finns i mappen local_folder\SDK\UDI\SamplePage (där local_folder är den mapp som du skapade tidigare i processen).

  3. I Visual Studio 2010 i Solution Explorer högerklickar du på SamplePage-projektet och väljer sedan Egenskaper.

    Dialogrutan SamplePage-egenskapssidor visas.

  4. I dialogrutan SamplePage-egenskapssidor går du till Konfigurationsegenskaper/felsökning.

  5. I felsökningsegenskaperna går du till Konfiguration och väljer Alla konfigurationer.

  6. I felsökningsegenskaperna, under Kommando, skriver du $(TargetDir)\OSDSetupWizard.exe.

  7. I felsökningsegenskaperna går du till Arbetskatalog och skriver $(TargetDir).

  8. I dialogrutan SamplePage-egenskapssidor går du till Konfigurationsegenskaper/Skapa händelser/Händelse efter bygge.

  9. Skriv följande under Kommandorad i egenskaperna efter bygghändelsen:

    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. I dialogrutan SamplePage-egenskapssidor väljer du OK.

  11. Spara projektet.

  12. felsökningsmenyn väljer du Starta felsökning.

    Dialogrutan Microsoft Visual Studiovisas som anger att källan är inaktuell och frågar om du vill skapa projektet.

  13. I dialogrutan Microsoft Visual Studio väljer du Ja.

    Dialogrutan Ingen felsökningsinformation visas som informerar dig om att ingen felsökningsinformation är tillgänglig för OSDSetupWizard.exe.

  14. I dialogrutan Ingen felsökningsinformation väljer du Ja.

    UDI-guiden öppnas med den anpassade guidesidan.

  15. Kontrollera att du kan välja ett värde i Välj din plats.

  16. I guiden med exempelformulär väljer du Avbryt.

    Dialogrutan Avbryt guiden visas.

  17. I dialogrutan Avbryt guiden väljer du Ja.

  18. Stäng Visual Studio 2010.

Kontrollera att SampleEditor-projektet byggs korrekt

SampleEditor-projektet innehåller ett exempel på hur du skapar en anpassad guidesideredigerare för UDI-guiden Designer. Mer information om SampleEditor-projektet finns i Granska Visual Studio-lösningen SamplePage.

Kontrollera att SampleEditor-projektet byggs korrekt

  1. Starta Visual Studio 2010.

  2. Öppna SampleEditor-projektet.

    SampleEditor-projektet finns i mappen local_folder\SDK\UDI\SampleEditor (där local_folder är mappen som du skapade tidigare i processen).

  3. I Visual Studio 2010 går du till Solution Explorer och väljer projektet SampleEditor.

  4. projektmenyn väljer du Lägg till referens.

    Dialogrutan Lägg till referens öppnas.

  5. I dialogrutan Lägg till referens väljer du fliken Bläddra .

  6. På fliken Bläddra går du till installation_folder\Bin (där installation_folder är mappen där du installerade MDT). Välj följande filer och välj sedan 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

    Obs!

    Du kan markera flera filer på fliken Bläddra genom att hålla ned CTRL-tangenten medan du väljer filerna.

  7. I Solution Explorer går du till SampleEditor/References.

  8. Kontrollera att ingen av referenserna har några varningar eller fel.

  9. I Solution Explorer högerklickar du på projektet SampleEditor och väljer sedan Egenskaper.

    Dialogrutan SampleEditor-egenskapssidor visas.

  10. I dialogrutan SampleEditor Property Pages (Egenskapssidor för SampleEditor ) väljer du fliken Felsök .

  11. På fliken Felsök väljer du Starta externt program.

  12. I Starta externt program skriver duinstallation_folder\Bin\UDIDesigner.exe (där installation_folder är mappen där du installerade MDT) och väljer sedan OK.

    Tips

    Du kan välja ellipsknappen (...) för att bläddra till mappen och välja UDIDesigner.exe.

  13. Arkiv-menyn väljer du Spara alla.

  14. Kopiera filen local_folder\SDK\SamplePage\SamplePage.dll.config till mappen installation_folder\Bin\Config (där local_folder är mappen som du skapade på utvecklingsdatorn tidigare i konfigurationsprocessen ochinstallation_folder är mappen där du installerade MDT).

  15. I Visual Studio 2010 går du till felsökningsmenyn och väljer Starta felsökning.

    UDI-guiden Designer startar.

  16. Välj Öppna i menyfliksområdet i UDI-guiden Designer.

    Dialogrutan Öppna visas.

  17. I dialogrutan Öppna öppnar du filen local_folder\SDK\SamplePage\SamplePage\Config.xml (där local_folder är mappen som du skapade på utvecklingsdatorn tidigare i konfigurationsprocessen).

    Filen Config.xml öppnas och Custom StageGroup visas i informationsfönstret.

  18. I informationsfönstret väljer du fliken Konfigurera .

  19. Granska konfigurationsinformationen för rutan Plats , inklusive följande:

    • Upplåst knapp som du aktiverar eller inaktiverar rutan Plats med

    • Standardvärderuta där du anger ett standardvärde som ska visas i rutan Plats

    • Eget visningsnamn som visas på sammanfattningssidan, där du anger bildtext för den information som visas på sidan Sammanfattning

    • Listruta för plats , som innehåller en lista över möjliga platser

  20. Stäng UDI-guiden Designer.

  21. Stäng Visual Studio 2010.

Granska UDI SDK-exemplen

Granska exemplen i UDI SDK innan du börjar utveckla. Använd informationen i den här guiden och källkoden i exemplen för att skapa egna anpassade UDI-guidesidor och guider för sidredigerare.

Gå igenom UDI SDK-exemplen genom att granska:

Granska innehållet i SDK-mappen

Under konfigurationen av UDI-utvecklingsmiljön kopierade du SDK-mappen från mappen där du installerade MDT till en annan mapp som du skapade. Tabell 1 visar mapparna direkt under SDK-mappen och innehåller en kort beskrivning av var och en.

Tabell 1. Mappar i UDI SDK

Mapp Den här mappen innehåller
Innehåller De C++-huvudfiler som krävs för att skapa anpassade guidesidor för UDI-guiden
Libs C++-biblioteksfilerna som ska länkas till din anpassade sida. det finns 32-bitars- och 64-bitarsversioner av biblioteken för statiska länkar. Observera: Itanium-versioner av biblioteken (IA-64) är inte tillgängliga.
SampleEditor Ett Visual Studio-projekt för att skapa en anpassad redigerare som används för att redigera samplepage-sidan i UDI-guiden Designer, som är skriven i C#
SamplePage Ett Visual Studio-projekt för att skapa en anpassad UDI-guidesida, som är skriven i Visual C++

Granska Visual Studio-lösningen för SamplePage

Innan du börjar skapa anpassade guidesidor och sidredigerare bör du utföra följande uppgifter för att förbereda UDI-utvecklingsmiljön:

Granska guidens sidlivscykel

En UDI-guidesida har metoder som motsvarar varje fas (eller fas) i sidans livscykel. Som en del av att skapa din anpassade guidesida måste du åsidosätta dessa metoder med din kod. Tabell 2 visar de metoder som du behöver åsidosätta och innehåller en kort beskrivning av varje metod, inklusive när du ska använda metoden i guidens sidlivscykel.

Tabell 2. Metoder i en guide, sidlivscykel

Metod Beskrivning
OnWindowCreated Den här metoden anropas en gång när sidans fönster har skapats.

För den här metoden skriver du kod som initierar sidan för första gången och som bara behöver utföras en gång. Använd till exempel den här metoden för att initiera fält eller läsa konfigurationsinformation från Setter-elementen i konfigurationsfilen för UDI-guiden.
OnWindowShown Den här metoden anropas varje gång sidan visas (visas) i UDI-guiden. Den kallas första gången sidan visas och varje gång du navigerar till sidan genom att välja Nästa eller Tillbaka i guiden.

För den här metoden skriver du kod som förbereder sidan som ska visas, till exempel att läsa minnesvariabler, aktivitetssekvensvariabler eller miljövariabler och sedan uppdatera sidan baserat på eventuella ändringar i dessa variabler.
OnCommonControlEvent Den här metoden kan anropas varje gång guidesidan visas och tar emot ett WM_NOTIFY meddelande från ett underordnat meddelande (vanligtvis vanliga kontroller).

För den här metoden skriver du kod som hanterar WM_NOTIFY baserat på aviseringsmeddelandet. Du kanske till exempel vill svara på händelser från en gemensam kontroll, till exempel svara på markera eller dubbelklicka på händelser för en TreeView-kontroll .
OnUnhandledEvent Den här metoden anropas när ett ohanterat fönstermeddelande inträffar för din guidesida. Den här metoden ger möjlighet att fånga upp och hantera dessa annars ohanterade fönstermeddelanden.

För den här metoden skriver du kod som hanterar de fönstermeddelanden som är relevanta för din guidesida. Normalt behöver du inte åsidosätta den här metoden.
OnNextSelected Den här metoden anropas när du väljer Nästa i guiden.

För den här metoden skriver du kod som utför nödvändiga åtgärder innan du går vidare till nästa guidesida, till exempel att utföra validering som kan ta lång tid. Om verifieringen misslyckas kan du avbryta nästa begäran och visa ett meddelande.
OnWindowHidden Den här metoden anropas varje gång sidan döljs när antingen föregående eller nästa guidesida visas.

För den här metoden skriver du kod som utför åtgärder innan sidan döljs innan en annan sida visas. Normalt behöver du inte åsidosätta den här metoden.

Granska exemplet samplepage

Granska exemplet SamplePage med hjälp av följande lista, som representerar händelsesekvensen under guidesidans livscykel i SamplePage-exemplet:

  1. UDI-guiden, OSDSetupWizard.exe, läser konfigurationsinformationen från konfigurationsfilen för UDI-guiden i exemplet (Config.xml-filen) enligt beskrivningen i Steg 1: UDI-guiden (OSDSetupWizard.exe) läser Config.xml-filen.

  2. UDI-guiden läser in de DLL:er som krävs för varje guidesida som anges i konfigurationsfilen för UDI-guiden enligt beskrivningen i Steg 2: UDI-guiden läser in DLL:en för den anpassade guidesidan.

  3. UDI-guiden visar den anpassade guidesidan och tillåter önskad kontrollinteraktion enligt beskrivningen i Steg 3: UDI-guiden Visar den anpassade guidesidan.

  4. När den anpassade guidesidan har samlat in informationen utför du alla nödvändiga uppgifter innan du väljer Nästa för att gå vidare till nästa guide enligt beskrivningen i Steg 4: Nästa knapp är markerad på sidan Anpassad guide.

Steg 1: UDI-guiden (OSDSetupWizard.exe) läser Config.xml-filen

När UDI-guiden (OSDSetupWizard.exe) startar läser den som standard konfigurationsfilen för UDI-guiden, som är den UDIWizard_Config.xml filen – den primära konfigurationsfilen för UDI-guiden.

Obs!

I exemplet används den Config.xml filen som konfigurationsfil. I MDT är standardkonfigurationsfilen den UDIWizard_Config.xml filen som finns i mappen Skript i MDT Files-paketet för konfiguration.

Du kan åsidosätta standardkonfigurationsfilen som används av UDI-guiden genom att ändra aktivitetssekvenssteget för UDI-guiden så att parametern /definition används. Mer information om hur du åsidosätter standardkonfigurationsfilen som används i UDI-guiden finns i "Åsidosätt konfigurationsfilen som används av UDI-guiden".

Elementen på den översta nivån i filen Config.xml är

  • DLL-element

  • Formatelement

  • Sidelement

  • Elementet StageGroups

    Mer information om schemat för konfigurationsfilen för UDI-guiden och vart och ett av dessa element finns i UDI-guidens schemareferens för konfigurationsfil.

    UDI-guiden söker igenom DLL-elementet och letar efter .dll filer som ska läsas in. I exemplet visas två .dll filer: SamplePage.dll och SharedPages.dll. Dessa .dll filer måste finnas i samma mapp som OSDSetupWizard.exe – mappen Tools\platform (där plattformen är x86 för 32-bitarsversionen eller x64 för 64-bitarsversionen).

    UDI-guiden söker igenom elementet Pages och letar efter de sidor som har definierats. I exemplet definieras två sidor: Anpassad och SummaryPage. Typattributet för sidelementet definieras i filen PageClassIDs.h och definierar unikt typen av anpassad sida.

    I exemplet är den definierade typen Microsoft.SamplePage.LocationPage. För din anpassade sida ersätter du följande för att undvika eventuella konflikter med andra sidor som du kan skapa i framtiden:

  • Ditt organisationsnamn i stället för Microsoft.

  • Projektnamnet i stället för SamplePage.

  • Namnet på den anpassade guidens sida i stället för LocationPage.

Steg 2: UDI-guiden läser in DLL-filen för den anpassade guidesidan

När UDI-guiden läser in DLL-filen anropas funktionen RegisterFactories , som måste implementeras i din .dll-fil. I exemplet implementeras den här funktionen i filen dllmain.ccp. Varje guidesida som du skapar måste implementera funktionen RegisterFactories .

Funktionen RegisterFactories används för att registrera fabriksklassen för din guidesida med klassfabriksregistret för UDI-guiden. Klassfabriker är klasser som kan skapa en instans av en annan klass. Funktionen RegisterFactories skapar en ny instans av en fabriksklass och skickar klassen till klassfabriksregistret för UDI-guiden, vilket gör den fabriksklassen tillgänglig för guiden. UDI-guiden söker efter en fabriksklass som registrerats med ett ID som matchar attributet Typ för sidelementet för den anpassade guidesidan.

I exemplet definieras ID:t som ID_Location i filen PageClassIds.h som Microsoft.SamplePage.LocationPage, som matchar attributet Typ för elementet Page i filen Config.xml. ID_Location skickas som en parameter i funktionen RegisterFactories som implementeras i filen dllmain.ccp.

Du kan skapa en funktion med hjälp av funktionsmallen Register_name för att förenkla skapandet av en ny fabriksinstans och registrera den nyligen skapade instansen. Namnvärdet som anges med hjälp av funktionsmallen Registrera måste implementera gränssnittet iClassFactory. ClassFactoryImpl-klassen hanterar det mesta av informationen för att implementera en klassfabrik.

Du kan också använda funktionen RegisterFactories för att registrera uppgiftstyper och valideringstyper. Mer information finns i följande avsnitt:

Obs!

Exemplet innehåller och registrerar endast en anpassad guidesida. Exemplet innehåller inte anpassade uppgifter eller validatorer och registrerar därför inte några anpassade uppgifter eller validerare.

Steg 3: UDI-guiden visar den anpassade guidesidan

Den anpassade guidesidan i exemplet definieras i LocationPage.cpp-filen. Guidesidor härleds från mallklasser som tillhandahåller mycket av de funktioner som en sida har. Alla guidesidor ska härledas från mallklassen WizardPageImpl, som implementerar gränssnittet IWizardPage. Varje guidesida kan implementera andra valfria mallklasser och motsvarande gränssnitt baserat på sidans behov.

Mallklassen WizardPageImpl har flera användbara gränssnitt som kan hjälpa dig att skriva anpassade guidesidor. Implementera mallklassen WizardPageImpl som basklass för din anpassade guidesida.

För en lista över tillgängliga:

  • Mallklasser för guidesidor finns i Hjälpklasser för guidesidor

  • Gränssnitt för guidesidans mallklasser finns i Guidens sidgränssnitt

    Den anpassade guidesidan i exemplet härleds från mallklassen WizardPageImpl och implementerar gränssnittet IWizardPage. Dessutom implementerar den anpassade guidesidan gränssnittet IFieldCallback . Båda dessa implementeras i filen LocationPage.cpp.

    Exempelsidan för den anpassade guiden åsidosätter följande metoder:

  • OnWindowCreated. Metoden OnWindowCreated i exempelguiden anropar följande metoder:

    • AddField. Den här metoden relaterar IDC_COMBO_LOCATION box-kontrollen i den IDD_LOCATION_PAGE resursen med dataelementetmed namnet Plats i Config.xml-filen.

      Förutom metoden AddField kan du använda metoderna AddRadioGroup och AddToGroup för att stödja andra kontroller och beteenden.

      Obs!

      Kontrollera att du anropar metoden AddField, AddRadioGroup eller AddToGroup innan du anropar metoden InitFields .

    • InitFields. Använd den här metoden för att initiera de fält (kontroller) som du har lagt till i formuläret. Pekaren på sidan är en parameter. I exemplet skickas den här pekaren, som refererar till den aktuella sidan.

      Obs!

      För att stödja användningen av den här pekaren måste du implementera gränssnittet IFieldCallback utöver de gränssnitt som mallklassen WizardPageImpl stöder.

      IFieldCallback-gränssnittet anropar metoden SetFieldDefault, som används för att ange standardvärden för andra kontroller än textrutor och kryssrutekontroller. I exemplet anger metoden SetFieldDefault det första indexet för kombinationsrutekontrollen baserat på standardvärdet som anges i elementet Standard för elementet Fält i filen Config.xml.

      Metoden OnWindowCreated konfigurerar formulärstyrenheten med hjälp av IFormController-gränssnittet. Mer information om hur du konfigurerar formulärstyrenheten finns i Konfigurera formuläret.

  • InitLocations. Den här metoden fyller i kombinationsrutan från listan över platser i Config.xml-filen. Dataelementet och underordnade DataItem-element som Confg.xml-filen innehåller en lista över möjliga värden.

  • OnNextSelected. Den här metoden utför följande uppgifter:

    • Uppdateringar aktivitetssekvensvariabeln TSLocation med värdet valt i kombinationsrutan med hjälp av metoden SaveFields

    • Lägger till information som visas på sidan Sammanfattning med hjälp av metoden SaveFields

Steg 4: Nästa knapp väljs på sidan Anpassad guide

När användaren slutför fälten på den anpassade guidesidan väljer de Nästa, som anropar metoden OnNextSelected . Metoden OnNextSelected utför alla nödvändiga uppgifter innan du fortsätter till nästa guidesida, till exempel att registrera eventuella konfigurationsändringar som görs på den anpassade guidesidan.

För den anpassade exempelguidesidan implementeras åsidosättningen för metoden OnNextSelected i filen LocationPage.ccp. I metoden OnNextSelected på exempelsidan för anpassad guide anropas följande metoder:

  1. InitSection. Den här metoden initierar rubriken (etikett bildtext) för sammanfattningsdata som visas på sidan Sammanfattning. Vanligtvis kan du ange det här värdet med hjälp av funktionen DisplayName(). De data som är associerade med den här bildtext sparas med hjälp av metoden SaveFields.

  2. SaveFields. Den här metoden sparar fältvärden i aktivitetssekvensvariabler och till de data som visas på sidan Sammanfattning .

Granska Visual Studio-lösningen SampleEditor

Innan du börjar skapa egna anpassade guidesidor och sidredigerare ska du utföra följande steg för att förbereda UDI-utvecklingsmiljön:

Granska UDI-guiden Designer Arkitektur

UDI-guiden Designer har utvecklats med WPF, Prism och Unity. UDI-Designer används för att redigera konfigurationsfilen för UDI-guiden (UDIWizard_Config.xml), som UDI-guiden (OSDSetupWizard.exe) läser vid körning. Elementet Pages i konfigurationsfilen för UDI-guiden innehåller en lista över sidor som har ett separat sidelement för varje guidesida.

När du redigerar konfigurationsinställningarna för en guidesida läser UDI-guiden Designer in den anpassade sidredigeraren som motsvarar guidens sidtyp. De anpassade sidredigerarna för guider utvecklas som WPF-användarkontroller. De anpassade sidorna i guidens sidredigerare använder designmönstret Model-View-ViewModel (MVVM) för WPF.

MVVM-designmönstret hjälper till att separera användargränssnittet (UI; presentation) från de data som presenteras. Data är en fasad över sidelementet i konfigurationsfilen för UDI-guiden (den Config.xml filen i exemplet), som används med egenskapen CurrentPage i IDataService-gränssnittet .

UDI-guiden Designer använder DependencyAttribute för att få åtkomst till Klassen DataService baserat på beroendeinmatningsramverket i Unity. Mer information om ramverket för beroendeinterjektion i Unity finns i Mata in lite liv i dina program – Lära känna Unity-programblocket.

Granska konfigurerbara komponenter för en UDI-guidesida

När du skapar din anpassade guidesida kan vissa konfigurationsinställningar anges i kod och kan inte ändras när du har kompilerat sidan. För andra konfigurationsinställningar måste du dock tillåta att dessa konfigurationsinställningar ändras med hjälp av UDI-guiden Designer.

Vanligtvis sparas de konfigurationsinställningar som du vill konfigurera med UDI-guiden Designer i konfigurationsfilen för UDI-guiden (Config.xml filen i exemplet). Men du kan också skapa en egen separat konfigurationsfil om det behövs. Ett exempel på hur du använder en separat konfigurationsfil är filen UDIWizard_Config.xml.app, som programidentifieringsaktiviteten och applicationpage-guidens sidtyp använder.

Följande är en lista över vanliga konfigurationsinställningar som du kan hantera med hjälp av UDI-guiden Designer:

  • Fält. Med fält kan användarna ange indata. Fält visas som Fältelement i konfigurationsfilen för UDI-guiden (UDIWizard_Config.xml), som innehåller konfigurationsinställningarna för varje fält. Motsvarande sidredigerare för guiden måste ange en metod för att redigera fältkonfigurationsinställningarna för fältet med hjälp av FieldElementControl.

  • Egenskaper. Setters hjälper till att skapa egenskaper för entiteter på sidan, till exempel sidor i sidelementet , fält i elementet Fält eller data i elementen Data eller DataItem . Du konfigurerar egenskaper i Setter-elementen . Lägg till ett separat Setter-element för varje egenskap som du vill definiera. Du redigerar egenskaperna med hjälp av SetterControl och konfigurerar andra Setter-element med hjälp av andra kontroller.

  • Data. Data används för att lagra information för användning av guidesidan och andra komponenter. Du kan definiera data för sidor eller fält med hjälp av elementen Data eller DataItem . Data kan definieras i en platt eller hierarkisk struktur genom korrekt användning av data - eller DataItem-elementen . Config.xml i exemplet i SDK visar hur du skapar flata datastrukturer.

    Den anpassade guidens sidredigerare som du skapar måste kunna hantera dessa konfigurationsinställningar.

Granska EditorPage-exemplet

EditorPage-exemplet används för att konfigurera konfigurationsinställningarna för guiden SamplePage i konfigurationsfilen för UDI-guiden. EditorPage-exemplet har följande primära komponenter:

  • Användargränssnitt för att konfigurera inställningarna för kombinationsrutan Plats

  • Användargränssnitt för att lägga till eller redigera en plats i listan över möjliga platser, som visas i kombinationsrutan Plats

  • Konfigurationsinställningar som lästs från och sparats i konfigurationsfilen för UDI-guiden

  • Stödkod för de andra komponenterna

    Granska EditorPage-exemplet i Visual Studio genom att utföra följande steg:

  1. Granska hur sidredigeraren SampleEditor läses in och initieras i UDI-guiden Designer enligt beskrivningen i Läs in och initiera i granskningsguidens sidredigerare.

  2. Granska användargränssnittet som används för att redigera kombinationsrutan Plats i LocationPageEditor.xaml och LocationPageEditor.xaml.cs filer enligt beskrivningen i Granska användargränssnittet som används för att konfigurera kombinationsrutan Plats.

  3. Granska användargränssnittet som används för att lägga till eller redigera platser i listan i filerna AddEditLocationView.xaml och AddEditLocationView.xaml.cs enligt beskrivningen i Granska användargränssnittet som används för att ändra listan över möjliga platser.

  4. Granska koden som används för att hantera konfigurationsinformation som sparats i konfigurationsfilen för UDI-guiden enligt beskrivningen i Granska koden som används för att hantera konfigurationsinformation.

Granska guiden Sidredigeraren läses in och initieras

Sidredigerare för anpassade guider läses in enligt UDI-guidens Designer. UDI-guiden Designer konfigurationsfiler läses in när UDI-guiden Designer startar. UDI-guiden Designer söker igenom mappen install_folder\Bin\Config (där install_folder är namnet på mappen där MDT är installerat) efter filer som har ett .config filnamnstillägg.

Under konfigurationen av UDI-utvecklingsmiljön kopierade du filen SamplePage.dll.confg till mappen install_folder\Bin\Config. När du startar UDI-guiden Designer hittas filen SamplePage.dll.confg och läses in.

UDI-guiden Designer använder följande attribut för sidelementet i filen SamplePage.dll.confg för att läsa in och initiera EditorPage-exemplet:

  • DesignerAssembly. Det här attributet bestämmer namnet på DLL:en som ska läsas in. Den här DLL-filen måste placeras i samma mapp som UDIDesigner.exe-filen, som är mappen install_folder\Bin (där install_folder är namnet på den mapp där MDT är installerat).

  • DesignerType. Det här attributet är Microsoft .NET-typnamnet för klassen som innehåller WPF-användarkontrollen.

  • Skriv. Använd det här attributet för att konfigurera sidtypen för den anpassade guidesidan, som UDI-guiden läser in. UDI-guiden Designer använder det här attributet för att hitta lämpligt sidelement i konfigurationsfilen för UDI-guiden.

  • Dll. Använd det här attributet för att konfigurera DLL-elementet i konfigurationsfilen för UDI-guiden, som UDI-guiden Designer skapar.

  • Beskrivning. Använd det här attributet för att ange information om guidens sidredigerare. Värdet för det här attributet visas i dialogrutan Lägg till ny sida i UDI-guiden Designer, som används för att lägga till guidesidan i sidbiblioteket.

  • DisplayName. Använd det här attributet för att ange namnet på den anpassade guidesidan som visas i UDI-guiden Designer. Värdet för det här attributet visas i dialogrutan Lägg till ny sida i UDI-guiden Designer, som används för att lägga till guidesidan i sidbiblioteket.

    I exemplet är typen för den anpassade guiden SamplePageMicrosoft.SamplePage.LocationPage, som sparas i filen Config.xml. Den Config.xml filen finns i mappen local_folder\SDK\SamplePage\SamplePage till (där local_folder är mappen som du skapade på utvecklingsdatorn tidigare i konfigurationsprocessen).

Granska användargränssnittet som används för att konfigurera platskombinationsrutan

När guidens sidredigerare läses in och initieras läses exempelredigeraren in när en sida med typen Microsoft.SamplePage.LocationPage redigeras. Sidredigerarens användargränssnitt lagras i filen LocationPageEditor.xaml.

Om du undersöker användargränssnittet på fliken Design och koden på fliken XAML kan du se relationen mellan det grafiska användargränssnittet och elementen och attributen i XAML (Extensible Application Markup Language).

Om du till exempel granskar elementet Controls:FieldElementControl i XAML kan du se hur det relaterar till layouten för motsvarande användargränssnitt. Använd elementet Controls:FieldElementControl för att definiera kontrollen FieldElementControl .

Bindningsparametrarna i XAML-filen binder fälten i exempelsideredigeraren med informationen i konfigurationsfilen för UDI-guiden. Följande kod kopplar till exempel textrutan Standardvärdetill standardelementet i konfigurationsfilen för UDI-guiden (Config.xml i exemplet):

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

Mer information finns i Gör data tillgängliga för bindning i XAML.

Använd elementet Views:CollectionTControl.ColumnCollectionView i XAML för att redigera listan över tillgängliga platser i rutnätsvyn. Du använder CollectionTControl-kontrollen för att visa rutnätsvyn och binda rutnätsvyn till dataelementet med namnet Plats i UDI-konfigurationsfilen.

Granska användargränssnittet som används för att ändra listan över möjliga platser

Användargränssnittet för att ändra listan över möjliga platser består av:

Granska sammanhangskänsliga meny- och menyfliksknappar för att ändra listan över platser

När du högerklickar i listrutan som innehåller listan över platser visas en sammanhangskänslig meny. Menyfliksområdet har motsvarande knappar som gör att du kan utföra samma uppgifter. Kontrollelementet Views:CollectionsTControl i filen LocationPageEditor.xaml definierar metoderna som anropas baserat på den åtgärd som vidtagits och de egenskaper som du anger på följande sätt:

  • SelectedItem. Den här databundna egenskapen aktiveras när användaren väljer ett objekt i listan. Den här egenskapen är knuten till egenskapen CurrentLocation i vymodellen, som finns i LocationPageEditorViewModel.cs-filen och används av CollectionTControl-kontrollen för att skicka objektet som markerats när du redigerar eller tar bort ett befintligt objekt.

  • AddItemAction. Den här åtgärden utförs när användaren väljer alternativet Lägg till objekt från den sammanhangskänsliga menyn eller motsvarande knappar i menyfliksområdet. Det finns en databindning till en egenskap i vymodellen som returnerar AddLocationAction-objektet . Det här objektet är metoden AddLocationCallback som finns i filen LocationPageEditorViewModel.cs och visar dialogrutan i filen AddEditLocationView.xaml.

  • EditItemAction. Den här åtgärden utförs när användaren väljer alternativet Redigera objekt på den sammanhangskänsliga menyn. Det finns en databindning till en egenskap i vymodellen som returnerar Objektet EditLocationAction . Det här objektet är metoden EditLocationCallback som finns i filen LocationPageEditorViewModel.cs och visar dialogrutan i filen AddEditLocationView.xaml.

  • RemoveAction. Den här åtgärden utförs när användaren väljer alternativet Ta bort objekt från den sammanhangskänsliga menyn. Det finns en databindning till en egenskap i vymodellen som returnerar RemoveAction-objektet . Det här objektet är metoden EditLocationCallback , som finns i LocationPageEditorViewModel.cs-filen, och visar ett meddelande som bekräftar borttagningen av platsen.

Granska dialogrutan för att lägga till eller redigera platser

Om du lägger till en ny plats i listan över platser eller redigerar en befintlig plats visas ett meddelande som finns i filen AddEditLocationView.xaml. Meddelandet visas med hjälp av window-metoden ShowDialogWindow i LocationPageEditorViewModel.cs-filen.

Användargränssnittet i filen AddEditLocationView.xaml består av:

  • En dialogruta med namnet DialogFrame, som innehåller följande element:

    • En rubrik som du konfigurerar med hjälp av dialogruteattributet DialogTitle i dialogrutan

    • En OK-knapp som anger returstatusen som för egenskapen Godkänd till True (Returstatusen är markerad i metoden AddLocationCallback i filen LocationPageEditorViewModel.cs för att avgöra om användaren har valt OK.)

    • En Avbryt-knapp som anger returstatusen som för egenskapen Godkänd till False (Returstatusen är markerad i metoden AddLocationCallback i filen LocationPageEditorViewModel.cs för att avgöra om användaren har valt Avbryt.)

  • Ett WPF-element som innehåller:

    • En etikett som du konfigurerar med hjälp av innehållsattributet

    • En textruta som är bunden till dataelementet med namnet Plats i UDI-konfigurationsfilen (Config.xml-filen i exemplet)

Granska koden som används för att hantera konfigurationsinformation

Konfigurationsinformationen för den anpassade guidesidan lagras i konfigurationsfilen för UDI-guiden, som är:

  • Config.xml fil i exemplet som medföljer UDI SDK (den här filen innehåller endast konfigurationsinställningarna för exemplet.)

  • UDIWizard_Config.xml fil som medföljer MDT, lagrad i mappen installation_folder\Templates\Distribution\Scripts (där installation_folder är mappen där du installerade MDT); den här filen innehåller konfigurationsinställningarna för alla inbyggda guidesidor och steg

    I exemplet SampleEditor hjälper rutinen Platser till att hantera konfigurationsinformationen och finns i filen LocationPageEditorViewModel.cs. Rutinen Platser returnerar en lista över platserna från konfigurationsfilen för UDI-guiden. Mer specifikt innehåller listan som returneras ett objekt för varje DataItem-element i konfigurationsfilen för UDI-guiden.

Skapa anpassade UDI-guidesidor

Processen på hög nivå för att skapa anpassade sidor i UDI-guiden är följande:

  1. Skapa en kopia av SamplePage-lösningen som utgångspunkt.

  2. Placera önskade kontroller (fält) i formuläret.

  3. Skriv kod för att utföra lämpliga uppgifter när guidesidan läses in (åsidosättningar för metoden OnWindowCreated ), inklusive följande steg:

    1. Initiera formuläret.

    2. Läs minnesvariabler, aktivitetssekvensvariabler, miljövariabler eller XML-filinformation (till exempel Setter-egenskaper ).

  4. Skriv valfri kod för att utföra lämpliga uppgifter när sidan visas (åsidosättningar för metoden OnWindowShown ), inklusive följande steg:

    1. Aktivera eller inaktivera kontroller baserat på information som läses in när sidan lästes in i steg 3.

    2. Uppdatera kontrollerna baserat på information som läses in när sidan sedan lästes in i steg 3, till exempel populationen av kontroller baserat på den information som lästs.

  5. Skriv valfri kod för att utföra lämpliga uppgifter medan användaren interagerar med guidesidan.

  6. Skriv valfri kod för att utföra lämpliga uppgifter när användaren väljer Nästa i UDI-guiden (åsidosättningar för metoden OnNextSelected ), inklusive följande steg:

    1. Uppdatera eventuella minnesvariabler, aktivitetssekvensvariabler, miljövariabler eller XML-filinformation.

    2. Uppdatera sammanfattningssidans information (om den inte utförs av fälten på sidan).

  7. Skapa lösningen.

    Se till att den version av DLL-filen som du skapar är samma processorplattform som installationen av MDT – särskilt processorplattformen för Windows Preinstallation Environment (Windows PE). UDI-guiden kan köras i:

    • Det befintliga operativsystemet på måldatorn. Du kan köra 32-bitarsversioner av guidesidan på 32-bitars eller 64-bitars Windows-operativsystem. Du kan dock bara köra 64-bitarsversioner av guidesidan på 64-bitars Windows-operativsystem.

    • Windows PE på måldatorn. Windows PE stöder inte körning av 32-bitarsprogram på en 64-bitarsversion av Windows PE. Därför måste du ha skapat en version för guidesidan för varje processorarkitektur i Windows PE som du planerar att använda.

  8. Kopiera DLL-filen för din anpassade guidesida till installation_folder\Templates\Distribution\Tools\ plattformsmapp (där installation_folder är mappen där du installerade MDT och plattformen är x86 för 32-bitarsversionen eller x64 är för 64-bitarsversionen).

  9. Slutför stegen för att skapa anpassad sidredigerare.

Skapa anpassade sidredigerare för guider

Processen på hög nivå för att skapa anpassade sidredigerare för UDI-guiden är följande:

  1. Skapa en kopia av SampleEditor-lösningen som utgångspunkt.

  2. Skapa användargränssnittet för den primära sidredigeraren i en .xaml-fil.

  3. Lägg till instanser av FieldElementControl-kontrollen som krävs av guidesidan som ska konfigureras (om det behövs).

  4. Lägg till instanser av SetterControl-kontrollen som krävs av guidesidan som ska konfigureras (om det behövs).

  5. Lägg till instanser av CollectionTControl-kontrollen som krävs av guidesidan som ska konfigureras (om det behövs).

  6. Lägg till IDataService-gränssnittet .

  7. Skriv lämplig kod för att uppdatera konfigurationsfilen för UDI-guiden baserat på konfigurationsinställningarna som ska konfigureras med hjälp av den anpassade guidens sidredigerare.

  8. Skapa underordnade dialogrutor i en .xaml-fil och anropa dem från den primära sidredigeraren med hjälp av gränssnittet IMessageBoxService som krävs av den guidesida som ska konfigureras.

  9. Lägg till lämpliga gränssnitt i UDI-guiden Designer menyfliksområdet baserat på kraven på den guidesida som ska konfigureras.

  10. Skapa lösningen.

    Obs!

    Se till att den version av DLL-filen som du skapar är samma processorplattform som installationen av MDT. Om du till exempel installerar 64-bitarsversionen av MDT skapar du en 64-bitarsversion av din anpassade sidredigerare.

  11. Skapa en UDI-guide Designer konfigurationsfil för att läsa in nödvändiga DLL:er och mappa guidens sidredigerare med motsvarande guidesida (den SamplePage.dll.config filen i exemplet).

    Mer information om de element som krävs för att utföra mappningen mellan guidesidan och guidens sidredigerare finns i elementet DesignerMappings , underordnade element och motsvarande attribut.

  12. Kopiera UDI-guiden Designer konfigurationsfil som du skapade i föregående steg till mappen installation_folder\Bin\Config (där installation_folder är mappen där du installerade MDT-versionen).

  13. Kopiera DLL-filen för den anpassade guidens sidredigerare till mappen installation_folder\Bin (där installation_folder är mappen där du installerade MDT).

Skapa anpassade UDI-uppgifter

UDI-uppgifter är DLL:er skrivna i C++ som implementerar ITask-gränssnittet. Du registrerar DLL med UDI-guiden Designer aktivitetsbibliotek genom att skapa en UDI-guide Designer konfigurationsfil (.config fil) och placera den i mappen installation_folder\Bin\Config (där installation_folder är mappen där du installerade MDT).

Obs!

Du kan skapa en DLL som innehåller guidesidor, uppgifter och validerare i samma .dll fil. Du kan också skapa en enda UDI-guide Designer konfigurationsfil (.config) som innehåller konfigurationsinställningarna för guidesidor, uppgifter och validerare i DLL:en.

Så här skapar du anpassade UDI-uppgifter

  1. Skriv kod som implementerar ITask-gränssnittet och följande metoder:

    • Init. Den här metoden anropas för att initiera uppgiften.

    • Kör. Den här metoden anropas för att köra aktiviteten.

  2. Skriv kod som registrerar den anpassade aktivitetsklassfabriken med fabriksregistret.

  3. Skapa lösningen för din anpassade uppgift.

    Obs!

    Se till att den version av DLL-filen som du skapar är samma processorplattform som installationen av MDT. Om du till exempel installerar 64-bitarsversionen av MDT skapar du en 64-bitarsversion av din anpassade UDI-uppgift.

  4. Skapa ett aktivitetselement under elementet TaskLibrary i UDI-guiden Designer konfigurationsfil som liknar följande utdrag:

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

    Obs!

    Alla aktivitetselement bör innehålla parametern BitmapFilename . Ange alla andra parametrar som uppgiften kräver. I föregående utdrag används till exempel loggparametern för att ange en parameter för platsen för en loggfil.

  5. Kopiera UDI-guiden Designer konfigurationsfil som skapades i föregående steg till mappen installation_folder\Bin\Config (där installation_folder är mappen där du installerade MDT).

  6. Kopiera DLL-filen för din anpassade uppgift till plattformsmappen installation_folder\Templates\Distribution\Tools\ (där installation_folder är mappen där du installerade MDT och plattformen är x86 för 32-bitarsversionen eller x64 är för 64-bitarsversionen).

Skapa anpassade UDI-validatorer

UDI-validatorer är DLL:er skrivna i C++ som implementerar IValidator-gränssnittet . Du registrerar DLL-filen med UDI-guiden Designer validatorbibliotek genom att skapa en UDI-guide Designer konfigurationsfil (.config fil) och placera den i mappen installation_folder\Bin\Config (där installation_folder är mappen där du installerade MDT).

Så här skapar du anpassade UDI-validerare

  1. Skriv kod som skapar en underklass av klassen BaseValidator och implementerar följande metoder:

    • Init(IControl *pControl, IWizardPageContainer *pContainer, IStringProperties *pProperties). Formulärkontrollanten anropar Init-medlemmen för att initiera validatorn. Den här metoden måste anropa Init-metoden för klassen BaseValidator . Den läser vanligtvis alla egenskaper som angetts för validatorn från konfigurationsfilen för UDI-guiden. Validatorn InvalidCharactersValidator hämtar till exempel värdet för egenskapen InvalidChars med den här metoden.

    • IsValid. Formulärkontrollanten anropar den här metoden för att se om kontrollen innehåller giltig text. Följande är ett exempel på metoden IsValid för en validerare som verifierar att fältet inte är tomt:

      BOOL IsValid(LPBSTR pMessage)
      {
          __super::IsValid(pMessage);
      
          _bstr_t text;
          m_pText->GetText(text.GetAddress());
          return (text.length() > 0);
      }
      
    • Init(IControl *pControl, LPCTSTR-meddelande). Formulärkontrollanten anropar den här medlemmen för varje tangenttryckning och andra händelser så att valideraren kan verifiera innehållet i kontrollen och uppdaterade meddelanden längst ned på guidesidan (eller rensa dem).

      Det här är vanligtvis de enda metoder som du behöver åsidosätta. Beroende på valideraren kan du dock behöva åsidosätta andra metoder i underklassen för klassen BaseValidator som du skapar. Mer information om dessa andra metoder finns i klassen BaseValidator .

  2. Skriv kod som registrerar den anpassade uppgiftsklassen med registerfabriken.

  3. Skapa lösningen för din anpassade uppgift.

    Obs!

    Se till att den version av DLL-filen som du skapar är samma processorplattform som installationen av MDT. Om du till exempel installerar 64-bitarsversionen av MDT skapar du en 64-bitarsversion av din anpassade UDI-uppgift.

  4. Skapa ett valideringselement under elementet ValidatorLibrary i UDI-guiden Designer konfigurationsfil som liknar följande utdrag:

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

    Varning

    Alla valideringselement bör innehålla parametern Meddelande . Ange alla andra parametrar som krävs av valideraren. I föregående utdrag används till exempel parametern NamedPattern för att ange en parameter för namnet på ett fördefinierat mönster för reguljära uttryck.

  5. Kopiera UDI-guiden Designer konfigurationsfil som skapades i föregående steg till mappen installation_folder\Bin\Config (där installation_folder är mappen där du installerade MDT).

  6. Kopiera DLL-filen för din anpassade uppgift till plattformsmappen installation_folder\Templates\Distribution\Tools\ (där installation_folder är mappen där du installerade MDT och plattformen är x86 för 32-bitarsversionen eller x64 är för 64-bitarsversionen).

Referens för UDI-guiden

Komponenter för guidens sida

Du kan använda någon av flera fördefinierade komponenter för att skapa dina anpassade sidor.

Skapa komponentinstanser

UDI-guiden använder klassfabriker för att skapa nya instanser av objekt åt dig. Dessa fabriker registreras med ett fabriksregister med hjälp av en sträng som nyckel till fabriken. Till exempel identifieras WmiRepository-komponenten av strängen "Microsoft.Wizard.WmiRepository", som är tillgänglig i IWmiRepository-huvudfilen som ID_WmiRepository.

Förutsatt att du har skrivit sidan som en underklass av WizardPageImpl kan du skapa en ny instans av en WmiRepoistory så här:

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

Funktionen CreateInstance är en typsäker mallfunktion för att skapa nya instanser av komponenter. PWmiRepository är en smart pekare, så den hanterar referensräkning åt dig.

Creatable-komponenter

Det finns en uppsättning komponenter som du kan registrera med registret. Den första uppsättningen komponenter registreras alltid eftersom den körbara filen för huvudfilen i UDI-guiden innehåller den. De andra två uppsättningarna med komponenter finns i "valfria" DLL:er. För att dessa komponenter ska vara tillgängliga måste DLL-filen anges i DLL-avsnittet i .config XML-filen. Koden behöver inte veta vilken körbar fil som innehåller en specifik komponent.

Listan över komponent-ID:t för komponenter (komponentnamnet är samma som ID:t men utan den inledande ID_) som registrerats med fabriksregistret (definierat i OSDSetupWizard) visas i tabell 3.

Tabell 3. Komponent-ID:t

ID Beskrivning
ID_ACPowerTask (ITask, IWizardComponent) En preflight-uppgift som säkerställer att datorn inte körs på enbart batteri
ID_AppDiscoveryTask (ITask, IWizardComponent) En specialiserad uppgift för att identifiera vilka programvaruobjekt som du har installerat på datorn
ID_BackgroundTask (IBackgroundTask, IWizardComponent) Kan användas för att köra en uppgift på en annan tråd
ID_CopyFilesTask (ITask, IWizardComponent) En uppgift att kopiera en eller flera filer
ID_FormController (IFormController) Du behöver mest inte skapa en instans själv, eftersom sidan tar emot en egen instans
ID_InvalidCharactersValidator (IValidator) Säkerställer att inget textfält innehåller tecken från en lista som angetts för valideraren
ID_Logger (ILogger) Du behöver oftast inte skapa en instans själv, eftersom sidan tar emot en pekare till den delade instansen
ID_NonEmptyValidator (IValidator) En validerare som säkerställer att inget fält är tomt
ID_PasswordValidator (IValidator) En validerare som säkerställer att inga två textfält har samma innehåll
ID_Regex (IRegEx) Utvärderar reguljära uttryck och letar efter matchningar
ID_RegExValidator (IValidator) En validerare som validerar mot ett reguljärt uttryck eller ett känt mönster
ID_SimpleStringProperties (IStringProperties, ISimpleStringProperties) Ger ett enkelt sätt att skicka egenskaper till uppgifter utan att använda XML
ID_ShellExecuteTask (ITask, IWizardComponent) Köra ett externt program
ID_SummaryBag (ISummaryBag) Tillgänglig indirekt från din sida via formulärmetoden
ID_TaskManager (ITaskManager, IBackgroundCallback, IWizardComponent) Hanterar körning av en uppsättning uppgifter och användargränssnittet
ID_WmiRepository (IWmiRepository, IWizardComponent) Gör att du kan köra WMI-frågor (Windows Management Instrumentation)
ID_IXmlDocument (IXmlDocument) Tillhandahåller en fasad för att läsa och skriva XML-dokument

De definierade OSDRefreshWizard.dll, delade sidor och andra kontrollkomponenter visas i tabell 4 och tabell 5.

Tabell 4. Katalogkontroller

ID Beskrivning
ID_Directory (IDirectory) En fasad för att hämta kataloginformation från filsystemet

Tabell 5. Definierad SharedPages.dll

ID Beskrivning
ID_ADHelper (IADHelper) Tillhandahåller en fasad för en begränsad uppsättning funktioner i Active Directory® Domain Services (AD DS)
ID_CpuInfo (ICpuInfo) Avgör om processorn är 32 eller 64 bitar
ID_DomainJoinValidator (IDomainJoinValidator) Har vissa metoder för att kontrollera om en uppsättning autentiseringsuppgifter tillåts ansluta till en domän
ID_DriveList (IDriveList, IBindableList, IWizardComponent) Använder WMI för att hämta en lista över enheter på datorn
ID_WiredNetworkTask (ITask) En uppgift som kontrollerar om du är ansluten till nätverket med ett fast kabelanslutet (i stället för trådlöst) nätverkskort

Kontrollkomponenter

Du interagerar med kontrollerna på sidan via mallfunktionen GetControlWrapper , som ger åtkomst till en av de typer av komponenter som anges i tabell 6.

Tabell 6. Komponenter

Typer av dialogkontroll Beskrivning
CONTROL_CHECK_BOX (ICheckBox) En fasad för att arbeta med kryssrutekontroller
CONTROL_COMBO_BOX (IComboBox) En fasad för kombinationsrutekontroller
CONTROL_GENERIC (IControl) Gör att du kan arbeta med de flesta typer av kontroller för att styra aktivering och synligt tillstånd
CONTROL_LIST_VIEW (IListView) En fasad som ger åtkomst till funktionerna i en listvykontroll
CONTROL_PROGRESS_BAR (IProgressBar) En fasad för att arbeta med positionen för en förloppsindikatorkontroll
CONTROL_RADIO_BUTTON (IRadioButton) En fasad för att arbeta med alternativknappskontroller
CONTROL_STATIC_TEXT (IStaticText) En fasad som ger läs-/skrivbehörighet till texten i en kontroll, till exempel en etikett eller textruta
CONTROL_TREE_VIEW (ItreeView) En fasad för att arbeta med en trädvykontroll

Bildlistekomponent

Den här komponenten är en fasad för en ImageList-kontroll på sidan. Du skapar en avbildningslista via gränssnittet IListView eller ITreeView .

FormController-komponent

Guiden skapar den här komponenten åt dig och skickar den till din sida. Du kommer åt den från sidan med hjälp av metoden Form , som basklassen WizardPageImpl implementerar.

InvalidCharacterValidator-komponent

Det här är en typ av validerare som du kan inkludera på en sida. ID:t är ID_InvalidCharactersValidator (definieras i IValidator.h), som har textvärdet "Microsoft.Wizard.Validation.InvalidChars".

Den här valideraren söker efter en enda egenskap (ett Setter-element i .config-filen) med namnet InvalidChars, som är en lista över tecken som inte tillåts. Den kontrollerar tecknen i en textruta. Om texten innehåller tecken från den här listan rapporterar komponenten fel.

NonEmptyValidator-komponent

Det här är en typ av validerare som du kan inkludera på en sida. ID:t är ID_NonEmptyValidator (definieras i IValidator.h), som har textvärdet "Microsoft.Wizard.Validation.NonEmpty".

Den här valideraren rapporterar fel om textrutan (eller någon annan kontroll som stöder IStaticText) har ett tomt strängvärde.

PasswordValidator-komponent

Det här är en typ av validerare som du kan inkludera på en sida. ID:t är ID_PasswordValidator (definieras i IValidator.h), som har textvärdet "Microsoft.Wizard.Validation.Password".

Den här valideraren fungerar med två olika textkontroller (kontroller som stöder IStaticText) och rapporterar fel om de inte innehåller samma värden. Med andra ord misslyckas det om textrutorna Lösenord och Bekräfta lösenord inte matchar.

Eftersom den här valideraren kräver två kontroller behöver den mer konfiguration än andra validerare. Konfigurationen kan se ut ungefär så här:

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

Först definierar du kontrollen Bekräfta lösenord som "underordnad" i lösenordskontrollen . På så sätt inaktiveras även kontrollen Bekräfta lösenord om formulärkontrollanten inaktiverar lösenordskontrollen. Lägg sedan till en lösenordsverifierare i formuläret. Slutligen anger du lösenordsverifieraren med gränssnittet för kontrollen Bekräfta lösenord .

På grund av kravet på två kontroller måste du använda kod för att konfigurera den här valideraren i stället för den .config XML-filen.

RegExValidator-komponent

Det här är en typ av validerare som du kan inkludera på en sida. ID:t är ID_RegExValidator (definieras i IValidator.h), som har textvärdet "Microsoft.Wizard.Validation.RegEx".

Den här valideraren jämför innehållet i en textkontroll (en som stöder IStaticText) med ett reguljärt uttryck och misslyckas om texten inte matchar det reguljära uttrycket.

Du kan också använda den här valideraren med ett fördefinierat namngivet mönster. Om du vill använda ett reguljärt uttryck måste XML-koden innehålla en set-egenskap med namnet Pattern. Om du vill använda ett namngivet mönster i stället använder du en uppsättning med namnet NamedPattern som är inställd på ett av värdena i tabell 7.

Tabell 7. Namngivna mönstersetare

Mönster Beskrivning
Användarnamn Verifierar att texten antingen är av formulärdomänen\användaren eller user@domain
Datornamn Namnet måste vara mellan 1 och 15 tecken långt och får inte innehålla en uppsättning tecken (till exempel : och ?)
Workgroup Namnet måste vara mellan 1 och 15 tecken långt och får inte innehålla en uppsättning tecken (till exempel =, +och ?)

Fabriksregistreringskomponent

Den här komponenten håller reda på alla klassfabriker och -tjänster. Den implementerar gränssnittet IFactoryRegistry och är indirekt tillgängligt via sidans containermetod . Dessutom läser registret in tilläggs-DLL:er. När en DLL har lästs in söker registret efter en exporterad funktion med namnet RegisterFactories. Du måste implementera den här funktionen och registrera klassfabrikerna för dina sidor, uppgifter och validatorer (och andra klassfabriker som du vill registrera). Här är ett exempel från exempelprojektet:

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

Loggningskomponent

Den här komponenten är tillgänglig för sidan via Logger-metoden (implementerad av WizardPageImpl). Du använder den här metoden för att skriva poster till loggfilen. Innehållet i loggfilen är användbart för att diagnostisera problem som användare kan ha när de kör UDI-guiden.

PropertyBag-komponent

Egenskapsuppsättningen är en container för minnesvariabler. Den är tillgänglig från sidan med Container()->Properties(). Minnesvariabler är användbara för att skicka tillfälliga data mellan olika sidor.

TSVariableBag- och TSRepository-komponenter

Med komponenten TSVariableBag kan du läsa och skriva aktivitetssekvensvariabler. Den behåller värdena i minnet tills användaren väljer Slutför (som standard). Du kan komma åt TSVariable-påsen via sidans TSVariables-metod (implementerad av wizardPageImpl-basklassen ). Dessa komponenter loggar alla läsningar och skrivningar av aktivitetssekvensvariabler.

WmiRepository-komponent

Den här komponenten tillhandahåller en fasad för att arbeta med WMI-frågor. Du kan anropa hjälpfunktionen CreateInstance med ID_WmiRepository för att hämta en instans av den här komponenten, som stöder gränssnittet IWmiRepository . Den här komponenten returnerar resultatposter via IWmiIterator-gränssnittet .

Hjälpklasser för guidesidor

Du kan skapa anpassade UDI-guidesidor med hjälpklasser som tillhandahålls med UDI SDK. Tabell 8 visar de hjälpklasser som du kan använda för att skapa anpassade guidesidor.

Tabell 8. Hjälpklasser

Hjälpklass Beskrivning
ClassFactoryImpl-klass Det här är en användbar basklass för att skapa en klassfabrik som du sedan kan registrera med fabriksregistret.
Gränssnittsmallklass Använd den här mallklassen när du vill skapa en komponent som implementerar mer än ett gränssnitt.
Hjälpklass för sökväg Den här klassen innehåller vanliga fil-/katalogåtgärder.
Pekarmallklass Den här klassen innehåller referensräkning för livslängdshantering i COM-komponenter. Det är viktigt att släppa gränssnitt när du är klar med dem. Den här mallklassen hanterar livslängden automatiskt.
PUnknown-klass Den här klassen är en smart pekare specifikt för gränssnittet IUnknown. Använd klassen Pekarmall för alla andra gränssnitt.
Hjälpklass för StringUtil Den här klassen innehåller hjälpmetoder som gör det enklare att arbeta med strängar.
SubInterface-mallklass Den här basklassen gör det enklare att implementera en komponent som stöder ett gränssnitt som självt ärver från ett annat gränssnitt.
UnknownImpl-mallklass Den här klassen hanterar det mesta av informationen om att skapa en COM-komponent.
WizardComponent Template Class Den här basklassen används för att skapa komponenter som behöver åtkomst till guidetjänsterna, till exempel skapande och loggning av komponenter.
WizardPageImpl- mallklass Den här basklassen ska användas som basklass för alla anpassade guidesidor

ClassFactoryImpl-klass

Det här är en användbar basklass för att skapa en klassfabrik som du sedan kan registrera med fabriksregistret.

Följande är ett utdrag från filen LocationPage.h i exempelprojektet för att definiera klassen ClassFactoryImpl .

#pragma once

#include "ClassFactoryImpl.h"

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

Följande är ett utdrag från LocationPage.cpp-filen på exempelguidesidan som används för att definiera klassfabriken för sidan.

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

Gränssnittsmallklass

Använd den här mallklassen när du vill skapa en komponent som implementerar fler än ett gränssnitt, till exempel:

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

Den här koden skapar en basklasskedja som stöder både IFieldCalback och de gränssnitt som WizardPageImpl stöder (vilket råkar vara IWizardPage).

Hjälpklass för sökväg

Den här klassen innehåller vanliga fil-/katalogåtgärder:

static inline std::wstring GetModulePath(HINSTANCE hModule)

Den returnerar också den fullständiga sökvägen till .exe- eller .dll-filen med den instansreferens som du anger för den här metoden:

static inline std::wstring GetModuleFilename(HINSTANCE hModule)

Klassen returnerar den fullständiga sökvägen och filnamnet för .exe och .dll fil med instansreferensen som du anger för den här metoden:

static inline std::wstring GetDirectoryName(LPCWSTR fullName)

. . . eller bara sökvägen när filnamnet tas bort:

static inline std::wstring GetFileName(LPCWSTR fullName)

Med en sökväg med ett filnamn returnerar sökvägshjälpklassen endast filnamnet:

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

Slutligen returnerar klassen en ny sträng som är den kombinerade sökvägen och filnamnet (eller en annan sökväg).

Pekarmallklass

Den här klassen definieras i Pointer.h. Eftersom COM-komponenter använder referensräkning för livslängdshantering är det viktigt att du alltid släpper gränssnitt när du är klar med dem. Microsoft tillhandahåller en mallklass som hanterar livslängden automatiskt. Om du till exempel vill ha en smart pekare för ett XML-gränssnitt kan du skriva något som liknar detta:

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

Den första raden definierar den smarta pekaren. Den andra raden visar hur du hämtar en smart pekare via ett annat anrop. Operatorn& släpper alltid ett befintligt gränssnitt om det innehåller ett och returnerar adressen för den interna pekaren. När du har hämtat en pekare som denna anropar pekarinstansenRelease åt dig när variabeln hamnar utanför omfånget. Microsoft rekommenderar att du använder smarta pekare i stället för att anropa AddRef och Release manuellt.

Dessutom anropar klassen Pekare smart pekareQueryInterface för att hämta andra gränssnitt åt dig. När fabriksregistret till exempel skapar en ny instans av en komponent har det kod som liknar detta:

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

Den första raden anropar QueryInterface i bakgrunden för att begära gränssnittet IWizardComponent . Den resulterande smarta pekaren är lika med nullptr om komponenten inte stöder det gränssnittet.

PUnknown-klass

Den här klassen är en smart pekare specifikt för gränssnittet IUnknown . Använd klassen Pekarmall för alla andra gränssnitt.

Hjälpklass för StringUtil

Den här klassen definieras i Utilities.h och innehåller hjälpmetoder som gör det enklare att arbeta med strängar:

static inline int CompareIgnore(LPCWSTR first, LPCWSTR second)

Den här metoden jämför två strängar när skiftläge ignoreras (se tabell 9).

Tabell 9. Hjälpklass för StringUtil

Returnerar Beskrivning
0 Strängar matchar, ignorerar skiftläge
<0 Första < sekunden
>0 Första > sekunden

Här är ett exempel:

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

Dessa metoder är lite som Microsoft .NET Format-metoderna i den meningen att parametrarna är i form av {0}. De utför dock ingen formatering av indata – bara ersättning:

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)

Det här är omslutningar runt StringCchPrintf som returnerar en wstring så att du inte behöver allokera minne för strängar eller buffertar själv.

SubInterface-mallklass

Den här basklassen gör det enklare att implementera en komponent som stöder ett gränssnitt som självt ärver från ett annat gränssnitt. ICheckBox-gränssnittet ärver till exempel från IControl. Så här används den här klassen för att definiera CheckBoxWrapper:

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

Basgränssnittet är den första parametern, medan det härledda gränssnittet är den andra parametern.

UnknownImpl-mallklass

Den här klassen definieras i UnknownImpl.h och hanterar det mesta av informationen om att skapa en COM-komponent. Här är ett exempel på hur du skulle använda den här basklassen:

classDirectory :public UnknownImpl<IDirectory>

Den här koden definierar en klass som stöder IDirectory-gränssnittet .

WizardComponent Template Class

Den här klassen definieras i IWizardComponent.h och är en användbar basklass för att skapa komponenter som behöver åtkomst till guidetjänsterna, till exempel skapande och loggning av komponenter.

Här är till exempel hur CopyFilesTask-komponenten definieras:

classCopyFilesTask :public WizardComponent<ITask>
{
    ...

Parametern för den här mallklassen är det "huvudgränssnitt" som du vill använda för din komponent, som när det gäller uppgifter är ITask. Att använda WizardComponent innebär att komponenten stöder både det gränssnitt som du anger (ITask i det här exemplet) och IWizardComponent.

När du använder klassfabriksregistret för att skapa en ny komponent anropar registret komponentens IWizardComponent-SetContainer-metod> för att ge komponenten åtkomst till guidetjänsterna.

WizardPageImpl- mallklass

Använd den här klassen som basklass för dina anpassade sidor, till exempel:

class LocationPage :public WizardPageImpl<IDD_LOCATION_PAGE>

Parametern är resurs-ID:t för din dialogrutemall.

Sidgränssnitt för guide

UDI-guiden använder gränssnitt för att komma åt de olika kontrollerna på sidan. På sidan använder du funktionen GetControlWrapper för att hämta en kontrollomslutning. Här är ett exempel:

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

Här är PStaticText en smart pekare till gränssnittet IStaticText . Smarta pekare anropar automatiskt COM Release() -metoden när de hamnar utanför omfånget eller du skickar adressen för en variabel ( till exempel&pFormat) till en metod.

IADHelper-gränssnitt

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

Initiera den här komponenten och skicka den till loggaren så att den kan logga information.

HRESULTValidLogon(LPCTSTR userName, LPCTSTR-lösenord, LPCTSTR-domän)

Den här metoden verifierar om en uppsättning autentiseringsuppgifter är giltig, enligt tabell 10.

Tabell 10. HResultValidLogon

Hresult Beskrivning
S_OK Autentiseringsuppgifterna är giltiga
S_FALSE Autentiseringsuppgifterna är ogiltiga
E_FAIL Det gick inte att hitta domänkontrollanten. kontrollera loggarna för mer information
HRESULT HasAccess(LPCTSTR username, LPCTSTR password, LPCTSTR domain, LPCTSTR computerName, LPCTSTR accountDomain)

Den här metoden verifierar om en uppsättning autentiseringsuppgifter har läs-/skrivåtkomst till datorobjektet i AD DS, enligt tabell 11.

Tabell 11. HResult HasAccess

HRESULT Beskrivning
S_OK Användaren har åtkomst
E_FAIL Användaren har inte åtkomst. Mer information finns i loggfilen.

IBackgroundTask-gränssnitt

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

Sidan Förlopp använder den här klassen för att köra uppgifter på en separat tråd. Du kan också använda den här klassen när du vill utföra åtgärder på en separat tråd. Uppgifter är alla klasser som stöder ITask-gränssnittet .

Det här gränssnittet implementeras av komponenten ID_BackgroundTask ("Microsoft.Wizard.BackgroundTask") som definieras i gränssnittet IBackgroundTask.h.

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

Det här gränssnittet initierar komponenten enligt tabell 12.

Tabell 12. HRESULT Init

Parameter Beskrivning
pTask Pekare till klassen som innehåller den kod som du vill köra på en annan tråd
Id Ett nummer som du kan använda i återanropsmetoden Finished (Slutförd ) för att se vilken uppgift som har körts. användbart om du startar flera uppgifter med samma återanropsmetod
pCallback En klass som implementerar metoden Slutförd , som anropas när en aktivitet har slutförts. -anropet till metoden Finished (Slutförd ) finns i bakgrundstråden, inte i användargränssnittstråden
void Start(void)

Den här metoden startar uppgiften på en bakgrundstråd och returnerar de element som visas i tabell 13.

Tabell 13. Returnera bakgrundstråd

Returnerar Beskrivning
E_INVALIDARG Aktiviteten körs redan, så du kan inte starta den just nu.
E_FAIL Det uppstod ett problem när tråden skulle startas.
S_OK Tråden startades.
BOOL Running()

Den här metoden returnerar TRUE om bakgrundsaktiviteten körs och FALSE om den inte körs.

HRESULT Wait(DWORD waitMilliseconds)

Den här metoden väntar tills tråden slutar köras eller antalet millisekunder har förflutit.

HRESULT Terminate (DWORD exitCode)

Den här metoden stoppar tråden som körs (se Tabell 14 och Tabell 15). Den här processen kan ta en kort stund att slutföra efter att den här metoden har returnerats.

Tabell 14. HRESULT Avsluta slutkod

Parameter Beskrivning
exitCode Slutkoden som skickas till metoden Finished callback (Slutfört återanrop), som också är tillgänglig från metoden GetExitCode .

Tabell 15. Avslutningskoder

Returnerar Beskrivning
E_FAIL Anropet att avsluta misslyckades.
S_OK Begäran om att avsluta tråden lyckades.
HRESULT GetExitCode(LPDWORD pCode, HRESULT *pHresult)

Använd den här metoden för att hämta resultatet av att köra aktiviteten i bakgrundstråden (se Tabell 16).

Tabell 16. Resultatkoder

Parameter Beskrivning
pCode Pekare till ett DWORD som anges vid retur eller nullptr om du inte behöver returvärdet. Vid avslut är den här parametern inställd på STILL_ACTIVE om tråden körs, koden som returneras av aktivitetens Execute-metod eller värdet som skickas till metoden Terminate om du anropade den metoden.
pHresult Pekare till en HRESULT som anges vid retur eller nullptr om du inte behöver HRESULT-värdet .
HRESULT Close(void)

Den här metoden släpper bakgrundstråden. Den returnerar E_INVALIDARG om tråden körs och S_OK annars.

ICheckBox-gränssnitt

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

Ange kryssrutans markerade tillstånd. När metoden är TRUE markeras kryssrutan. när metoden är FALSE avmarkeras kryssrutan.

BOOL IsButtonChecked()

Den här metoden rapporterar aktuellt bocktillstånd för en kryssruta.

IComboBox-gränssnitt

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

Det här gränssnittet implementeras av komponenten CheckBoxWrapper . Du hämtar en instans av den här komponenten med hjälpfunktionen GetControlWrapper med typen CONTROL_COMBO_BOX.

HRESULT Bind([in] IBindableList *pList)

Använd den här metoden när du har en datakälla som implementerar gränssnittet IBindableList . Listrutan initierar innehållet med bildtexterna från den här listan.

HRESULT Select(int index)

Välj objektet i kombinationsrutan i indexet.

int Selected(void)

Den här metoden returnerar indexet för det markerade objektet eller -1 om inget har valts.

void Add([in] LPCTSTR bildtext)

Lägg till ett objekt i kombinationsrutan manuellt.

HRESULT GetText([out, retval] LPBSTR pText)

Hämta strängen för det markerade objektet i kombinationsrutan.

void Clear()

Ta bort alla objekt från kombinationsrutan.

IControl-gränssnitt

__interface IControl : IUnknown
{
    HRESULT SetEnable(BOOL enable);
    BOOL IsEnabled(void);
    HRESULT SetVisible(BOOL visible);
};
Översikt

Det här gränssnittet implementeras av ControlWrapper-komponenten . Du hämtar en instans av den här komponenten med hjälpfunktionen GetControlWrapper med typen CONTROL_GENERIC.

HRESULT SetEnable(BOOL-aktiverad)

Aktivera eller inaktivera kontrollen.

BOOL IsEnabled(void)

Returnerar TRUE om kontrollen är aktiverad, FALSE om den inte är det.

HRESULT SetVisible(BOOL synlig)

Visa eller dölj kontrollen.

ICpuInfo-gränssnitt

__interface ICpuInfo : IUnknown
{
    BOOL Is64Bit(void);
};
Översikt

Du får det här gränssnittet genom att skapa en ny ID_CpuInfo komponent. Den enskilda metoden rapporterar om processorn är 32 eller 64 bitar. Observera att om du har ett 32-bitars operativsystem på en 64-bitarsdator returnerar den här metoden TRUE, eftersom den bara rapporterar bredden på processorn (inte operativsystemet).

IDirectory-gränssnitt
__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);
};
Översikt

Katalogkomponenten, som du skapar med hjälp av ID_Directory, tillhandahåller en fasad för att arbeta med kataloger i filsystemet.

BOOL FileExists(LPCWSTR-namn)

Den här metoden returnerar TRUE om det finns en fil med det namn som du anger.

BOOL FindFirst([in] LPCWSTR name)

Den här metoden hittar en första matchning för det namn som du anger. Den stöder jokertecken och returnerar både fil- och katalognamn. Metoden returnerar TRUE om en matchning hittades, ANNARS FALSKT.

HRESULT FoundName([out, retval] LPBSTR name)

Den här metoden hämtar namnet på filen som hittades med ett anrop till FindFirst eller FindNext.

DWORD FoundAttributes(void)

Den här metoden returnerar attributet för den senaste hittade filen eller katalogen. Du kan använda följande kod för att testa om det är en katalog:

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

Hitta nästa. Den här metoden returnerar TRUE om en annan matchning hittades, ANNARS FALSE.

void FinishFind(void)

Den här metoden släpper resurser som används för sökåtgärden.

IDomainJoinValidator-gränssnitt

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

Du hämtar en instans av det här gränssnittet med hjälp av värdet ID_DomainJoinValidator till mallfunktionen CreateInstance .

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

Initiera instansen enligt tabell 17.

Tabell 17. HRESULT Init – Instansinitiering

Parameter Beskrivning
pLogger Loggningsinstansen, som är tillgänglig för din sida via sidans Logger-metod
pContainer Skickar resultatet från sidans containermetod
pUsername Textrutan som innehåller användarnamnet som ska verifieras
pPassword Textrutan som innehåller lösenordet som ska verifieras
PComputerName Textrutan som innehåller namnet på den dator som så småningom ska anslutas till domänen
HRESULT IsUsernameValid(LPCWSTR domainName)

Den här metoden använder metoden IADHelper-ValidLogon> för att utföra arbetet. Mer information finns i metoden.

BOOL CanModifyComputerAdEntry(LPCWSTR domainName)

Kontrollera om användaren har behörighet att ändra datorposten. Det mesta av arbetet utförs av IADHelper-HasAccess>. Om den här metoden returnerar FALSE kontrollerar du loggfilen för mer information.

IDriveList-gränssnitt

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

Anropa den här metoden innan du anropar andra komponenter. Du måste skapa en ny WmiRepository innan du anropar den här metoden.

HRESULT-uppsättningWhereClause(LPCTSTR därClause)

Med den här metoden kan du lägga till text som visas som en "where"-sats i frågan. Följande rad returnerar till exempel endast USB-enheter:

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

Ange den minimerade enhetsstorleken i byte för enheter som ska returneras från frågan.

HRESULT-uppdatering(void)

Kör frågan. Enhetslistan som är tillgänglig när du har anropat den här metoden sorteras efter enhetsbeteckning.

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

Den här metoden lägger till namnen på ytterligare egenskaper som du vill göra tillgängliga i frågeresultatet. Anropa den här metoden innan du anropar Uppdatera. Tabell 18 visar tre av de användbara egenskaperna.

Tabell 18. HRESULT AddProperty: Användbara egenskaper

Avsnitt Egenskap Beskrivning
DISKQUERY_LOGICALDISK Storlek Storleken, i byte, som representeras som en sträng
DISKQUERY_DISKPARTITION DiskIndex Disknumret som ett heltal som börjar med 0
DISKQUERY_LOGICALDISK Volymnamn Volymetiketten
size_t Count(void)

Antalet poster som frågan returnerar. Anropa Uppdatera innan du anropar den här metoden.

HRESULT GetProperty(size_t index, LPCTSTR propName, LPVARIANT-värde)

Den här metoden hämtar värdet för en egenskap från frågeresultatet, enligt tabell 19.

Tabell 19. HRESULT GetProperty

Parameter Beskrivning
Index Nollbaserat index till resultatposten
propName Namnet på egenskapen, till exempel "Storlek"
Värde Vid retur innehåller den här parametern ett variantvärde för egenskapen
HRESULT GetCaption(size_t index, LPBSTR pCaption)

Den här metoden hämtar bildtext för en post som är samma som egenskapen Bildtext.

IImageList-gränssnitt

__interface IImageList
{
    HRESULT CreateImageList(int width, int height, UINT flags);
    HImageList GetImageList(void);
    int AddImage(HInstance hInstance, int resourceId);
};
Översikt

Det här gränssnittet implementeras av imagelist-komponenten . Du hämtar en instans av den här komponenten från IListView-gränssnittet .

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

Skapa en ny avbildningslista som den här komponenten hanterar. Anropa bara den här metoden en gång.

HImageList GetImageList(void)

Den här metoden returnerar referensen för avbildningslistan om du behöver utföra andra åtgärder i avbildningslistan.

int AddImage(HInstance hInstance, int resourceId)

Lägg till en ny bild i bildlistan från en resurs, enligt tabell 20.

Tabell 20. HRESULT IImageList-gränssnitt

Parameter Beskrivning
hInstance Instanshandtag för modulen som innehåller bitmappsresursen
resourceId ID för resursen som ska läsas in i avbildningslistan

IListView-gränssnitt

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

Det här gränssnittet implementeras av ControlWrapper-komponenten . Du hämtar en instans av den här komponenten med hjälpfunktionen GetControlWrapper med typen CONTROL_LIST_VIEW.

int AddItem([in] LPCTSTR-text)

Lägg till en ny rad i listrutan. Metoden returnerar indexet för objektet som just lagts till.

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

Lägg till en ny kolumn i listvyn.

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

Ange texten i en annan kolumn än den första kolumnen i listrutan, som du ser i tabell 21.

Tabell 21. HRESULT SetSubItem

Parameter Beskrivning
Index Indexet för listobjektet som du vill ändra
Kolumn Indexet för den kolumn som du vill uppdatera. den första kolumnen anges med AddItem, kolumner två och följande anges med den här metoden
Text Strängen som ska visas i kolumnen
int GetWidth(void)

Den här metoden returnerar bredden på hela textrutan.

void SetExtendedStyle(DWORD-format)

Med den här metoden kan du ange utökade formatmallar i listrutan, till exempel:

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

Den här metoden returnerar indexet för listvyobjektet som för närvarande är markerat.

HRESULT SelectItem(int index)

Ange det markerade objektet i listan till det här indexet.

BOOL IsItemChecked(int index)

Den här metoden returnerar TRUE om ett objekt i listan är markerat. Den här metoden kräver att du anropar SetExtendedStyle för att ange kryssrutans formatmall.

int GetItemCount(void)

Den här metoden returnerar antalet objekt i listvyn.

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

Skapa en ny avbildningslista och bifoga den i listvyn.

int AddImage(HINSTANCE hInstance, int resourceId)

Lägg till en bild i listvyns bildlista. Du måste anropa CreateImageList först.

HRESULT SetImage(int index, int imageIndex)

Ange den bild som ska visas till vänster för ett specifikt listvyobjekt.

HRESULT Clear(void)

Ta bort alla objekt från listvyn.

Gränssnitt för IProgressBar

__interface IProgressBar : IControl
{
    HRESULT SetPercentage(int position);
    int GetPercentage(void);
};
Översikt

Det här gränssnittet implementeras av ProgressBarWrapper-komponenten . Du hämtar en instans av den här komponenten med hjälpfunktionen GetControlWrapper med typen CONTROL_PROGRESS_BAR.

HRESULT SetPercentage(int position)

Ange förloppsindikatorns position med ett tal mellan 0 och 100. Som standard har nya Win32-förloppsfält® ett maximalt intervall på 100.

int GetPercentage(void)

Den här metoden returnerar förloppsindikatorns aktuella position.

IRadioButton-gränssnitt

__interface IRadioButton : IControl
{
public:
    void SetGroup(int firstId, int lastId);
    void CheckRadio(int id);
    BOOL IsButtonChecked(int id);
    void EnableRadio(int id, BOOL enable);
};
Översikt

Det här gränssnittet implementeras av Komponenten RadioButtonWrapper . Du hämtar en instans av den här komponenten med hjälpfunktionen GetControlWrapper med typen CONTROL_RADIO_BUTTON.

void SetGroup(int firstId, int lastId)

Ge omslutningen ett intervall med alternativknappar som ska behandlas som en grupp. Anropa den här metoden innan du anropar CheckRadio.

void CheckRadio(int id)

Ange att den specifika alternativknappen ska vara den enda knappen i gruppen med alternativknappar som valts. Anropa SetGroup innan du anropar den här metoden.

BOOL IsButtonChecked(int id)

Den här metoden returnerar TRUE om alternativknappen är markerad, annars FALSE.

void EnableRadio(int id, BOOL enable)

Den här metoden aktiverar eller inaktiverar en alternativknapp.

IStaticText-gränssnitt

__interface IStaticText : IControl
{
    HRESULT SetText([in] LPCTSTR pText);
    HRESULT GetText([out, retval] LPBSTR pText);
};
Översikt

Det här gränssnittet implementeras av StaticTextWrapper-komponenten . Du hämtar en instans av den här komponenten med hjälpfunktionen GetControlWrapper med typen CONTROL_STATIC_TEXT.

HRESULT SetText([in] LPCTSTR pText)

Ange texten för kontrollen.

HRESULT GetText([out, retval] LPBSTR pText)

Den här metoden returnerar det aktuella värdet för texten för kontrollen.

ITask-gränssnitt

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

Implementera det här gränssnittet om du vill att komponenten ska vara tillgänglig som en uppgift på förljussidan eller om du vill använda BackgroundTask-komponenten för att utföra arbete på en bakgrundstråd.

Här är komponenter som implementerar ITask-gränssnittet :

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

Om du skriver en uppgift för sidan före start anropar du den här metoden för att initiera uppgiften. Den .config filen innehåller XML som kan se ut ungefär så här:

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

Parametern pProperties ger åtkomst till de tre setter-värdena, medan parametern pTaskSettings ger åtkomst till aktivitetselementet och underordnade objekt. De flesta uppgifter behöver bara läsa data från parametern pProperties .

Verkställ
HRESULT Execute(LPDWORD pReturnCode)

Här skriver du koden som utför uppgiften. Den här metoden bör returnera S_OK om det inte finns några fel, och den kan returnera en annan HRESULT om ett fel uppstod när aktiviteten kördes. Andra värden än S_OK som den här metoden returnerar matchas upp till <Felelement> i <avsnittet ExitCodes> om du använder sidan preflight.

Parametern pReturnCode måste uppdateras med ett tal som rapporterar status för aktiviteten. Dessa värden matchas av sidan preflights till <ExitCode-element> .

ITreeView-gränssnitt

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

Det här gränssnittet implementeras av TreeViewWrapper-komponenten . Du hämtar en instans av den här komponenten med hjälpfunktionen GetControlWrapper med typen CONTROL_TREE_VIEW.

void EnableCheckboxes(void)

Den här metoden aktiverar kryssrutor i trädvisningskontrollen genom att ange TVS_CHECKBOXES formatmall.

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

Lägg till en ny bildlista i trädvisningskontrollen. Parametern flags skickas i anropet till funktionen ImageList_Create Win32.

int AddImage(HINSTANCE hInstance, int resourceId)

Lägg till en bild i avbildningslistan från en resurs (resourceId) i modulen med instanshandtaget hInstance.

HTREEITEM AddItem(LPCTSTR text, HTREEITEM hParent = NULL)

Lägg till en nod i trädvyn. Den nya noden läggs till på den översta nivån om hParent är NULL. Annars anger du referensen till det överordnade objektet där du vill att det nya objektet ska läggas till. Den här metoden returnerar referensen till det nya objektet.

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

Ange vilken avbildning som ska användas för ett trädvyobjekt. Du kan ange både den normala och den expanderade avbildningen.

void Clear(void)

Ta bort alla objekt från trädvyn.

BOOL SetFirstVisible(HTREEITEM-objekt)

Kontrollera att trädvyobjektet är synligt. Trädvyn rullas om det behövs för att göra det här objektet synligt.

BOOL SelectItem(HTREEITEM-objekt)

Ange det markerade objektet till det objekt som du anger. Du kan anropa SetFirstVisible efter detta för att se till att det nyligen markerade objektet visas.

void CheckItem(HTREEITEM-objekt, UINT checkState)

Metoden anger i princip den bild som ska visas för kryssrutan i trädvyn. Dessa bilder finns i en separat ImageList-kontroll som trädvyn hanterar. Som standard innehåller den här bildlistan tre bilder, som visas i tabell 22.

Standardinställning för tabell 22.void CheckItem-avbildningslista

checkState Beskrivning
0 Tom
1 Avmarkerad
2 Markerade
HTREEITEM SelectedItem(void)

Den här metoden returnerar handtaget för det trädvyobjekt som för närvarande är markerat.

int SetItemHeight(KORT höjd)

Den här metoden anger höjden på alla objekt i trädvisningskontrollen i bildpunkter. Den returnerar den tidigare höjden i bildpunkter.

HRESULT EnableItem(HTREEITEM-objekt, BOOL-aktivera)

Den här metoden aktiverar eller inaktiverar ett enskilt objekt i trädet. Om du inaktiverar ett objekt med underordnade objekt inaktiveras inte underordnade objekt.

void Expand(HTREEITEM hItem, BOOL expand)

Den här metoden expanderar eller döljer en nod i trädet.

HTREEITEM GetChild(HTREEITEM hParent)

Den här metoden returnerar det första underordnade objektet i ett trädvyobjekt eller NULL om det inte finns några underordnade objekt.

HTREEITEM GetParent(HTREEITEM hNode)

Den här metoden returnerar referensen för den överordnade för en nod i trädvyn eller NULL om noden är på den översta nivån.

HTREEITEM GetNextItem(HTREEITEM hPrevious)

Du kan anropa den här metoden med ett handtag som GetChild returnerar för att iterera genom alla underordnade noder. Den här metoden returnerar nästa syskon i trädet som delar samma överordnade.

UINT IsChecked(HTREEITEM-objekt)

Den här metoden returnerar 0 om trädvynoden inte är markerad och 1 om den är det.

BOOL IsEnabled(HTREEITEM-objekt)

Den här metoden returnerar TRUE om trädvynoden är aktiverad, annars FALSE.

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

Den här metoden är endast avsedd för internt bruk.

HRESULT SetEventHandler(ITreeViewEvent *pEventHandler)

Anropa den här metoden om du vill få ett meddelande när det markerade objektet ändras eller om användaren ändrar kontrolltillståndet för ett trädvisningsobjekt. Du måste implementera ITreeViewEvent i komponenten för att få dessa återanrop.

void SetSelectedBackColor(COLORREF-färg)

Ange bakgrundsfärgen som används för det markerade objektet.

IWmiIteration-gränssnitt

__interface IWmiIterator : IUnknown
{
    HRESULT Next(void);
    HRESULT GetProperty(LPCTSTR propertyName, [out] LPVARIANT pValue);
};
Översikt

Du använder vanligtvis det här gränssnittet, tillsammans med IWmiRepository, när du arbetar med WMI-anrop. Med IWmiIteration-gränssnittet kan du iterera genom de värden som en fråga returnerar.

HRESULT Next(void)

Flytta till nästa objekt i frågeresultatet, enligt tabell 23.

Tabell 23. HRESULT Next(void) Frågan returnerar

HRRESULT Beskrivning
S_OK Flyttade till nästa resultat; du kan använda GetProperty för att hämta egenskaperna för det resultatet.
S_FALSE Det finns inga fler objekt i listan.
E_NOT_SET Det finns inga frågeresultat
HRESULT GetProperty(LPCTSTR propertyName, [out] LPVARIANT pValue)

Den här metoden hämtar värdet för en egenskap från den aktuella resultatposten, enligt tabell 24 och tabell 25.

Tabell 24. HRESULT GetProperty

Parameter Beskrivning
PropertyName Namnet på den egenskap som du vill hämta
pValue Pekar på en VARIANT-struktur som vid retur innehåller egenskapsvärdet

Tabell 25. HRESULT GetProperty-resultat

HRESULT Beskrivning
S_OK Egenskapsvärdet hämtades.
WBEM_E_NOT_FOUND Det finns ingen egenskap med namnet.
E_NOT_VALID_STATE Det finns ingen aktuell post.

Obs!

Metoden GetProperty kan returnera andra WMI-felkoder än de som anges i tabell 25. Värdena i listan är de vanliga resultat som returneras.

IWmiRepository-gränssnitt

__interface IWmiRepository : IUnknown
{
    HRESULT SetNamespace(LPCWSTR namespaceName);
    HRESULT ExecQuery(LPCWSTR query, [out] IWmiIterator **ppIterator);
};
Översikt

Det här gränssnittet implementeras av WmiRepository-komponenten (ID_WmiRepository).

HRESULT SetNamespace(LPCWSTR namespaceName)

Den här metoden anger det WMI-namnområde som ska användas för frågan. Anropa den här metoden innan du anropar ExecQuery. Om du inte anropar den här metoden blir namnområdet root\cimv2. Den här metoden returnerar alltid S_OK.

HRESULT ExecQuery(LPCWSTR-fråga, [out] IWmiIterator **ppIterator)

Kör en fråga mot WMI-namnrymdsuppsättningen med ett anrop till SetNamespace, enligt tabell 26 och tabell 27.

Tabell 26. HRESULT ExecQuery

Parameter Beskrivning
Fråga Strängen för den WMI-fråga som du vill köra
ppIterator Skicka en pekare till en gränssnittspekare som vid retur fylls i med ett gränssnitt, vilket ger dig åtkomst till frågeresultatet

Tabell 27. HRESULT-frågeresultat

HRESULT Beskrivning
S_OK Frågan har slutförts
Övrigt Om frågan inte lyckades returnerar en WMI HRESULT

IFormController-gränssnitt

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

Varje sida i UDI-guiden har en egen formulärkontrollant som implementerar det här gränssnittet. Du använder den här kontrollanten för att ansluta fältdata i den .config XML-filen till kontrollerna på sidan. Formulärkontrollanten hanterar sedan många av uppgifterna åt dig.

Konfigurera formuläret

Konfigurera vanligtvis formulärkontrollanten i sidans OnWindowCreated-metod . Det innebär vanligtvis att anropa metoderna som visas i tabell 28.

Tabell 28. OnWindowCreated-metod

Metod Beskrivning
Init Initierar formulärkontrollanten
AddField Tillhandahåller en anslutning mellan ett fält i den .config XML-filen som är ett strängnamn och en kontroll i sidans dialogruta som är ett ID
AddRadioGroup Används för att ansluta en alternativknapp till både en grupp och en kontroll i dialogrutan
AddToGroup Gör att du kan använda underordnade kontroller som är aktiverade eller inaktiverade tillsammans med deras överordnade eller baserat på vilken alternativknapp som väljs
InitFields Anropa när du har anropat alla Lägg till metoder för att konfigurera formuläret
Validera Utför den första valideringen
Bearbeta formulärhändelser

Lägg till följande anrop till din OnControlEvent-metod :

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

Det här anropet skickar händelser till formulärkontrollanten så att det kan bearbeta formulärrelaterade händelser.

Spara formulärdata

I metoden OnNextSelected anropar du formulärmetoderna som visas i tabell 29.

Tabell 29. OnNextSelected-metod

Metod Beskrivning
InitSection Anger namnet på avsnittet som ska visas på sidan Sammanfattning för den här sidan
SaveFields Spara fältvärden i aktivitetssekvensvariabler och på sidan Sammanfattning
Init
HRESULT Init(IWizardPageView *pView, IWizardPageContainer *pContainer)

Du anropar vanligtvis den här metoden i början av sidans OnWindowCreated-metod . Kommandot bör se ut ungefär så här:

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

Den här metoden anropas internt och du bör inte kalla den själv. Den tillhandahåller sidans XML till formulärkontrollanten.

Validera
HRESULT Validate(void)

Den här metoden kör alla validatorer som är kopplade till kontroller. Om en validerare inte godkänns visar formulärkontrollanten ett varningsmeddelande och inaktiverar knappen Nästa och slutar sedan bearbeta validerare. Vanligtvis behöver du bara anropa den här metoden i slutet av din OnWindowCreated-metod . den returnerar alltid S_OK.

AddToGroup
AddToGroup(int groupControlId, int controlId)

Den här metoden lägger till en kontroll som "underordnad" av en kryssruta eller alternativknapp, som visas i tabell 30. Alla sådana underordnade kontroller inaktiveras när den överordnade kontrollen inte är markerad. Metoden returnerar alltid S_OK.

Tabell 30. AddToGroup

Parameter Beskrivning
groupControlId ID för kryssrutan eller alternativknappen som styr aktiveringstillståndet för den underordnade kontrollen
Controlld ID för den kontroll som du vill lägga till som underordnad
UpdateCheckGroup
HRESULT UpdateCheckGroup(int groupControlId)

Den här metoden uppdaterar statusen aktivera eller inaktivera för en grupps underordnade kontroller baserat på status för den överordnade kontrollen. I allmänhet behöver du inte anropa den här metoden själv, eftersom formulärkontrollanten anropar den åt dig.

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

Anropa bara den här metoden om du har en validerare som du vill skapa i kod i stället för med XML. Den här metoden returnerar alltid S_OK.

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

Anropa bara den här metoden om du har en validerare som du vill skapa i kod i stället för med XML.

DisableValidation
HRESULT DisableValidation(int controlId, BOOL disable)

Anropa den här metoden för att antingen uttryckligen inaktivera valideraren för en kontroll eller återställa normal validering, enligt tabell 31. Den här metoden är användbar, till exempel när du har regler för att aktivera/inaktivera kontroller som inte omfattas av formulärverifiering och du måste inaktivera verifiering för en kontroll. Med andra ord skulle du normalt inte anropa den här metoden. Den här metoden returnerar alltid S_OK.

Tabell 31. HRESULT DisableValidation

Parameter Beskrivning
controlId Kontrollen som du vill aktivera eller inaktivera validering för
Inaktivera Ställ in på TRUE för att inaktivera validering och false för att återställa normal validering
AddField
HRESULT AddField(LPCWSTR fieldName, int controlId, BOOL suppressLog, DialogControlTypes type)

Lägg till en kontrollmappning mellan namnet i ett fältelement i .config XML-fil och kontroll-ID:t i sidans dialogruta, enligt tabell 32. Du måste anropa den här metoden före anropet till InitFields, eftersom InitFields använder den här informationen. Den här metoden returnerar alltid S_OK.

Tabell 32. HRESULT AddField

Parameter Beskrivning
Fältnamn Namnet på fältet som det visas i sidans XML
controlId ID för kontrollen i sidans dialogrutemall
suppressLog Ställ in på TRUE om du inte vill att värdena från det här fältet ska skrivas till loggfilen. ställ alltid in den här parametern på TRUE för lösenords- eller PIN-fält
Typ Typ av kontroll, vilket är något av följande:

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

Den här metoden lägger till en kontroll i en namngiven alternativknappsgrupp, enligt tabell 33. Du måste anropa detta före metoden InitFields , eftersom den metoden använder attribut i RadioGroup-elementet för att styra inställningarna för alla alternativknappskontroller i gruppen. Radiogrupper kan till exempel låsas så att alla alternativknappar inaktiveras, men underordnade kontroller aktiveras eller inaktiveras endast baserat på vilken alternativknapp som väljs. Den här metoden returnerar alltid S_OK.

Tabell 33. HRESULT AddRadioGroup

Parameter Beskrivning
Gruppnamn En sträng som definierar en grupp med alternativknappar på den här sidan
radioControlId ID:t för en enda alternativknapp som ska läggas till i den här gruppen
EnableRadioGroup
HRESULT EnableRadioGroup(LPCWSTR groupName, BOOL enable)

Med den här metoden kan du aktivera eller inaktivera en hel alternativknappsgrupp. Om du inaktiverar en radiogrupp inaktiveras alla alternativknappskontroller i gruppen samt eventuella underordnade alternativknappar som har lagts till med AddToGroup. Se Tabell 34 och Tabell 35.

Tabell 34. EnableRadioGroup

Parameter Beskrivning
Gruppnamn Namn på en alternativknappsgrupp som du redan har definierat med ett anrop till AddRadioGroup
Aktivera Ställ in på TRUE för att aktivera alternativknappsgruppen och FALSE för att inaktivera gruppen

Tabell 35. HRESULT EnableRadioGroup

HRESULT Beskrivning
S_OK Grupp aktiverad eller inaktiverad
E_INVALIDARG Det finns ingen alternativknappsgrupp med det namn som du angav
InitFields
HRESULT InitFields(IFieldCallback *pFieldCallback = nullptr)

Innan du anropar den här metoden anropar du AddField för varje fält som XML kan styra. Den här metoden returnerar alltid S_OK.

Parametern pFieldCallback är valfri. Om du anger det anropar formulärstyrenheten SetFieldDefault för kontroller som inte är CONTROL_STATIC_TEXT eller CONTROL_CHECK_BOX. Med det här beteendet kan du hämta ett standardvärde från XML och ange det i kontrollen själv.

SaveFields
HRESULT SaveFields(IFieldCallback *pFieldCallback = nullptr)

Den här metoden sparar fältvärden i aktivitetssekvensvariabler och till sammanfattningsdata som visas på sidan Sammanfattning . Genom att ange en pekare i pFieldCallback kan du hantera sparande värden för kontroller som inte stöder CONTROL_STATIC_TEXT.

IsFieldDisabled
BOOL IsFieldDisabled(int controlId)

Med den här metoden kan du avgöra om ett fält har inaktiverats i XML-koden.

InitSection
HRESULT InitSection(LPCWSTR key, LPCWSTR sectionCaption)

Den här metoden initierar de sammanfattningsdata som visas på sidan Sammanfattning , enligt tabell 36. Anropa den här metoden i metoden OnNextSelected innan du anropar SaveFields. Den här metoden returnerar alltid S_OK.

Tabell 36. HRESULT-initSection

Parameter Beskrivning
Nyckel Den här parametern ska vara unik för din sida. Den används för att säkerställa att varje sida har sin egen sammanfattningsinformation.
sectionCaption Rubriken som visas på sidan Sammanfattning för den här sidans sammanfattningsinformation. Vanligtvis använder du DisplayName() som värde för den här parametern.
AddSummaryItem
HRESULT AddSummaryItem(LPCWSTR first, LPCWSTR second)

Med den här metoden kan du lägga till sammanfattningsobjekt på sidan Sammanfattning utöver de objekt som angetts med XML. Se Tabell 37.

Tabell 37. HRESULT AddSummaryItem

Parameter Beskrivning
Första Bildtext för sammanfattningsobjektet, som visas på vänster sida
Andra Det värde som visas på höger sida
SuppressLogValue
HRESULT SuppressLogValue(LPCWSTR tsVariableName)

Anropa den här metoden för aktivitetssekvensvariabler som du inte vill att värdena ska skrivas till loggfilen för. Anropa den här metoden för aktivitetssekvensvariabler som lagrar lösenord, PIN-koder eller andra känsliga värden som en användare kan ange.

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

Den här metoden sparar värdet för en textkontroll till både en aktivitetssekvensvariabel och sammanfattningsavsnittet. Normalt behöver du inte anropa den här metoden själv, eftersom formulärkontrollanten gör detta för alla fält. Se Tabell 38.

Tabell 38. HRESULT SaveText

Parameter Beskrivning
controlId ID:t för textrutan som innehåller det värde som du vill spara (eller någon annan kontroll som kan returnera text)
tsVariableName Namnet på aktivitetssekvensvariabeln som du vill ändra
summaryCaption Bildtext på sidan Sammanfattning för det här värdet
LoadText
HRESULT LoadText(int controlId, LPCWSTR tsVariableName)

Den här metoden läser värdet för en aktivitetssekvensvariabel och anger textrutan till det här värdet.

ControlEvent
void ControlEvent(WORD eventId, WORD controlId)

Anropa den här metoden på OnControlEvent-metoden för att säkerställa att formulärkontrollanten kan bearbeta kontrollhändelser, vilket den behöver göra för att fungera korrekt. De värden som du skickar till den här metoden är samma värden som skickas till metoden OnControlEvent .

IsValid
BOOL IsValid(void)

Den här metoden returnerar status för den senaste verifieringen av formuläret. Om någon av kontrollverifierarna rapporterade ett fel returnerar den här metoden FALSE. Med andra ord returnerar den bara TRUE om alla kontroller på sidan är giltiga.

IValidator-gränssnitt

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

Validatorer är komponenter som kan verifiera en enda kontroll på sidan. Det enklaste sättet att implementera en validerare är att göra den till en underklass till klassen BaseValidator , som definieras i basevalidator.h-huvudfilen.

HRESULT Init(IControl *pControl, LPCTSTR-meddelande)

Om du skapar en validerare i kod kan du anropa den här metoden för att initiera valideraren. Se Tabell 39.

Tabell 39. HRESULT Init

Parameter Beskrivning
pControl Kontrollen som validatorn måste verifiera
Meddelande Meddelandet som ska visas på sidan om kontrollen inte är giltig
HRESULT Init(IControl *pControl, IWizardPageContainer *pContainer, IStringProperties *pProperties)

Formulärkontrollanten anropar den här metoden för att initiera validatorer som skapas baserat på sidans XML. Se Tabell 40.

Tabell 40. HRESULT Init-metod

Parameter Beskrivning
pControl Kontrollen som validatorn måste verifiera
pContainer Om validatorn behöver åtkomst till loggaren eller behöver skapa andra komponenter
pEgenskaper Ger åtkomst till egenskaperna (set-element) för validatorn
BOOL, IsValid(LPBSTR pMessage)

Den här metoden returnerar TRUE om kontrollen är giltig eller FALSE om kontrollen är ogiltig. Vid retur ska pMessage fyllas i med en ny BSTR som innehåller meddelandet som ska visas när kontrollen inte är giltig.

HRESULT SetProperty(int propertyId, LPVARIANT pValue)

Du kan implementera den här metoden om du behöver extra värden som inte anges i XML-koden.

HRESULT SetProperty(int propertyId, IUnknown *pUnknown)

Du kan implementera den här metoden om du behöver extra värden som inte anges i XML-koden.

HRESULT SetProperty)(int propertyId, LPCTSTR pValue)

Du kan implementera den här metoden om du behöver extra värden som inte anges i XML-koden.

IRegEx-gränssnitt

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

Den här metoden implementeras av komponenten ID_Regex (IRegex.h) och ger stöd för bearbetning av reguljära uttryck.

BOOL MatchesRegex(LPCTSTR input, LPCTSTR regex)

Den här metoden kör det reguljära uttrycket mot indatatexten. Den använder C++-standardbibliotekets regex_match-funktion för att utföra det faktiska arbetet. Metoden returnerar TRUE om det fanns matchningar, ANNARS FALSKT.

HRESULT GetMatch(size_t index, LPBSTR pValue)

Med den här metoden kan du hämta matchningarna från det senaste MatchesRegex-anropet . Observera att det inte finns något fel vid bearbetning i den här metoden och antingen returnerar den S_OK eller utlöser ett undantag.

Gränssnitt för ISummaryInfo

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

Du bör inte behöva använda det här gränssnittet direkt. Använd i stället IFormController.

ISummaryBag

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

Du bör inte behöva använda det här gränssnittet direkt. Använd i stället IFormController.

ITSVariableBag-gränssnitt

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

Det här gränssnittet ger åtkomst till aktivitetssekvensvariabler. Du kan komma åt det här gränssnittet med hjälp av sidans TSVariables() -metod.

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

Den här metoden läser värdet för en aktivitetssekvensvariabel.

Obs!

Värden cachelagras efter den första läsningen.

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

Den här metoden anger värdet för en aktivitetssekvensvariabel. Det här värdet sparas i minnet. Aktivitetssekvensvärden skrivs när du väljer Slutför i UDI-guiden.

void Clear(void)

Den här metoden tar bort alla aktivitetssekvensvärden som har sparats i minnet.

HRESULT Remove([in] LPCTSTR variableName)

Den här metoden tar bort ett specifikt aktivitetssekvensvärde från minnet. Nästa gång du anropar GetValue med samma aktivitetssekvensnamn försöker metoden hämta den från aktivitetssekvensen.

HRESULT SuppressLogValue([in] LPCTSTR variableName)

När aktivitetssekvensvariabler skrivs, till exempel när du väljer Slutför i UDI-guiden, skrivs namn och värden till loggfilen. Anropa den här metoden för att förhindra loggning av känsliga värden, till exempel lösenord eller PIN-koder, för en specifik aktivitetssekvensvariabel.

void Save(void)

Den här metoden sparar alla aktivitetssekvensvärden som har angetts med anrop till SetValue.

ITSVariableRepository-gränssnitt

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

Det här gränssnittet används internt av TSVariableBag för läsning och skrivning av aktivitetssekvensvariabler.

IWizardFinish-gränssnitt

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

Det här gränssnittet är användbart i avancerade scenarier där du vill utföra ytterligare bearbetning när du väljer Slutför eller Avbryt i UDI-guiden. UDI-guiden innehåller en slutförd uppgift som sparar aktivitetssekvensvariabler när du väljer Slutför. Om du avbryter guiden anger aktiviteten endast aktivitetssekvensvariabeln OSDSetupWizCancelled till TRUE och sparar inte ändringar i andra aktivitetssekvensvariabler.

Om du skapar en egen slutkomponent måste du registrera den med kod som den här:

Register<MyFinishTaskFactory>(ID_MyFinishTask, pRegistry);

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

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

pService->Register(pFinish);

IBindableList-gränssnitt

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

Implementera det här gränssnittet om du har en komponent för datakällan som du vill binda till en kombinationsruta genom att anropa dess bindningsmetod .

size_t Count(void)

Den här metoden returnerar antalet objekt i listan.

HRESULT GetCaption(size_t index, LPBSTR pCaption)

Den här metoden returnerar objektets bildtext vid ett specifikt index.

IDataNodes-gränssnitt

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

Det här gränssnittet ger åtkomst till hierarkiska data som kan sparas på en sida. Du får det här gränssnittet via metoder i gränssnittet ISettingsProperties , som är tillgängligt för din sida via metoden Inställningar .

Data i en sidas XML kan se ut ungefär så här

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

Anropsinställningar()->GetDataNode(L"Network", &pData) ger dig en IDataNodes-instans med två dataobjekt (som var och en i sin tur har två egenskaper).

size_t Count()

Den här metoden returnerar antalet DataItem-element .

HRESULT SetCaptionProperty(LPCTSTR captionProperty)

Komponenten som stöder det här gränssnittet stöder också IBindableList, vilket gör det enkelt att fylla i en kombinationsruta med data från sidans XML. Den här metoden styr vilken egenskap (setter) i varje DataItem-element som ska användas för den här bindningen. Du kan till exempel anropa den här metoden med DisplayName och använda den här setter-egenskapen för databindning. Kombinationsrutan skulle sedan innehålla Offentliga och Dev Team som objekt.

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

Den här metoden hämtar en egenskap från ett av DataItem-elementen . Se Tabell 41 och Tabell 42.

Tabell 41. DataItem GetProperty

Parameter Beskrivning
Index Indexvärdet (börjar med 0) för dataobjektet som du vill hämta ett egenskapsvärde för
PropertyName Namnet på den uppsättningsegenskap som du vill hämta ett värde för
propertyValue Vid retur innehåller strängvärdet för en egenskap

Tabell 42. HRESULT GetProperty

HRESULT Beskrivning
S_OK Egenskapen hämtades.
E_INVALIDARG Indexet är förbi slutet av matrisen.
HRESULT GetNode(size_t index, [out] ISettingsProperties **ppNode)

Den här metoden liknar GetProperty, men i stället för att returnera ett värde från en DataItem returnerar den hela DataItem som omsluts i ett ISettingsProperties-gränssnitt . Se Tabell 43 och Tabell 44.

Tabell 43. HRESULT GetNode

Parameter Beskrivning
Index Indexvärdet (börjar med 0) för dataobjektet som du vill hämta ett egenskapsvärde för
ppNode Vid avslut, ISettingsProperties-gränssnittet som omsluter DataItem-noden

Tabell 44. HRESULT GetNode-resultat

HRESULT Beskrivning
S_OK Noden hämtades.
E_INVALIDARG Indexet är förbi slutet av matrisen.

Gränssnitt för IFactoryRegistry

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

När du skapar en ny anpassad sida måste du minst skapa en sidfabrik – en klass som implementerar IClassFactory. (Du kan använda ClassFactoryImpl som basklass för din fabrik.)

void Register(LPCTSTR-typ, IClassFactory *pFactory)

Den här metoden registrerar en klassfabrik med registret. Se Tabell 45.

Tabell 45. IClassFactory void Register

Parameter Beskrivning
Typ En sträng som identifierar den fabrik som du registrerar. i allmänhet bör den här parametern ha företagets namn i strängen för att säkerställa att den är unik
pFactory En pekare till din klassfabriksinstans
HRESULT LoadAndRegister(LPCTSTR dllName, ILogger *pLogger)

Den här metoden är endast avsedd för internt bruk.

BOOL Contains(LPCTSTR-typ)

Den här metoden är vanligtvis avsedd för intern användning. Den kontrollerar om en klassfabrik har registrerats för en typ.

HRESULT GetFactory(LPCTSTR-typ, IClassFactory **ppFactory)

Med den här metoden kan du hämta klassfabriken. Vanligtvis anropar du CreateInstance. Men om du ska skapa ett stort antal av samma komponent är det mer effektivt att hämta fabriken och sedan be den att skapa instanserna åt dig.

HRESULT CreateInstance(LPCTSTR-typ, IUnknown **ppInstance)

Den här metoden skapar en ny instans av en komponent, givet dess typ. Använd mallmetoden CreateInstance i stället, vilket gör det möjligt att skapa typsäkra objekt.

HRESULT SetContainer(IWizardPageContainer *pContainer)

Den här metoden är endast avsedd för internt bruk.

HRESULT RegisterService(REFGUID iid, IUnknown *pService)

Tjänster är enskilda instanser av en komponent som kan användas på flera platser. Du kan använda den här metoden för att registrera en tjänst på en sida och sedan hämta samma instans från en annan sida.

HRESULT GetService(REFGUID iid, IUnknown **ppService)

Den här metoden hämtar en tjänst som tidigare har registrerats med ett anrop till RegisterService.

HRESULT SetLanguage(LANGID languageId)

Den här metoden anger språket i UDI-guiden till den språkidentifierare som du angav i parametern languageId .

LANGID GetLanguage()

Den här metoden returnerar värdet för språkidentifieraren som du angav med kommandoradsparametern /locale för UDI-guiden. Metoden returnerar något av följande värden:

  • Värdet för språkidentifieraren som medföljer kommandoradsparametern /locale

  • 0, om du inte angav kommandoradsparametern /locale

ILogger-gränssnitt

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

UDI-guiden loggar information till en loggfil, vilket hjälper dig att felsöka problem som finns i fältet. Det är en bra idé att dina sidor loggar information. Du kan hämta en pekare till det här gränssnittet från sidan med hjälp av sidans Logger() -metod. Raderna i loggfilen innehåller ett "nivånummer" som representerar felmeddelanden, normalmeddelanden, utförliga meddelanden eller felsökningsmeddelanden.

Obs!

Felsökningsmeddelanden sparas inte i loggfilen om inte felsökningsstöd är aktiverat. Du kan aktivera felsökningsstöd genom att lägga till följande rad i formatelementet i .config-filen:

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

Den här metoden är endast avsedd för internt bruk.

MoveLog
HRESULT MoveLog(LPCWSTR logFilename)

Den här metoden är endast avsedd för internt bruk.

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

Den här metoden är endast avsedd för internt bruk.

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

Den här metoden är endast avsedd för internt bruk.

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

Anropa den här metoden för att logga information om ett fel. Se Tabell 46.

Tabell 46. HRESULT-fel

Parameter Beskrivning
Fel Felkoden som returneras av ett anrop (Den här koden visas i loggposten som ett tal.)
Komponent En sträng som identifierar källan till felet, som vanligtvis är din sida eller komponenten som du har skrivit
Meddelande Meddelandet som förklarar vad som orsakade felet
Fel 2
HRESULT Error2(HRESULT error, LPCTSTR component, LPCTSTR message, LPCTSTR message2)

Den här metoden liknar felmetoden men gör att du kan ange ett meddelande i två delar. Det slutliga meddelandet har "message" och sedan "message2" i utdatafilen. Detta är helt enkelt en bekvämlighetsmetod.

Normal
HRESULT Normal(LPCTSTR component, LPCTSTR message)

Den här metoden loggar ett normalt meddelande. Se beskrivningen av felmetoden för parametrar.

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

Den här metoden loggar ett normalt meddelande. Se beskrivningen av error2-metoden för parametrar.

Utförlig
HRESULT Verbose(LPCTSTR component, LPCTSTR message)

Den här metoden loggar ett utförligt meddelande. Se beskrivningen av felmetoden för parametrar.

Utförlig2
HRESULT Verbose2(LPCTSTR component, LPCTSTR message, LPCTSTR message2)

Den här metoden loggar ett utförligt meddelande. Se beskrivningen av error2-metoden för parametrar.

Debug
HRESULT Debug(LPCWSTR component, LPCWSTR message)

Den här metoden loggar ett felsökningsmeddelande. Se beskrivningen av felmetoden för parametrar. Felsökningsmeddelanden sparas inte i filen om de inte är aktiverade. Mer information finns i avsnittet Översikt.

EnableDebug
HRESULT EnableDebug(BOOL debug)

Den här metoden är endast avsedd för internt bruk.

Nära
HRESULT Close(void)

Den här metoden är endast avsedd för internt bruk.

GetLogFilename
HRESULT GetLogFilename(LPBSTR pFilename)

Den här metoden hämtar namnet på loggfilen.

IOrientation Interface

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

Det här gränssnittet är endast för internt bruk.

ISettings-gränssnitt

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

Det här gränssnittet är endast för internt bruk.

ISettingsProperties-gränssnitt

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

Det här gränssnittet ger åtkomst till siddata. Om du vill komma till den översta nivån av siddata använder du sidans inställningsmetod().

HRESULT GetAttribute(LPCTSTR attributeName, LPBSTR attributeValue)

Med den här metoden kan du hämta attributvärdena på huvudnoden, vilket är sidnoden när du använder metoden Settings() på sidan.

IStringProperties * Properties()

Den här metoden ger åtkomst till set-egenskapsvärdena under huvudnoden. För en sida är det här egenskaperna på den översta nivån.

HRESULT SelectNodes(LPCTSTR xPath, IXMLDOMNodeList **ppList)

Anropa den här metoden om du vill hämta en lista över XML-noder direkt med ett XPath-uttryck. Det är bättre att använda någon av de andra metoderna om du kan. Använd endast den här metoden om du inte kan komma åt noder på något annat sätt.

HRESULT SelectSingleNode(LPCTSTR xPath, IXMLDOMNode **ppNode)

Anropa den här metoden om du vill hämta en enda XML-nod direkt med ett XPath-uttryck. Det är bättre att använda någon av de andra metoderna om du kan. Använd bara den här metoden om du inte kan komma till en nod på något annat sätt.

HRESULT GetDataNode(LPCTSTR name, ISettingsProperties **ppNode)

Hämta ett dataelement baserat på elementets namnattribut .

HRESULT GetDataNodes(IDataNodes **ppNodes)

Den här metoden hämtar en lista över DataItem-element under den aktuella noden. Från sidnivå anropar du GetDataNode för att hämta ett ISettingsProperty-gränssnitt för data. På den instansen anropar du sedan GetDataNodes för att hämta listan över poster. Med den här XML-koden kan du till exempel:

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

Den här metoden ger ett snabbt sätt att komma till uppsättningen DataItem-noder under en specifik datanod . Med hjälp av XML från exemplet GetDataNodes gör följande kod exakt samma sak som de fyra kodraderna i exemplet under GetDataNodes men med felkontroll:

ISimpleStringProperties Interface

Gränssnitt för ISimpleStringProperties

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

Det här gränssnittet kanske inte är användbart i sig. Den implementeras dock av komponenten ID_SimpleStringProperties , som även implementerar gränssnittet IStringProperties . Du kan använda den här komponenten om du behöver skicka en uppsättning egenskaper till en annan komponent, till exempel en aktivitet, men du vill lägga till värden programmatiskt i stället för att använda värden från XML. Här är ett exempel på hur du använder det här gränssnittet:

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

Det här gränssnittet ger enkel åtkomst till en uppsättning setter-element som kommer från XML. Det här gränssnittet är tillgängligt för egenskaperna för en sida med hjälp av Settings()->Properties().

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

Den här metoden hämtar ett enda egenskapsvärde. Se Tabell 47 och Tabell 48.

Tabell 47. Hämta egenskapsvärde för IHRESULT

Parameter Beskrivning
PropertyName Namnet på den egenskap som du vill läsa
pPropValue Vid avslut innehåller egenskapsvärdet som en sträng (Det här värdet blir nullptr om det inte finns någon sådan egenskap.)

Tabell 48. Hämta egenskapsvärderesultat för IHRESULT

HRESULT Beskrivning
S_OK Egenskapsvärdet hämtas.
E_INVALIDARG Det finns ingen egenskap med det namn som du angav.

ITaskManager-gränssnitt

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

Det här gränssnittet implementeras av TaskManager-komponenten (ID_TaskManager i ITaskManager.h), som är komponenten som kör uppgifter på sidan preflight. Du kan antingen använda sidan preflight direkt, vilket är vad du gör för det mesta, eller skapa en egen sida, så att den här komponenten kan utföra det mesta av arbetet.

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

Du måste anropa den här metoden innan du anropar någon annan metod. Den initierar TaskManager-komponenten . Se Tabell 49.

Tabell 49. HRESULT Init

Parameter Beskrivning
pPageView Ger åtkomst till den sida som ska köra uppgifter (Den här sidan måste ha en specifik uppsättning kontroller som beskrivs i de närmaste parametrarna.)
idListView Kontroll-ID för en ListView-kontroll som visar listan över uppgifter och status för dessa aktiviteter
idMessage Kontroll-ID för en textruta som ska användas för att visa ett meddelande för den uppgift som du väljer
idRetryButton Kontroll-ID för en knapp som du kan välja för att köra aktiviteterna igen
pPageInfo En omslutning runt sidans XML (TaskManager läser in den uppsättning uppgifter som ska köras från denna XML.)
pCallback Kan vara null (Om den här parametern inte är null anropar TaskManager metoden Startad när en aktivitet startas och metoden Slutförd för varje aktivitet som har körts klart.)
HRESULT SetFailMessage(LPCWSTR-meddelande)

Den här metoden anger det meddelande som ska visas om en eller flera aktiviteter misslyckas.

HRESULT Start(void)

Den här metoden startar alla uppgifter. Varje uppgift startas i en separat tråd.

HRESULT GetTaskMessage(size_t index, LPBSTR-meddelande)

Den här metoden är endast avsedd för internt bruk. Det hämtar det aktuella meddelandet för en aktivitet baserat på dess index i listan över aktiviteter.

HRESULT GetResultType)(size_t index, LPBSTR-typ)

Den här metoden hämtar den aktuella "typen" för en aktivitet. Tabell 50 visar tillgängliga typer.

Tabell 50. HRESULT GetResultType

Typ Beskrivning
0 Representerar en uppgift som lyckades
1 Representerar en uppgift som returnerade en varning
-1 Representerar en misslyckad uppgift

Typen hämtas genom att titta på aktivitetens slut- eller felkod och hitta en matchning i aktivitetens <ExitCodes> XML-element.

HRESULT GetProperty(size_t index, LPCTSTR propertyName, LPBSTR-värde)

Den här metoden används av förlopps- och preflight-sidorna för att hämta egenskapen BitmapFilename setter så att den kan visa en bild bredvid meddelandet för den uppgift som du markerar. Med andra ord kan du lägga till en anpassad setter i uppgiftens XML och sedan hämta den med den här metoden.

int GetSelectedIndex(void)

Den här metoden hämtar indexet för den markerade aktiviteten, vilket är användbart om du vill hämta ytterligare information om aktiviteten (se GetProperty-metoden ) som ska visas för den valda aktiviteten. Förlopps- och förloppssidorna använder den här metoden för att visa en bild för den valda aktiviteten.

HRESULT Wait(DWORD waitMilliseconds)

Den här metoden hjälper främst till med enhetstester så att testet kan se till att aktiviteterna slutförs innan enhetstestet avslutas. Normalt skulle du inte anropa den här metoden. Den returnerar antingen när alla aktiviteter har slutförts eller väntetiden har förflutit.

size_t FailedCount(void)

Den här metoden returnerar antalet aktiviteter som för närvarande är markerade som misslyckade.

size_t WarningCount(void)

Den här metoden returnerar det antal aktiviteter som för närvarande är markerade som varning.

size_t SucceedCount(void)

Den här metoden returnerar antalet aktiviteter som för närvarande har markerats som slutförda.

size_t RunningCount(void)

Den här metoden returnerar antalet aktiviteter som körs för närvarande.

void OnCommonControlEvent(WORD controlId, LPNMHDR pInfo)

Anropa den här metoden från sidans OnCommonControlEventatt TaskManager kan bearbeta händelser som den behöver.

void OnControlEvent(WORD eventId, WORD controlId)

Anropa den här metoden från sidans OnControlEventatt TaskManager kan bearbeta händelser som den behöver.

void EnableButtons(BOOL enable)

Den här metoden är endast avsedd för internt bruk.

IWizardComponent-gränssnitt

__interface IWizardComponent : IUnknown
{
    HRESULT SetContainer(IWizardPageContainer *pContainer);
};
Översikt

Vanligtvis implementerar du inte det här gränssnittet direkt utan i stället via mallklassen WizardComponent . Om komponenten implementerar det här gränssnittet och du har registrerat en klassfabrik med registret får komponenten en pekare till IWizardPageContainer-instansen när den skapas. Detta hjälper dig till exempel att komma åt loggaren eller registret för att skapa andra komponenter som komponenten kan behöva.

IWizardDialogController-gränssnitt

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

Det här gränssnittet är endast för internt bruk.

IWizardDialogView-gränssnitt

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

Det här gränssnittet är endast för internt bruk.

IWizardPage-gränssnitt

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

Det här gränssnittet implementeras av WizardPageImpl, så normalt behöver du inte implementera det själv. Guiden anropar alla dessa metoder åt dig när den interagerar med dina anpassade sidor.

IWizardPageContainer-gränssnitt

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

Det här gränssnittet är tillgängligt för din sida via containermetoden (implementerad av WizardPageImpl) och ger dig åtkomst till olika tjänster i guiden.

ILogger * Logger(void)

Använd den här metoden för att skriva meddelanden till loggfilen, till exempel:

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

Den här metoden ger åtkomst till "minnesvariabler", som är egenskaper som endast finns i minnet när UDI-guiden körs. Dessa egenskaper är tillgängliga för andra sidor antingen i kod eller i XML med hjälp av $memoryVarName$- syntaxen.

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

Med den här metoden kan du skapa en ny instans av alla komponenter som har registrerats. Det är dock bättre att använda mallfunktionen CreateInstance, eftersom den är starkt skriven.

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

Med den här metoden kan du hämta en tjänst som har registrerats. Det är dock bättre att anropa funktionen GetService-mall , som är starkt skrivet (i stället för att använda IUnknown).

HRESULT ReplaceVariables(LPCTSTR-källa, [out] LPBSTR pDest)

Den här metoden hanterar arbete med variabler inuti strängvärden. Den stöder de format som visas i tabell 51 och tabell 52.

Tabell 51. HRESULT ReplaceVariables

Format Beskrivning
$Name$ Ersätter värdet för en minnesvariabel med det här namnet (om det inte finns någon minnesvariabel med namnet tas "token" bort.)
%Name% Antingen en aktivitetssekvensvariabel eller en miljövariabel. Ordningen är följande:

1. Använd värdet för en aktivitetssekvensvariabel, om den finns.
2. Använd värdet för en miljövariabel, om den finns.
3. Annars tar du bort den här texten från strängen.

Tabell 52. HRESULT-parameter

Parameter Beskrivning
Source Indatasträngen, som kan innehålla valfri kombination av $ variabler och % eller ingen alls
pDest Vid retur innehåller en ny sträng som har alla token ersatta enligt tabell 51
HRESULT GotoPage(LPCTSTR pageName)

Den här metoden har inte testats fullständigt. Tanken är att du kan växla direkt till en specifik sida baserat på namnet på sidan enligt definitionen i den .config XML-filen. Om du anropar den här metoden kringgås OnNextSelected på sidan. Dessutom kan beteendet för den här metoden ändras, så använd den på egen risk.

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

Den här metoden visar en meddelanderuta med texten och bildtext som du anger. uType-parametern är ett värde som du kan ange för Funktionen MessageBox Win32.

BOOL InPreview(void)

Den här metoden returnerar TRUE om du startade guiden i läget "förhandsversion" genom att ange /preview-växeln . I förhandsgranskningsläge inaktiveras aldrig knappen Nästa . Med den här metoden kan du kringgå kod i förhandsgranskningsläge, till exempel som kan orsaka problem när du inte har giltiga data på sidan.

HWND GetHwnd(void)

Den här metoden returnerar HWND för huvuddialogrutan. Använd den här metoden med försiktighet. I allmänhet är programmeringsgränssnittet för UDI-guiden utformat så att du aldrig arbetar direkt med fönsterhandtag.

IWizardPageView-gränssnitt

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

Det här gränssnittet är tillgängligt för koden på sidan via view-metoden (implementerad av WizardPageImpl).

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

UDI-guiden använder omslutning, som verkligen är fasader för att interagera med kontrollerna på sidan. Om du använder de här fasaderna i stället för de faktiska kontrollerna blir det mycket enklare att skriva tester för sidan, eftersom du kan tillhandahålla modeller från dina tester.

I stället för att använda den här metoden direkt är det bättre att använda mallmetoden GetControlWrapper , som är starkt skrivet, till exempel:

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

Den här metoden returnerar fönsterhandtaget för sidan. I allmänhet bör du inte behöva åtkomst till det här fönsterhandtaget.

HWND GetControl(int itemId)

Om du måste kan du anropa den här metoden för att hämta fönsterhandtaget för en kontroll på sidan. (Det är bättre att anropa mallfunktionen GetControlWrapper ).

HRESULT Show (void)

Den här metoden är endast avsedd för internt bruk.

HRESULT Hide(void)

Den här metoden är endast avsedd för internt bruk.

HRESULT Focus(int itemId)

Ange indatafokus till en specifik kontroll.

IWizardPage * Page(void)

Den här metoden är endast avsedd för internt bruk.

IFormController * Form(void)

Den här metoden är endast avsedd för internt bruk.

HRESULT FocusWizardButton(knappen WizardButtons)

Ställer in fokus på någon av guidens knappar. WizardButtons har två värden: BackButton och NextButton.

HRESULT SetEnable(wizardButtons button, BOOL enable)

Begär att en av guideknapparna ska aktiveras eller inaktiveras. Knappen kanske inte matchar det tillstånd som du begär. Om du till exempel kör UDI-guiden med /preview-växeln aktiveras alltid knapparna. WizardButtons har två värden: BackButton och NextButton.

void ShowWarningMessage(LPCTSTR-meddelande)

Den här metoden visar ett varningsmeddelande längst ned i sidans innehållsområde. Det här meddelandet kan vara vilken text du vill.

void HideWarningMessage(void)

Dölj ett varningsmeddelande som du visade med ett anrop till ShowWarningMessage.

IXmlDocument-gränssnitt

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

Det här gränssnittet implementeras av komponenten ID_IXmlDocument , som är en fasad som är utformad för att göra det enklare att arbeta med XML-dokument i C++.

HRESULT Load(LPCTSTR-filnamn)

Den här metoden läser in ett XML-dokument från en extern fil. Den returnerar S_OK om filen lästes in utan fel eller S_FALSE om ett fel uppstod. När det uppstår ett fel kan du få felmeddelandet genom att anropa GetParseErrorMessage.

HRESULT LoadXml(LPCTSTR xml)

Den här metoden läser in ett XML-dokument från en sträng i stället för en extern fil. Förutom källan för att läsa XML-koden är beteendet detsamma som metoden Load .

HRESULT Save(LPCWSTR-filnamn)

Den här metoden sparar XML-dokumentet som finns i minnet till en extern fil.

HRESULT GetParseErrorMessage(LPBSTR pMessage)

Den här metoden returnerar en ny sträng med felmeddelandet från att läsa in XML-dokumentet, om det finns några. Den returnerar alltid S_OK.

HRESULT SelectNodes(LPCTSTR xpath, IXMLDOMNodeList **ppNodes)

Med den här metoden kan du använda ett XPath-uttryck för att hämta en samling noder från dokumentet. Den returnerar alltid S_OK.

HRESULT SelectSingleNode(LPCTSTR xpath, IXMLDOMNode **ppNode)

Med den här metoden kan du använda ett XPath-uttryck för att hämta en nod från dokumentet. Den returnerar alltid S_OK.

HRESULT AddSchema(LPCTSTR-filnamn, LPCTSTR ns)

Den här metoden lägger till namnet på en extern schemafil som ska användas för att verifiera schemat för XML-dokumentet när det läses in. Namnområdet som du anger är den sträng som du kan använda i XPath-frågor, även om detta inte har testats.

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

Den här metoden lägger till ett nytt attribut till en befintlig nod i XML-dokumentet. Se Tabell 53.

Tabell 53. HRESULT AddAttribute

Parameter Beskrivning
pNode Den nod som du vill lägga till ett attribut till
Namn Namnet på det nya attributet
Värde Värdet för det nya attributet
HRESULT CreateNode(DOMNodeType type, LPCWSTR name, LPCWSTR ns, IXMLDOMNode **ppNode)

Anropa den här metoden för att skapa en ny nod:

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

När du har skapat en ny nod kan du lägga till den som underordnad till en annan nod genom att anropa den överordnade appendChild-metoden .

Hjälpfunktioner

CreateInstance-mallfunktion

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

Den här funktionen definieras i IWizardPageContainer.h och tillhandahåller en typsäker omslutning över metoden IWizardPageContainer-CreateInstance>, till exempel:

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

Den här koden skapar en ny ID_Directory komponent för att hämta IDirectory-gränssnittet för komponenten.

Funktionen GetService-mall

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

Den här funktionen definieras i IWizardPageContainer.h och tillhandahåller en typsäker omslutning över metoden IWizardPageContainer-GetService>, till exempel:

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

Den här funktionen hämtar aktivitetssekvenskomponenten, som stöder ITSVariableBag-gränssnittet . (För ITSVariableBag kan du använda metoden TSVariables i klassen WizardPageImpl i stället.)

UDI-guiden Designer schemareferens för konfigurationsfil

Den här filen används av UDI-guiden Designer. En separat fil skapas för varje anpassad .dll fil, som kan innehålla anpassade sidredigerare för guider, anpassade uppgifter eller anpassade validerare. Filen måste sluta med .config och finnas i mappen installation_folder\Bin\Config (där installation_folder är mappen där du installerade MDT).

Tabell 54 visar elementen i UDI-guiden Designer konfigurationsfilen och deras beskrivningar. DesignerConfig-elementet är rotnoden för den här referensen.

Tabell 54. Element i UDI-guiden Designer konfigurationsfilen och deras beskrivningar

Elementnamn Beskrivning
DesignerConfig Anger roten för alla andra element
DesignerMappings Grupperar en uppsättning sidelement
Sida Anger en sidredigerare som ska läsas in i UDI-guiden Designer, som används för att redigera konfigurationsinställningarna för en guidesida
Param Anger en parameter som skickas till det överordnade aktivitets - eller validatorelementet och motsvarar ett Setter-element i konfigurationsfilen för UDI-guiden Obs! Attributen för det här elementet är olika om det överordnade elementet är elementet Aktivitet eller Validator .
Uppgift Anger en aktivitet i aktivitetsbiblioteket
TaskItem Anger en grupp med parametrar som skickas till aktiviteten
TaskLibrary Grupperar en uppsättning aktivitetselement
Validator Anger en validerare i valideringsbiblioteket
ValidatorLibrary Grupperar en uppsättning valideringselement

DesignerConfig

Det här elementet anger roten för alla andra element.

Elementinformation

Tabell 55 innehåller information om elementet DesignerConfig .

Tabell 55. Information om DesignerConfig-element

Attribut Värde
Antal förekomster Ett: Det här elementet krävs.
Överordnade element Ingen
Innehåll DesignerMappings, TaskLibrary, ValidatorLibrary
Elementattribut

Det här elementet har inga attribut.

Anmärkningar

Ingen.

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

DesignerMappings

Det här elementet grupperar en uppsättning sidelement .

Elementinformation

Tabell 56 innehåller information om elementet DesignerMappings .

Tabell 56. Information om DesignerMappings-element

Attribut Värde
Antal förekomster Noll eller ett i designerkonfigurationselementet (det här elementet är valfritt om det inte finns någon anpassad guidesida i DLL-filen som motsvarar den här UDI-guiden Designer konfigurationsfil.)
Överordnade element DesignerConfig
Innehåll Sida
Elementattribut

Det här elementet har inga attribut.

Anmärkningar

Ingen.

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

Sida

Det här elementet anger en guidesideredigerare som ska läsas in i UDI-guiden Designer, som i sin tur används för att redigera konfigurationsinställningarna för en guidesida.

Elementinformation

Tabell 57 innehåller information om sidelementet .

Tabell 57. Information om sidelement

Attribut Värde
Antal förekomster En eller flera för varje guidesida som definierats i elementet DesignerMappings
Överordnade element DesignerMappings
Innehåll Valfritt välformat XML-innehåll
Elementattribut

Tabell 58 visar attributen för sidelementet och en beskrivning för var och en.

Tabell 58. Attribut och motsvarande värden för sidelementet

Attribut Beskrivning
Beskrivning Anger text som innehåller information om parametern som visas i UDI-guiden Designer
DesignerAssembly Anger namnet på den .dll fil som är associerad med guidens sidredigerare (filen .dll måste finnas i mappen installation_folder\Bin (där installation_folder är mappen där du installerade MDT.)
DesignerType Anger namnet på guidens sidredigerare i .dll fil som anges i attributet DesignerAssembly (Det här är Microsoft .NET-typen för guidens sidredigerare, med det fullständigt kvalificerade Microsoft .NET-namnområdet.)
Displayname Anger det användarvänliga namnet på sidredigeraren, som visas i UDI-guiden Designer
DLL Anger namnet på den .dll fil som är associerad med guidesidan (den .dll filen måste finnas i mappen installation_folder\Templates\Distribution\Tools\platform (där installation_folder är mappen där du installerade MDT och plattformen är x86 för 32-bitarsversionen eller x64 är för 64-bitarsversionen.) Observera: Kontrollera att DLL-processorarkitekturen matchar MDT-processorarkitekturen som är installerad. Om du till exempel har installerat en 32-bitarsversion av MDT kontrollerar du att du använder en 32-bitars DLL för guidesidan.
Bild Anger namnet på en bild på sidan som är i PNG-format (Portable Network Graphics) (filen .png måste finnas i mappen installation_folder\Bin\Images (där installation_folder är mappen där du installerade MDT.)
Typ Anger guidens sidredigerare och måste matcha namnet som användes när den anpassade sidan registrerades
Anmärkningar

UDI-guiden Designer använder sidelementet som en mall för att skapa den första XML-koden för en ny guide. UDI-guiden Designer utför schemaverifiering för att säkerställa att sid- och underordnade element har ett giltigt format. Det här elementet innehåller en mappning mellan UDI-guidens sidtyp och den information som UDI-guiden Designer behöver för att redigera och skapa sidor av den här typen med hjälp av en anpassad sidredigerare.

Exempel

Ingen.

Param

Det här elementet anger en parameter som skickas till det överordnade aktivitets - eller validatorelementet och motsvarar ett Setter-element i konfigurationsfilen för UDI-guiden.

Obs!

Attributen för det här elementet är olika om det överordnade elementet är elementet Task eller Validator .

Elementinformation

Tabell 59 innehåller information om Param-elementet .

Tabell 59. Param-elementinformation

Attribut Värde
Antal förekomster En eller flera för varje överordnat Element för TaskItem eller Validator
Överordnade element TaskItem, validator
Innehåll Valfritt välformat XML-innehåll
Elementattribut

Tabell 60 visar attributen för elementet Param och innehåller en beskrivning av var och en.

Tabell 60. Attribut och motsvarande värden för Param-elementet

Attribut Beskrivning
Beskrivning Anger text som innehåller information om parametern som visas i UDI-guiden Designer Obs! Det här attributet är endast giltigt för elementet Validator.
Displayname Anger det användarvänliga namnet på validatorparametern, som visas för lämplig UDI-guidesida i UDI-guiden Designer (Det här namnet är vanligtvis mer beskrivande än attributet Namn.) Obs! Det här attributet är endast giltigt för elementet Validator.
Namn Anger namnet på parametern som skickas till aktiviteten eller valideraren, beroende på det överordnade elementet (Det här attributet blir egenskapsattributet i ett Setter-element i konfigurationsfilen för UDI-guiden.)Observera: Den här parametern används för både överordnade Element för TaskItem och Validator.
Anmärkningar

Ingen.

Exempel

Ingen.

Uppgift

Det här elementet anger en aktivitet i aktivitetsbiblioteket.

Elementinformation

Tabell 61 innehåller information om aktivitetselementet .

Tabell 61. Information om aktivitetselement

Attribut Värde
Antal förekomster Ett eller flera element i TaskLibrary-elementet (Det här elementet är inte valfritt om elementet TaskLibrary har angetts.)
Överordnade element TaskLibrary
Innehåll TaskItem
Elementattribut

Tabell 62 visar attributen för aktivitetselementet och innehåller en beskrivning av var och en.

Tabell 62. Attribut och motsvarande värden för aktivitetselementet

Attribut Beskrivning
Beskrivning Anger text som innehåller information om uppgiften, som visas i UDI-guiden Designer
DLL Anger namnet på den .dll fil som är associerad med uppgiften (filen .dll måste finnas i mappen installation_folder\Templates\Distribution\Tools\platform (där installation_folder är mappen där du installerade MDT och plattformen är x86 för 32-bitarsversionen eller x64 för 64-bitarsversionen.)
Namn Anger namnet på aktiviteten, som visas på lämplig UDI-guidesida och i UDI-guiden Designer
Typ Anger aktivitetstypen, som är registrerad i fabriksregistret och används för att anropa en viss aktivitet i en .dll fil
Anmärkningar

Ingen.

Exempel

Ingen.

TaskItem

Det här elementet anger en grupp med parametrar som skickas till aktiviteten.

Elementinformation

Tabell 63 innehåller information om elementet TaskItem .

Tabell 63. TaskItem-elementinformation

Attribut Värde
Antal förekomster En eller flera för varje aktivitetselement
Överordnade element Uppgift
Innehåll Param
Elementattribut

Tabell 64 visar attributen för elementet TaskItem och innehåller en beskrivning av var och en.

Tabell 64. Attribut och motsvarande värden för TaskItem-elementet

Attribut Beskrivning
Typ Anger vilken elementtyp som ska skapas i konfigurationsfilen för UDI-guiden. Ett XML-element skapas som motsvarar värdet för det här attributet. Om värdet för det här attributet till exempel är File skapas ett filelement i konfigurationsfilen för UDI-guiden.

För närvarande stöds endast följande värden:

- Fil, som kräver två underordnade Param-element (ett underordnat Param-element med attributet Namn inställt på Källa och ett annat underordnat Param-element med attributet Namn inställt på Dest)
- Setter, som kräver ett underordnat Param-element
Anmärkningar

Ingen.

Exempel

Ingen.

TaskLibrary

Det här elementet grupperar en uppsättning aktivitetselement .

Elementinformation

Tabell 65 innehåller information om elementet TaskLibrary .

Tabell 65. Information om TaskLibrary-element

Attribut Värde
Antal förekomster Noll eller en i elementet DesignerConfig (det här elementet är valfritt om det inte finns några anpassade uppgifter i DLL-filen som motsvarar den här UDI-guiden Designer konfigurationsfilen.)
Överordnade element DesignerConfig
Innehåll Uppgift
Elementattribut

Det här elementet har inga attribut.

Anmärkningar

Ingen.

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

Validator

Det här elementet anger en validerare i valideringsbiblioteket.

Elementinformation

Tabell 66 innehåller information om elementet Validator .

Tabell 66. Information om validatorelement

Attribut Värde
Antal förekomster Noll eller mer i elementet ValidatorLibrary (det här elementet är valfritt.)
Överordnade element ValidatorLibrary
Innehåll Param
Elementattribut

Tabell 67 visar attributen för elementet Validator och innehåller en beskrivning av var och en.

Tabell 67. Attribut och motsvarande värden för validatorelementet

Attribut Beskrivning
Beskrivning Anger text som innehåller information om valideraren, som visas i UDI-guiden Designer
Displayname Anger det användarvänliga namnet på validatorn som visas i UDI-guiden Designer (Det här namnet är vanligtvis mer beskrivande än attributet Namn.)
DLL Anger namnet på den .dll fil som är associerad med validatorn (filen .dll måste finnas i mappen installation_folder\Templates\Distribution\Tools\platform (där installation_folder är mappen där du installerade MDT och plattformen är x86 för 32-bitarsversionen eller x64 för 64-bitarsversionen.)
Namn Anger namnet på valideraren, som visas på lämplig UDI-guidesida och i UDI-guiden Designer
Typ Anger valideringstypen, som är registrerad med registerfaktorn och används för att anropa en specifik validerare i en .dll fil
Anmärkningar

Ingen.

Exempel

Ingen.

ValidatorLibrary

Det här elementet grupperar en uppsättning validatorelement .

Elementinformation

Tabell 68 innehåller information om elementet ValidatorLibrary .

Tabell 68. Information om ValidatorLibrary-element

Attribut Värde
Antal förekomster Noll eller ett i DesignerConfig-elementet (det här elementet är valfritt om det inte finns några anpassade validatorer i DLL-filen som motsvarar den här UDI-guiden Designer konfigurationsfil.)
Överordnade element DesignerConfig
Innehåll Validator
Elementattribut

Det här elementet har inga attribut.

Anmärkningar

Ingen.

Exempel

<DesignerConfig> + <TaskLibrary> – <ValidatorLibrary> +<Validator DLL="" Description="Requires text in a field" Type="Microsoft.Wizard.Validation.NonEmpty" Name="NonEmpty"> +<Validator DLL="" Description="Doesn'T t allow certain characters to be in a field" Type="Microsoft.Wizard.Validation.InvalidChars" Name="InvalidChars"> +<Validator DLL="" Description="Must follow a pre-defined pattern" Type="Microsoft.Wizard.Validation.RegEx" Name=" NamedPattern"> +<Validator DLL="" Description="Require the contents match a regular expression" Type="Microsoft.Wizard.Validation.RegEx" Name="RegEx"></ValidatorLibrary> + <DesignerMappings></DesignerConfig>

Referens för UDI-guiden Designer

Kontroller

De kontroller som används för att skapa anpassade sidredigerare för användning i UDI-guiden Designer är WPF UserControl-instanser. Tabell 69 visar de kontroller som du kan använda för att skapa anpassade sidredigerare för guider.

Tabell 69. Kontroller som kan användas för att skapa anpassade sidredigerare för guider

Kontroll Beskrivning
CollectionTControl Den här kontrollen används för att redigera data som lagras i dataelementet i ett sidelement .
FieldElementControl Den här kontrollen används för att redigera ett fält, som vanligtvis är länkat till en TextBox-kontroll på .xaml-sidan.
SetterControl Den här kontrollen används för att ändra värdet för ett setter-element i konfigurationsfilen för UDI-guiden.

CollectionTControl

Den här kontrollen innehåller många funktioner för att redigera data. Det bästa sättet att lära sig hur du använder den här kontrollen är att titta på exemplet, som visar hur du redigerar data under en sidas dataelement . I synnerhet visar exemplet hur du lägger till, tar bort och redigerar objekt i den här kontrollen.

FieldElementControl

Använd den här kontrollen för att redigera ett fält, som vanligtvis är länkat till en TextBox-kontroll på .xaml-sidan.

Exempel

Följande utdrag från en .xaml-fil illustrerar användningen av FieldElementControl för att konfigurera standardvärdet för ett fält på en guidesida med hjälp av en underordnad TextBox-kontroll :

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

Den här strängegenskapen innehåller information om hur du ansluter FieldElementControl till den underliggande XML-koden för fältet. Anslutningen görs till en egenskap för sidredigerarens gränssnitt. Följande utdrag från en .xaml-fil illustrerar användningen av egenskapen FieldData :

FieldData="{Binding DataContext.Location, ElementName=ControlRoot}"

I det här utdraget heter sidredigerarens gränssnitt ControlRoot och anges i parametern ElementName . Bindningen utförs till egenskapen DataContext.Location i controlRoot-sidredigerarens gränssnitt. DataContext är en vymodell som pekar på sidelementet i konfigurationsfilen för UDI-guiden. Plats är en egenskap för vyn som returnerar en lista över möjliga platser och definieras av ett dataelement i konfigurationsfilen för UDI-guiden. Varje plats definieras av ett DataItem-element i konfigurationsfilen för UDI-guiden.

HeaderText

Med den här strängegenskapen kan du ange en rubrik för FieldElementControl-kontrollen . Rubriken fungerar som en rubrik för kontrollen och formateras som fet, orange text som visas direkt ovanför kontrollen.

Instruktionstext

Med den här strängegenskapen kan du ange informationstext för FieldElementControl-kontrollen . Normalt används texten för att ge en kort beskrivning av fältet och förklara hur konfigurering av fältet påverkar motsvarande guidesida.

HideEnableButton

Med den här booleska egenskapen kan du styra synligheten för knappen som ändrar tillstånd mellan Olåst och Låst (aktiverat eller inaktiverat). Om det är inställt på:

  • Sant, knappen är inte synlig

  • Falskt, knappen är synlig (det här är standardvärdet.)

HideDefaultTab

Med den här booleska egenskapen kan du styra synligheten för avsnittet som innehåller den kontroll som används för att ange standardvärdet. Även om egenskapen refererar till en flik finns det ingen flik i FieldElementControl utan i stället ett avsnitt som kan döljas. Om det är inställt på:

  • Sant, avsnittet är inte synligt

  • Falskt, avsnittet är synligt (det här är standardvärdet.)

HideBorder

Med den här booleska egenskapen kan du styra synligheten för kantlinjen runt fältkontrollen. Om det är inställt på:

  • Sant, kantlinjen är inte synlig

  • False, kantlinjen är synlig (detta är standardvärdet.)

HideImage

Med den här booleska egenskapen kan du styra synligheten för den bild som egenskapen FieldImageSource konfigurerar. Om det är inställt på:

  • Sant, bilden är inte synlig

  • Falskt, bilden är synlig (det här är standardvärdet.)

HideValidationTab

Med den här booleska egenskapen kan du styra synligheten för avsnittet där listan över validerare hanteras. Även om egenskapen refererar till en flik finns det ingen flik i FieldElementControl utan i stället ett avsnitt som kan döljas. Om det är inställt på:

  • Sant, avsnittet är inte synligt

  • Falskt, avsnittet är synligt (det här är standardvärdet.)

HideSummaryTab

Med den här booleska egenskapen kan du styra synligheten för avsnittet där du konfigurerar fältsammanfattningen bildtext. Det bildtext och motsvarande värde från fältet visas i en sammanfattningssida i ett stegflöde. Även om egenskapen refererar till en flik finns det ingen flik i FieldElementControl utan i stället ett avsnitt som kan döljas. Om det är inställt på:

  • Sant, avsnittet är inte synligt

  • Falskt, avsnittet är synligt (det här är standardvärdet.)

HideTaskSequenceTab

Med den här booleska egenskapen kan du styra synligheten för avsnittet där du konfigurerar aktivitetssekvensvariabeln som motsvarar fältet. Även om egenskapen refererar till en flik finns det ingen flik i FieldElementControl utan i stället ett avsnitt som kan döljas. Om det är inställt på:

  • Sant, avsnittet är inte synligt

  • Falskt, avsnittet är synligt (det här är standardvärdet.)

SetterControl

Använd den här kontrollen för att ändra värdet för ett Setter-element i konfigurationsfilen för UDI-guiden. Den här kontrollen innehåller en underordnad kontroll som används för att ändra värdet för setter-elementet .

Exempel

Följande utdrag från en .xaml-fil illustrerar användningen av SetterControl för att ändra ett Setter-element med namnet KeyLocationSetter med hjälp av en underordnad TextBox-kontroll .

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

Du måste binda detta till en egenskap för din vy eller vymodell som ansluter till setter. Det liknar hur du binder till ett fält, enligt beskrivningen för FieldElementControl.

HeaderText

Med den här egenskapen kan du ange den text som ska visas i kontrollens rubrik. Tänk på den här egenskapen som en rubrik för kontrollen; Som standard visas den som fet, orange text.

Instruktionstext

Ange den här egenskapen till den text som du vill ska visas under rubriken , vanligtvis instruktionstext som talar om för användaren i din anpassade redigerare när och varför de vill ändra beteendet för fältet.

Gränssnitt

Tabell 70 visar de gränssnitt som du kan använda för att skapa anpassade sidredigerare för guider.

Tabell 70. Gränssnitt som kan användas för att skapa anpassade guider för sidredigerare

Gränssnitt Beskrivning
IDataService Använd det här gränssnittet för att ansluta fält till dataelementen i konfigurationsfilen för UDI-guiden.
IMessageBoxService Det här gränssnittet ger åtkomst till metoder som du kan använda för att visa meddelanderutor.

IDataService

Det här gränssnittet innehåller flera egenskaper och metoder, men det finns bara en egenskap som du vill ha. Den egenskapen är den enda som dokumenteras här.

Du kan använda beroendeinmatning för att hämta en pekare till det här gränssnittet med hjälp av kod som den här i klassen:

[Dependency]
public IDataService DataService { get; set; }
Egenskaper

Tabell 71 visar egenskaperna för IDataService-gränssnittet .

Tabell 71. Egenskaper för IDataService-gränssnittet

Gränssnitt Beskrivning
CurrentPage Den här egenskapen ger åtkomst till XML-element, attribut och värden under kontexten för den aktuella sidan som redigeras i konfigurationsfilen för UDI-guiden
CurrentPage
XElement CurrentPage { get; set; }

Den här egenskapen ger åtkomst till XML för den aktuella sidan. Du bör aldrig ange den här egenskapen, men du kan ändra XML-koden för sidan. Exempelsideredigeraren visar exempel på hur du ändrar XML-koden. Du använder den här egenskapen främst när du har anpassade data. För fält och egenskaper (seters) kan du använda fördefinierade kontroller som tar hand om all information.

IMessageBoxService

Det här gränssnittet ger åtkomst till metoder som du kan använda för att visa meddelanderutor. Du kanske undrar varför du behöver ett gränssnitt för att visa en meddelanderuta. Verkligheten är att du inte gör det: Microsoft använder det här gränssnittet med i kod, eftersom det underlättar skrivning av automatiserade tester för designersidor.

Men att använda dessa metoder ger en användbar fördel: Dialogrutorna har alltid "ägare" inställt på UDI-guiden, vilket säkerställer att dialogrutan är korrekt grupperad med huvudfönstret.

Du kan använda beroendeinmatning för att hämta en pekare till det här gränssnittet med hjälp av kod som den här i klassen:

[Dependency]
public IMessageBoxService MessageBoxes { get; set; }
Metoder

Tabell 72 visar metoderna för gränssnittet IMessageBoxService .

Tabell 72. Metoder för IMessageBoxService-gränssnittet

Metod Beskrivning
ShowMessageBox Den här överlagrade metoden används för att visa en meddelanderuta med följande medlemmar:

- ShowMessageBox(Strängmeddelande, Sträng bildtext, MessageBoxImage-ikon)
- ShowMessageBox(strängmeddelande, sträng bildtext, MessageBoxButton-knapp, MessageBoxImage-ikon)
- ShowMessageBox(undantagsfel)
ShowDialogWindow Använd den här metoden för att skapa en ny dialogruta.
ShowWizardWindow Använd den här metoden om du vill visa en anpassad redigerare i en dialogruta som innehåller knapparna Nästa och Bakåt för navigering.
ShowMessageBox

Den här metoden visar en meddelanderuta som är underordnad den anpassade guidens sidredigerare. Den här medlemmen är överbelastad: Tabell 73 innehåller en lista över medlemmarna och en kort beskrivning av var och en. Fullständig information om varje medlem (inklusive syntax, användning och exempel) finns i avsnittet som motsvarar varje medlem.

Tabell 73. Överlagrade medlemmar för ShowMessagBox-metoden

Medlem Beskrivning
ShowMessageBox(Strängmeddelande, Sträng bildtext, MessageBoxImage-ikon) Visar en meddelanderuta med en ikon och en OK-knapp
ShowMessageBox(strängmeddelande, sträng bildtext, MessageBoxButton-knapp, MessageBoxImage-ikon) Visar en meddelanderuta med en ikon och olika möjliga kombinationer av knappar
ShowMessageBox(undantagsfel) Visar en meddelanderuta som innehåller information om ett undantag och har en OK-knapp
ShowMessageBox(Strängmeddelande, Sträng bildtext, MessageBoxImage-ikon)
void ShowMessageBox(String message, String caption, MessageBoxImage icon);

Den här metoden visar en meddelanderuta med en OK-knapp . Se Tabell 74.

Tabell 74. Parametrar för metoden ShowMessageBox(String message, String bildtext, MessageBoxImage)

Parameter Beskrivning
Meddelande Meddelandet som ska visas i meddelanderutans innehållsområde
bildtext Texten som ska visas i namnlisten i dialogrutan
Ikonen Den typ av ikon som ska visas i meddelanderutan
ShowMessageBox(strängmeddelande, sträng bildtext, MessageBoxButton-knapp, MessageBoxImage-ikon)
MessageBoxResult ShowMessageBox(string message, string caption, MessageBoxButton button, MessageBoxImage icon);

Den här metoden visar en meddelanderuta med den uppsättning knappar som du vill visa och rapporterar vilken knapp du har valt. Se Tabell 75.

Tabell 75. Parametrar för metoden ShowMessageBox(strängmeddelande, sträng bildtext, MessageBoxButton-knapp, MessageBoxImage-ikon)

Parameter Beskrivning
Meddelande Meddelandet som ska visas i meddelanderutans innehållsområde
bildtext Texten som ska visas i namnlisten i dialogrutan
Knappen Vilka knappar som ska visas
Ikonen Den typ av ikon som ska visas i meddelanderutan
ShowMessageBox(undantagsfel)
void ShowMessageBox(Exception exception);

Den här metoden visar en meddelanderuta som rapporterar information om ett undantag. Den här meddelanderutan har en enda OK-knapp . Se Tabell 76.

Tabell 76. Parametrar för metoden ShowMessageBox(undantagsfel)

Parameter Beskrivning
Undantag Det undantag som du vill rapportera (i dialogrutan används undantag. Meddelande som innehåll.)
ShowDialogWindow
void ShowDialogWindow(Type viewType, DialogInteraction dialogPayload);

Den här metoden skapar en ny dialogruta, vars innehåll är den text som du anger i parametern viewType . UDI-Designer skapar en ny instans av den här typen och omsluter den i en dialogruta med knapparna OK och Avbryt.

Du skickar data till din kontroll med hjälp av parametern dialogPayload. SampleEditor-lösningen i SDK-katalogen har ett exempel på hur du använder den här funktionen.

ShowWizardWindow
void ShowWizardWindow(Type viewType, DialogInteraction dialogPayload);

Med den här metoden kan du visa en anpassad redigerare i en dialogruta som innehåller knapparna Nästa och Bakåt för navigering. Microsoft har inte angett något exempel för hur du använder den här metoden.

Referens för konfigurationsfilschema för UDI-guiden

Den här filen används av UDI-guiden och konfigureras av UDI-guiden Designer. Den här filen används för att konfigurera:

  • Guidesidor som visas i UDI-guiden

  • Sekvensen för guidesidorna i UDI-guiden

  • Inställningar för fälten på varje guidesida

  • Tillgängliga stagegroups i UDI-guiden Designer

  • Tillgängliga faser i varje distributionsguide i UDI-guiden Designer

    77 visar elementen i konfigurationsfilen för UDI-guiden och deras beskrivningar. Wizard-elementet är rotnoden för den här referensen.

Tabell 77. Element i konfigurationsfilen för UDI-guiden och deras beskrivningar

Elementnamn Beskrivning
Data Grupperar de enskilda DataItem-elementen i ett sidelement och namnges av attributet Namn .
Dataitem Grupperar enskilda Setter-element i ett sidelement . Du kan skapa hierarkiska data genom att inkludera ett eller flera dataelement i ett DataItem-element . Varje DataItem-element representerar ett enskilt objekt. En lista över tillgängliga enheter kan till exempel ha en DataItem för visningsnamnet och ett annat DataItem-element för motsvarande enhetsbeteckning.
Standard Anger ett standardvärde för det fält som anges i det överordnade elementet Fält eller RadioGroup . Standardvärdet är inställt på det värde som har hakparerats av det här elementet.
DLL Anger en DLL som ska läsas in och refereras av UDI-guiden och UDI-guiden Designer.
Dlls Grupperar de enskilda DLL-elementen .
Fel Anger en möjlig felkod som en uppgift kan returnera. Värdet för felkoden returneras av aktivitetens HRESULT och fångas av det här elementet för att tillhandahålla mer specifik felinformation.
ExitCode Anger en möjlig slutkod för en aktivitet. Slutkoderna är returkoder som aktiviteten förväntar sig. Skapa ett ExitCode-element för varje möjlig slutkod. Annars kan du ange en asterisk (*) i attributet Value för att hantera returkoder som inte anges i andra ExitCode-element .
ExitCodes Grupperar en uppsättning exitcode - och felelement för ett aktivitetselement eller ett felelement .
Fält Anger en instans av en kontroll i ett sidelement som används för att anpassa med XML. Alla kontroller tillåter inte anpassning med XML – endast kontroller som använder elementet Fält .
Fält Grupperar de enskilda fältelementen i ett sidelement .
Fil Anger källan och målet för en filkopieringsåtgärd med aktivitetstypen Microsoft.Wizard.CopyFilesTask . Du kan inkludera ett separat filelement för att kopiera mer än en fil i en enda uppgift.
Sida Anger en instans av en sida och innehåller alla konfigurationsinställningar för sidan.
Pageref Anger en referens till en instans av en sida i en fas i en StageGroup.
Sidor Grupperar de enskilda sidelementen .
RadioGroup Anger en grupp med alternativknappar i ett Fält-element .
StageGroup Anger en grupp med en eller flera faser.
StageGroups Grupperar en uppsättning fasgrupper i en konfigurationsfil för UDI-guiden.
Setter Anger en egenskapsinställning för ett värde för en egenskap med namnet i egenskapen Egenskap .
Fas Anger en fas i en StageGroup och innehåller ett eller flera PageRef-element .
Format Grupperar de enskilda setterelementen som konfigurerar UDI-guidens utseende och känsla, inklusive rubriken som visas överst i guiden och banderollsbilden som visas i UDI-guiden.
Uppgift Anger en aktivitet som ska köras på sidan som anges i det överordnade sidelementet .
Uppgifter Grupperar en uppsättning uppgifter för ett sidelement .
Validator Anger en validerare för fältkontrollen som anges i det överordnade fältelementet .
Guiden Anger roten för alla andra element.

Data

Det här elementet grupperar de enskilda DataItem-elementen i ett sidelement och namnges av attributet Namn .

Elementinformation

Tabell 78 innehåller information om dataelementet .

Tabell 78. Information om dataelement

Attribut Värde
Antal förekomster Noll eller mer i varje sidelement (det här elementet är valfritt.)
Överordnade element Sida, DataItem
Innehåll DataItem, Setter
Elementattribut

Tabell 79 visar attributen för dataelementet och innehåller en beskrivning av var och en.

Tabell 79. Attribut och motsvarande värden för dataelementet

Attribut Beskrivning
Namn Anger namnet på dataelementet
Anmärkningar

Med attributet Namn kan kod hämta en specifik uppsättning data.

Exempel

Ingen.

Dataitem

Det här elementet grupperar enskilda Setter-element i ett sidelement . Du kan skapa hierarkiska data genom att inkludera ett eller flera dataelement i ett DataItem-element . Varje DataItem-element representerar ett enskilt objekt. En lista över tillgängliga enheter kan till exempel ha en DataItem för visningsnamnet och ett annat DataItem-element för motsvarande enhetsbeteckning.

Elementinformation

Tabell 80 innehåller information om DataItem-elementet .

Tabell 80. DataItem-elementinformation

Attribut Värde
Antal förekomster Noll eller mer i varje dataelement (det här elementet är valfritt.)
Överordnade element Data
Innehåll Data, Setter
Elementattribut

Det här elementet har inga attribut.

Anmärkningar

Ingen.

Exempel

Ingen.

Standard

Det här elementet anger ett standardvärde för fältet som anges i det överordnade elementet Fält eller RadioGroup . Standardvärdet är inställt på det värde som elementet har hakparenteser.

Elementinformation

Tabell 81 innehåller information om standardelementet .

Tabell 81. Standardelementinformation

Attribut Värde
Antal förekomster Noll eller mer i ett Fält - eller RadioGroup-element (det här elementet är valfritt.)
Överordnade element Fält, RadioGroup
Innehåll Kan vara valfritt välformat XML-innehåll men är vanligtvis standardtext
Elementattribut

Det här elementet har inga attribut.

Anmärkningar

Ingen.

Exempel

I följande exempel är standardvärdet för fältet Tidszon inställt på "Pacific Standard Time":

<Field Name="TimeZone" Enabled="true" VarName="OSDTimeZone" Summary="Time Zone:">
  <Default>Pacific Standard Time</Default>

DLL

Det här elementet anger en DLL för UDI-guiden och UDI-guiden Designer att läsa in och referera till.

Elementinformation

Tabell 82 innehåller information om DLL-elementet .

Tabell 82. Information om DLL-element

Attribut Värde
Antal förekomster En eller flera i DLL-elementet
Överordnat element Dlls
Innehåll Inget innehåll tillåts för det här elementet
Elementattribut

Tabell 83 visar attributen för DLL-elementet och innehåller en beskrivning av var och en.

Tabell 83. Attribut och motsvarande värden för DLL-elementet

Attribut Beskrivning
Namn Anger namnet på DLL-filen för UDI-guiden och UDI-guiden Designer att referera till
Anmärkningar

Ingen.

Exempel
<DLLs>
  <DLL Name="OSDRefreshWizard.dll" />
  <DLL Name="SharedPages.dll" />
</DLLs>

Dlls

Det här elementet grupperar de enskilda DLL-elementen .

Elementinformation

Tabell 84 innehåller information om DLL-elementet .

Tabell 84. Information om DLL-element

Attribut Värde
Antal förekomster En
Överordnade element Guiden
Innehåll DLL
Elementattribut

Det här elementet har inga attribut.

Anmärkningar

Ingen.

Exempel
<DLLs>
   <DLL Name="OSDRefreshWizard.dll" />
   <DLL Name="SharedPages.dll" />
</DLLs>

Fel

Det här elementet anger en möjlig felkod som en uppgift kan returnera. Värdet för felkoden returneras och fångas av aktivitetens HRESULT för att ge mer specifik felinformation.

Elementinformation

Tabell 85 innehåller information om elementet Error .

Tabell 85. Information om felelement

Attribut Värde
Antal förekomster Noll eller mer i varje ExitCode-element (det här elementet är valfritt.)
Överordnade element ExitCodes
Innehåll Valfritt välformat XML-innehåll
Elementattribut

Tabell 86 visar attributen för elementet Error och innehåller en beskrivning av var och en.

Tabell 86. Information om felelement

Attribut Beskrivning
Tillstånd Anger returtillståndet för en aktivitet som påträffade ett fel. Vanligtvis anges värdet för det här attributet till Fel. Det här värdet visas i kolumnen Tillstånd på guidesidan i UDI-guiden.
Text Anger den beskrivande texten om felvillkoret som aktiviteten påträffade.
Typ Anger om det här elementet representerar ett fel, en varning eller ett lyckat resultat. Värdet som anges iTyp måste vara unikt i ett ExitCodes-element . Följande är giltiga värden för det här elementet:

- **0.**Elementet representerar ett lyckat resultat.
- 1. Elementet representerar en varning.
- -1. Elementet representerar ett fel.
Värde Anger värdet för den kod som aktiviteten returnerade som ett numeriskt värde. Om du anger värdet för en asterisk (*) anger du standardelementet för returkoder som inte visas i andra felelement .
Anmärkningar

Ingen.

Exempel

Ingen.

ExitCode

Det här elementet anger en möjlig slutkod för en aktivitet. Slutkoderna är returkoder som aktiviteten förväntar sig. Skapa ett ExitCode-element för varje möjlig slutkod. Annars kan du ange en asterisk (*) i attributet Value för att hantera returkoder som inte anges i andra ExitCode-element .

Elementinformation

Tabell 87 innehåller information om ExitCode-elementet .

Tabell 87. Information om ExitCode-element

Attribut Värde
Antal förekomster Noll eller mer i varje ExitCodes-element (det här elementet är valfritt.)
Överordnade element ExitCodes
Innehåll Minst ett ExitCode-element och noll eller fler felelement
Elementattribut

Tabell 88 visar attributen för ExitCode-elementet och innehåller en beskrivning av var och en.

Tabell 88. Attribut och motsvarande värden för ExitCode-elementet

Attribut Beskrivning
Tillstånd Anger returtillståndet för en aktivitet. Värdet för det här attributet visas i kolumnen Delstat på motsvarande guidesida i UDI-guiden. Du kan använda alla värden för det här attributet som är meningsfulla för din uppgift. Följande är vanliga värden som används för det här attributet:

-Framgång
-Varning
-Fel
Text Anger den beskrivande texten om aktivitetens befintliga kod.
Typ Anger om det här elementet representerar ett fel, en varning eller ett lyckat resultat. Värdet som anges i typen måste vara unikt i ett ExitCodes-element . Följande är giltiga värden för det här elementet:

- 0. Elementet representerar en framgång.
- 1. Elementet representerar en varning.
- -1. Elementet representerar ett fel.
Värde Anger värdet för den kod som aktiviteten returnerade som ett numeriskt värde. Om du anger värdet för en asterisk (*) anger du standardelementet för returkoder som inte visas i andra ExitCode-element .
Anmärkningar

Ingen.

Exempel

Ingen.

ExitCodes

Det här elementet grupperar en uppsättning exitcode - och felelement för en aktivitet eller ett felelement .

Elementinformation

Tabell 89 innehåller information om exitCodes-elementet .

Tabell 89. ExitCodes-elementinformation

Attribut Värde
Antal förekomster En i varje aktivitetselement
Överordnade element Uppgift
Innehåll Fel, ExitCode
Elementattribut

Det här elementet har inga attribut.

Anmärkningar

Ingen.

Exempel

Ingen.

Fält

Det här elementet anger en instans av en kontroll i ett sidelement som används för att anpassa med XML. Alla kontroller tillåter inte anpassning med XML – endast kontroller som använder elementet Fält .

Elementinformation

Tabell 90 innehåller information om elementet Fält .

Tabell 90. Fältelementinformation

Attribut Värde
Antal förekomster Noll eller fler i varje fältelement (det här elementet är valfritt.)
Överordnade element Fält
Innehåll Standard, validator
Elementattribut

Tabell 91 visar attributen för elementet Fält och innehåller en beskrivning av var och en.

Tabell 91. Attribut och motsvarande värden för fältelementet

Attribut Beskrivning
Aktiverat Anger om fältet är aktiverat för användarindata (Attributet kan anges till Sant eller Falskt.)
Namn Anger namnet på fältet
Sammanfattning Anger den beskrivande text som visas på sidan Sammanfattningsguide för det värde som det här fältet anger
VarName Anger namnet på aktivitetssekvensvariabeln som lästs eller konfigurerats med hjälp av fältet i det överordnade fältelementet
Anmärkningar

Det här elementet kan innehålla noll eller fler standardelement och noll eller fler valideringselement .

Exempel

Ingen.

Fält

Det här elementet grupperar de enskilda fältelementen i ett sidelement .

Elementinformation

Tabell 92 innehåller information om elementet Fält .

Tabell 92. Elementinformation för fält

Attribut Värde
Antal förekomster Noll eller mer i varje sidelement (det här elementet är valfritt.)
Överordnade element Sida
Innehåll Fält, RadioGroup
Elementattribut

Det här elementet har inga attribut.

Anmärkningar

Ingen.

Exempel

Ingen.

Fil

Det här elementet anger källan och målet för en filkopieringsåtgärd med aktivitetstypen Microsoft.Wizard.CopyFilesTask . Du kan inkludera ett separat filelement för att kopiera mer än en fil i en enda uppgift.

Elementinformation

Tabell 93 innehåller information om filelementet .

Tabell 93. Information om filelement

Attribut Värde
Antal förekomster En eller flera för varje aktivitet som har en aktivitetstyp av Microsoft.Wizard.CopyFilesTask
Överordnade element Uppgift
Innehåll Ingen
Elementattribut

Tabell 94 visar attributen för filelementet och innehåller en beskrivning av var och en.

Tabell 94. Attribut och motsvarande värden för filelementet

Attribut Beskrivning
Dest Anger den fullständigt kvalificerade eller relativa sökvägen till målmappen för filen som anges i källattributet . Miljövariabler tillåts som en del av sökvägen.
Source Anger den fullständigt kvalificerade eller relativa sökvägen till källfilen som aktivitetstypen Microsoft.Wizard.CopyFilesTask kopierar. Det här attributet stöder jokertecken så att flera filer kan kopieras med ett enda filelement . Miljövariabler tillåts som en del av sökvägen.
Anmärkningar

Ingen.

Exempel

Ingen.

Sida

Det här elementet anger en instans av en sida och innehåller alla konfigurationsinställningar för sidan.

Elementinformation

Tabell 95 innehåller information om sidelementet .

Tabell 95. Information om sidelement

Attribut Värde
Antal förekomster En eller flera i varje pages-element
Överordnade element Sidor
Innehåll Data, Fält, Setter, Uppgifter
Elementattribut

Tabell 96 visar attributen för sidelementet och innehåller en beskrivning av var och en.

Tabell 96. Attribut och motsvarande värden för sidelementet

Attribut Beskrivning
Displayname Anger det användarvänliga namnet på den guidesida som visas i UDI-guiden Designer. Det här namnet är vanligtvis mer beskrivande än attributet Namn .
Namn Anger namnet på den guidesida som visas i UDI-guiden Designer.
Typ Anger vilken typ av guidesida som direkt relaterar till en specifik guidesida i en DLL.
Anmärkningar

Ingen.

Exempel

Ingen.

Pageref

Det här elementet anger en referens till en instans av en sida i en fas i en StageGroup.

Elementinformation

Tabell 97 innehåller information om PageRef-elementet .

Tabell 97. PageRef-elementinformation

Attribut Värde
Antal förekomster Ett eller flera i ett stegelement
Överordnade element Fas
Innehåll Ingen
Elementattribut

Tabell 98 visar attributet för PageRef-elementet och innehåller en beskrivning av det.

Tabell 98. Attribut och motsvarande värden för PageRef-elementet

Attribut Beskrivning
Sida Anger instansen av en sida i en fas i en StageGroup. Ange det här värdet till attributet Namn för ett sidelement .
Anmärkningar

Ingen.

Exempel

Ingen.

Sidor

Det här elementet grupperar de enskilda sidelementen .

Elementinformation

Tabell 99 innehåller information om elementet Sidor .

Tabell 99. Information om sidelement

Attribut Värde
Antal förekomster En
Överordnade element Guiden
Innehåll Sida
Elementattribut

Det här elementet har inga attribut.

Anmärkningar

Ingen.

Exempel
<Pages>
   + <Page Name="WelcomePage" DisplayName="Welcome" Type="Microsoft.SharedPages.WelcomePage">
   + <Page Name="ConfigScanPage" DisplayName="Deployment Readiness" Type="Microsoft.OSDRefresh.ConfigScanPage">
   + <Page Name="ConfigScanBareMetal" DisplayName="Deployment Readiness" Type="Microsoft.OSDRefresh.ConfigScanPage">
   + <Page Name="RebootPage" DisplayName="Reboot" Type="Microsoft.OSDRefresh.RebootPage">
   + <Page Name="WelcomePageReplace" DisplayName="Welcome" Type="Microsoft.SharedPages.WelcomePage">
   + <Page Name="VolumePage" DisplayName="Volume" Type="Microsoft.OSDRefresh.VolumePage">
   + <Page Name="UserRestorePage" DisplayName="Select Target" Type="Microsoft.OSDRefresh.UserStatePage">
   + <Page Name="ComputerPage" DisplayName="New Computer Details" Type="Microsoft.OSDRefresh.ComputerPage">
   + <Page Name="AdminAccounts" DisplayName="Administrator Password" Type="Microsoft.SharedPages.AdminAccountsPage">
   + <Page Name="UDAPage" DisplayName="User Device Affinity" Type="Microsoft.OSDRefresh.UDAPage">
   + <Page Name="LanguagePage" DisplayName="Language" Type="Microsoft.OSDRefresh.LanguagePage">
   + <Page Name="ApplicationPage" DisplayName="Install Programs" Type="Microsoft.OSDRefresh.ApplicationPage">
     <Page Name="SummaryPage" DisplayName="Summary" Type="Microsoft.Shared.SummaryPage" />
   + <Page Name="UserCapturePageOldPC" DisplayName="Select Target" Type="Microsoft.OSDRefresh.UserStatePage">
   + <Page Name="ProgressPage" DisplayName="Capture Data" Type="Microsoft.OSDRefresh.ProgressPage">
   + <Page Name="RebootAfterCapture" DisplayName="Reboot" Type="Microsoft.OSDRefresh.RebootPage">
</Pages>

RadioGroup

Det här elementet anger en grupp med alternativknappar med i ett fältelement .

Elementinformation

Tabell 100 innehåller information om RadioGroup-elementet .

Tabell 100. RadioGroup-elementinformation

Attribut Värde
Antal förekomster Noll eller mer i ett Fält-element (det här elementet är valfritt.)
Överordnade element Fält
Innehåll Standard
Elementattribut

Tabell 101 visar attributen för RadioGroup-elementet och innehåller en beskrivning av var och en.

Tabell 101. Attribut och motsvarande värden för RadioGroup-elementet

Attribut Beskrivning
Låst Anger om gruppen med alternativknappar är aktiverad för användarindata. Attributet kan anges till:

- Sant. Anger att alternativknapparna är inaktiverade och att användarna inte kan välja en alternativknapp i gruppen.
- Falskt. Anger att alternativknapparna är aktiverade och att användarna kan välja en alternativknapp i gruppen.
Namn Anger namnet på alternativalternativgruppen.
Anmärkningar

Ingen.

Exempel

Ingen.

StageGroup

Det här elementet anger en distributionsstegsgrupp.

Elementinformation

Tabell 102 innehåller information om stagegroup-elementet .

Tabell 102. Elementinformation för StageGroup

Attribut Värde
Antal förekomster Ett eller flera i ett StageGroups-element
Överordnade element StageGroups
Innehåll Fas
Elementattribut

Tabell 103 visar attributen för stagegroup-elementet och en beskrivning av attributet.

Tabell 103. Attribut och motsvarande värden för StageGroup-elementet

Attribut Beskrivning
Displayname Anger det användarvänliga namnet på den fasgrupp som visas i UDI-guiden Designer. Det här namnet är vanligtvis mer beskrivande än attributet Namn .
Anmärkningar

Ingen.

Exempel

Ingen.

StageGroups

Det här elementet grupperar en uppsättning fasgrupper i en konfigurationsfil för UDI-guiden.

Elementinformation

Tabell 104 innehåller information om elementet StageGroups .

Tabell 104. Elementinformation för StageGroups

Attribut Värde
Antal förekomster Noll eller ett i ett guideelement
Överordnade element Guiden
Innehåll StageGroup
Elementattribut

Det här elementet har inga attribut.

Anmärkningar

Ingen.

Exempel

Ingen.

Setter

Det här elementet anger en egenskapsinställning för värdet för en egenskap som heter i egenskapen Egenskap .

Elementinformation

Tabell 105 innehåller information om Setter-elementet .

Tabell 105. Information om Setter-element

Attribut Värde
Antal förekomster Noll eller mer i varje överordnat element (det här elementet är valfritt.)
Överordnade element Data, DataItem, Page, Style, Task, Validator
Innehåll Innehåller ett strängvärde i egenskapsattributet
Elementattribut

Tabell 106 visar attributet för Setter-elementet och innehåller en beskrivning av det.

Tabell 106. Attribut och motsvarande värden för Setter-elementet

Attribut Beskrivning
Egenskap Anger det egenskapsnamn som anges. Egenskapsnamnet är inställt på det värde som det här attributet har parenteser.
Anmärkningar

Ingen.

Exempel

Ingen.

Fas

Det här elementet anger en fas i en StageGroup och innehåller ett eller flera PageRef-element .

Elementinformation

Tabell 107 innehåller information om elementet Stage .

Tabell 107. Information om faselement

Attribut Värde
Antal förekomster Ett eller flera i ett StageGroup-element
Överordnade element StageGroup
Innehåll Pageref
Elementattribut

Tabell 108 visar attributen för elementet Stage och innehåller en beskrivning av var och en.

Tabell 108. Attribut och motsvarande värden för faselementet

Attribut Beskrivning
Displayname Anger det användarvänliga namnet på den guidesida som visas i UDI-guiden Designer. Det här namnet är vanligtvis mer beskrivande än attributet Namn .
Namn Anger namnet på fasen. Värdet för det här elementet används när du startar UDI-guiden med kommandoradsparametern /stage: name .
Anmärkningar

Ingen.

Exempel

Ingen.

Format

Det här elementet grupperar de enskilda Setter-elementen som konfigurerar UDI-guidens utseende och känsla, inklusive rubriken som visas överst i guiden och banderollsbilden som visas i UDI-guiden.

Elementinformation

Tabell 109 innehåller information om elementet Style.

Tabell 109. Information om formatelement

Attribut Värde
Antal förekomster En
Överordnade element Guiden
Innehåll Setter
Elementattribut

Det här elementet har inga attribut.

Anmärkningar

Ingen.

Exempel
<Style>
  <Setter Property="bannerFilename">UDI_Wizard_Banner.bmp</Setter>
  <Setter Property="title">Operating System Deployment (OSD) Refresh Wizard</Setter>
</Style>

Uppgift

Det här elementet anger en aktivitet som ska köras på sidan som anges i det överordnade sidelementet .

Elementinformation

Tabell 110 innehåller information om elementet Aktivitet .

Tabell 110. Information om aktivitetselement

Attribut Värde
Antal förekomster Ett eller flera i ett aktivitetselement
Överordnade element Uppgifter
Innehåll ExitCodes, File, Setter
Elementattribut

Tabell 111 visar attributen för aktivitetselementet och innehåller en beskrivning av var och en.

Tabell 111. Attribut och motsvarande värden för aktivitetselementet

Attribut Beskrivning
DependsOn Anger om aktiviteten är beroende av en annan aktivitet. Värdet för det här attributet är inställt på attributet Namn för ett annat aktivitetselement . Observera: Det går inte att konfigurera det här attributet med hjälp av UDI-guiden Designer. Du kan dock lägga till det här attributet manuellt i ett aktivitetselement genom att direkt ändra .xml-filen.
Displayname Anger det användarvänliga namnet på uppgiften som visas i UDI-guiden Designer. Det här namnet är vanligtvis mer beskrivande än attributet Namn .
Namn Anger namnet på aktiviteten. Det här namnet måste vara unikt.
Typ Anger aktivitetstypen för aktiviteten som ska köras, vilket definieras i DLL-filen som innehåller aktiviteten.
Anmärkningar

Ingen.

Exempel

Ingen.

Uppgifter

Det här elementet grupperar en uppsättning uppgifter för ett sidelement .

Elementinformation

Tabell 112 innehåller information om elementet Uppgifter .

Tabell 112. Information om aktivitetselement

Attribut Värde
Antal förekomster Noll eller ett i varje sidelement (det här elementet är valfritt.)
Överordnade element Sida
Innehåll Uppgift
Elementattribut

Tabell 113 visar attributen för elementet Uppgifter och innehåller en beskrivning av var och en.

Tabell 113. Attribut och motsvarande värden för aktivitetselementet

Attribut Beskrivning
NameTitle Anger bildtext som visas överst i kolumnen som innehåller namnet på aktiviteterna på lämplig guidesida.
StatusTitle Anger bildtext som visas överst i kolumnen som innehåller status för aktiviteterna på lämplig guidesida.
Anmärkningar

Ingen.

Exempel

Ingen.

Validator

Det här elementet anger en validerare för fältkontrollen som anges i det överordnade fältelementet .

Elementinformation

Tabell 114 innehåller information om elementet Validator .

Tabell 114. Information om validatorelement

Attribut Värde
Antal förekomster Noll eller ett i ett fältelement
Överordnade element Fält
Innehåll Setter
Elementattribut

Tabell 115 visar attributet för elementet Validator och innehåller en beskrivning av det.

Tabell 115. Attribut och motsvarande värden för validatorelementet

Attribut Beskrivning
Typ Anger typen för validatorn, som definieras i den DLL som innehåller validatorn
Anmärkningar

Ingen.

Exempel

Ingen.

Guiden

Det här elementet anger roten för alla andra element.

Elementinformation

Tabell 116 innehåller information om elementet Guide .

Tabell 116. Information om guideelement

Attribut Värde
Antal förekomster En
Överordnade element Ingen
Innehåll DLL:er, sidor, mellangrupper, formatmallar
Elementattribut

Det här elementet har inga attribut.

Anmärkningar

Ingen.

Exempel
<Wizard>
   + <DLLs>
   + <Style>
   + <Pages>
   + <StageGroups>
</Wizard>