Användardriven installation – utvecklarhandbok

UDI (User Driven Installation) bidrar till att förenkla distributionen av Windows-klientoperativsystem®, till exempel Windows 8.1, till datorer som använder OSD-funktionen (Operating System Deployment) 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 omedelbart innan distributionen utförs. Det här beteendet gör att du kan skapa generiska OSD-aktivitetssekvenser och sedan tillhandahålla 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 guidesidredigerare för UDI Wizard 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 i guiden

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

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

Om den här guiden

Den här guiden innehåller nödvändig referensinformation för att hjälpa dig att anpassa UTI för din organisation. Den här guiden tar inte upp administrativa eller operativa ämnen, till exempel att installera MDT (som inkluderar UDI), konfigurera UDI för att distribuera operativsystem och program eller utföra distributioner med hjälp av UDI-guiden. Mer information om de ämnena finns i UDI-avsnitten 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. Vanligtvis 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äser.

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.

Figur 1 illustrerar förhållandet mellan UDI Wizard Designer och UDI Wizard.

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

Figur 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 i guiden. Du använder redigerare för guidesidor för att konfigurera beteendet för din anpassade guidesida. De anpassade guidens sidredigerare implementeras som DLL:er som UDI-guiden Designer läser. Du skapar guidesidredigerare med hjälp av:

    • WPF version 4.0

    • Microsoft Prism version 4.0

    • Microsoft Unity-programblock (Unity) version 2.1

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

    Dessutom använder UDI Wizard Designer konfigurationsfiler för guidesidredigeraren. Du skapar konfigurationsfilerna för guidens sidredigerare som en del av processen för att skapa anpassade guidesidor och anpassade sidredigerare i guiden. UDI-guiden skapar Designer 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 redigerare för guidesidor utför du följande steg för att förbereda UDI-utvecklingsmiljön:

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

  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ättningarna för UDI-utvecklingsmiljön

Utför följande steg för att förbereda förutsättningarna för UDI-utvecklingsmiljön:

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

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

Förbereda maskinvarukraven för UDI-utvecklingsmiljön

Maskinvarukraven för UDI-utvecklingsmiljön är samma maskinvarukrav för den utgåva av Microsoft Visual Studio som du använder. Mer information om de här kraven finns i systemkraven för respektive utgåva i Visual Studio-dokumentationen.

Förbereda programvarukraven för UDI-utvecklingsmiljön

UDI-utvecklingsmiljön har följande programvarukrav:

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

    Du behöver ett Windows-operativsystem som stöder den processorarkitektur som du vill utveckla för. Du kan utföra 32-bitars och 64-bitars UDI-utveckling med ett 64-bitars operativsystem. Du behöver bara utföra 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 stöds av Visual Studio 2010 finns i systemkraven för respektive 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 UDI-guidesidor)

  • 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 guide sidredigerare

    Obs!

    Exempelkällkoden för UDI Wizard Designer wizard page editors är skriven i C#. Installera C#-språket om du vill använda exempelkällkoden.

Konfigurera UDI-utvecklingsmiljön

När kraven för UDI-utvecklingsmiljön ä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 C++-språket och alla andra språk som WPF stöder.

    Obs!

    Exempelkällkoden för UDI Wizard Designer editor-sidorna är skriven 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 är en mapp som 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 Program Files, som inte kan skrivas till utan förhöjd behörighet. Genom att kopiera SDK-mappen till en annan plats kan du ändra filerna i SDK-mappen utan att förhöjda behörigheter krävs.

  5. Kopiera mappen installation_folder\Mallar\Distribution\Verktyg 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 den mapp som du skapade tidigare i processen).

    När det är klart ska mappstrukturen under local_folder se ut som den mappstruktur som illustreras i figur 2 (där local_folder är den mapp du skapade tidigare i processen och visas som UDIDevelopment i figuren).

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

    Figur 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 skapas 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 SamplePage Visual Studio-lösningen.

Så här kontrollerar du 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 går du till Prieskumník riešení, högerklickar på SamplePage-projektet och väljer sedan Egenskaper.

    Dialogrutan Egenskapssidor SamplePage visas.

  4. I dialogrutan Egenskapssidor för SamplePage går du till Konfigurationsegenskaper/Felsökning.

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

  6. I egenskaperna för felsökning, under Kommando, skriver du $(TargetDir)\OSDSetupWizard.exe.

  7. I egenskaperna för felsökning, under Arbetskatalog, skriver du $(TargetDir).

  8. I dialogrutan Egenskapssidor SamplePage går du till Konfigurationsegenskaper/Bygghändelser/Post-Build-händelse.

  9. Skriv följande i egenskaperna för händelsen efter kompilering, under kommandoraden:

    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 Egenskapssidor SamplePage 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 med information om att det inte finns någon felsökningsinformation 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 plats.

  16. Välj Avbryti guiden med exempelsidformuläret.

    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 guidesidredigerare för UDI-guiden Designer. Mer information om SampleEditor-projektet finns i Granska Visual Studio-lösningen SamplePage.

Så här kontrollerar du 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 den mapp som du skapade tidigare i processen).

  3. I Visual Studio 2010 går du till Prieskumník riešení och väljer projektet SampleEditor.

  4. I menyn Projekt 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). Markera 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 markerar filerna.

  7. I Prieskumník riešení går du till SampleEditor/References.

  8. Kontrollera att ingen av referenserna innehåller varningar eller fel.

  9. I Prieskumník riešení högerklickar du på SampleEditor-projektet och väljer sedan Egenskaper.

    Dialogrutan Exempelredigeringssidor visas.

  10. I dialogrutan SampleEditor-egenskapssidor väljer du fliken Felsök .

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

  12. I Starta externt program skriver du installation_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 (...) om du vill bläddra till mappen och välja UDIDesigner.exe.

  13. Välj Spara allaArkiv-menyn.

  14. Kopiera local_folder\SDK\SamplePage\SamplePage.dll.config-filen till mappen installation_folder\Bin\Config (där local_folder är den mapp du skapade på utvecklingsdatorn tidigare i konfigurationsprocessen ochinstallation_folder är den mapp 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. I UDI-guiden Designer väljer du Öppna i menyfliksområdet.

    Dialogrutan Öppna visas.

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

    Den Config.xml filen öppnas och den anpassade scengruppen visas i informationsfönstret.

  18. Välj fliken Konfigurera i informationsfönstret.

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

    • Knappen Olåst, med vilken du aktiverar eller inaktiverar rutan Plats

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

    • Eget visningsnamn som visas på sammanfattningssidan, där du anger bildtexten för informationen som visas på sammanfattningssidan

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

Innan du påbörjar utvecklingen granskar du exemplen i UDI SDK. Använd informationen i den här guiden och källkoden i exemplen för att skapa egna anpassade UDI-guidesidor och redigerare för guidesidor.

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 ger en kort beskrivning av var och en.

Tabell 1. Mappar i UDI SDK

Mapp Den här mappen innehåller
Ingår C++-huvudfilerna som krävs för att skapa anpassade guidesidor för UDI-guiden
Libs C++-biblioteksfilerna som kommer att länkas till din anpassade sida; Det finns 32-bitars- och 64-bitarsversioner av Static Link Libraries. Notera: Itanium-versionerna av biblioteken (IA-64) är inte tillgängliga.
SampleEditor (på engelska) Ett Visual Studio-projekt för att skapa en anpassad redigerare som används för att redigera sidan SamplePage i UDI-guiden Designer, som är skriven i C#
Exempelsida Ett Visual Studio-projekt för att bygga en anpassad UDI-guidesida, som är skriven i Visual C++

Granska Visual Studio-lösningen SamplePage

Innan du börjar skapa dina anpassade guidesidor och redigerare i guiden utför du följande uppgifter för att förbereda UDI-utvecklingsmiljön:

Granska livscykeln för guidesidor

En UDI-guidesida har metoder som motsvarar varje steg (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 måste åsidosätta och ger en kort beskrivning av varje metod, inklusive när du ska använda metoden i livscykeln för guidesidan.

Tabell 2. Metoder i livscykeln för en guidesida

Metod Beskrivning
OnWindowCreated Den här metoden anropas en gång efter att 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 för att 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 läser minnesvariabler, aktivitetssekvensvariabler eller miljövariabler och uppdaterar sedan sidan baserat på eventuella ändringar av dessa variabler.
OnCommonControlEvent Den här metoden kan anropas när som helst när guidesidan visas och tar emot ett WM_NOTIFY meddelande från en underordnad (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å urvals- eller dubbelklickshändelser för en TreeView-kontroll .
OnUnhandledEvent Den här metoden anropas när ett ohanterat fönstermeddelande visas 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. Vanligtvis 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 sida i guiden – till exempel verifiering 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 är dold när antingen föregående eller nästa sida i guiden visas.

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

Granska exemplet SamplePage

Granska SamplePage-exemplet med hjälp av följande lista, som representerar sekvensen av händelser under livscykeln för guidesidans livscykel för SamplePage-exemplet:

  1. UDI-guiden läser OSDSetupWizard.exe konfigurationsinformationen från konfigurationsfilen för UDI-guiden i exemplet (den 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-filen för den anpassade guidesidan.

  3. UDI-guiden visar den anpassade guidesidan och möjliggör önskad kontrollinteraktion enligt beskrivningen i steg 3: UDI-guiden visar den anpassade guidesidan.

  4. När informationen har samlats in på den anpassade guidesidan 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: Knappen Nästa är markerad på sidan i den anpassade guiden.

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 Config.xml-filen som konfigurationsfil. I MDT är standardkonfigurationsfilen UDIWizard_Config.xml-filen, som finns i mappen Skript i MDT Files-paketet för konfiguration.

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

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

  • DLL-element

  • Elementet Format

  • Elementet Sidor

  • Elementet StageGroups

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

    UDI-guiden genomsöker DLL-elementet och letar efter de .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 Verktyg\plattform (där plattform är x86 för 32-bitarsversionen eller x64 för 64-bitarsversionen).

    UDI-guiden genomsöker sidelementet och letar efter de sidor som definieras. I exemplet definieras två sidor: Custom och SummaryPage. Attributet Type för Page-elementet definieras i filen PageClassIDs.h och definierar unikt typen av din anpassade sida.

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

  • Organisationens namn i stället för Microsoft.

  • Ditt projektnamn i stället för SamplePage.

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

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

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

Funktionen RegisterFactories används för att registrera fabriksklassen på guidesidan 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 den klassen till klassfabriksregistret för UDI-guiden, vilket gör fabriksklassen tillgänglig för guiden. UDI-guiden söker efter en fabriksklass som är registrerad med ett ID som matchar attributet Type för elementet Page för den anpassade guidesidan.

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

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

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

Obs!

Exemplet innehåller och registrerar endast den enda anpassade guidesidan. Exemplet innehåller inte anpassade uppgifter eller validerare och registrerar därför inga 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 innehåller många av de funktioner som en sida har. Alla guidesidor ska härledas från mallklassen WizardPageImpl, som implementerar IWizardPage-gränssnittet. 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, se Hjälpklasser för guidesidor

  • Gränssnitt för guidens sidmallsklasser, se Gränssnitt på guidesidor

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

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

  • OnWindowCreated. Metoden OnWindowCreated på exempelguidesidan anropar följande metoder:

    • Lägg tillFält. Den här metoden relaterar IDC_COMBO_LOCATION boxkontrollen i den IDD_LOCATION_PAGE resursen med dataelementetLocation i den Config.xml filen.

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

      Obs!

      Se till att du anropar AddField-, AddRadioGroup- eller AddToGroup-metoden innan du anropar InitFields metoden.

    • InitFields. Använd den här metoden för att initiera fälten (kontrollerna) som du har lagt till i formuläret. Sidans pekare är en parameter. I exemplet överförs pekaren , som refererar till den aktuella sidan.

      Obs!

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

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

      Metoden OnWindowCreated konfigurerar formulärkontrollanten med hjälp av IFormController-gränssnittet. Mer information om hur du konfigurerar formulärkontrollanten finns i Ställa in formuläret.

  • InitLocations. Med den här metoden fylls kombinationsrutan i från listan över platser i den Config.xml filen. Dataelementet och de underordnade DataItem-elementen i Confg.xml-filen ger en lista med möjliga värden.

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

    • Uppdateringar TSLocation-aktivitetssekvensvariabeln med värdet valt i kombinationsrutan med metoden SaveFields

    • Lägger till information som ska visas på sammanfattningssidan med metoden Spara fält

Steg 4: Knappen Nästa är markerad på sidan i den anpassade guiden

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

För den anpassade exempelsidan i guiden implementeras åsidosättningen för metoden OnNextSelected i filen LocationPage.ccp. I metoden OnNextSelected på sidan för det anpassade exempelguiden anropas följande metoder:

  1. InitSection. Denna metod initierar huvudet (etikett bildtext) för sammanfattningsdata som visas på sammanfattningssidan. Vanligtvis kan du ange det här värdet med hjälp av funktionen DisplayName(). Data som är kopplade till den här bildtexten sparas med metoden SaveFields.

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

Granska Visual Studio-lösningen SampleEditor

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

Granska UDI-guiden Designer Architecture

UDI Wizard Designer utvecklades 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 Page-element för varje sida i guiden.

När du redigerar konfigurationsinställningarna för en guidesida läser UDI-guiden Designer in den anpassade sidredigerare som motsvarar guidesidtypen. De anpassade sidredigerarna i guiden är utvecklade 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 (användargränssnittet; presentationen) från de data som presenteras. Data är en fasad över Page-elementet i konfigurationsfilen för UDI-guiden (Config.xml-filen i exemplet), som nås med hjälp av egenskapen CurrentPage i IDataService-gränssnittet.

UDI-guiden Designer använder DependencyAttribute för att få åtkomst till DataService klassen baserat på ramverket för beroendeinmatning 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 på 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. Men för andra konfigurationsinställningar måste du tillåta att dessa konfigurationsinställningar ändras med hjälp av UDI-guiden Designer.

Vanligtvis sparas de konfigurationsinställningar som du vill konfigurera med hjälp av UDI-guiden Designer i konfigurationsfilen för UDI-guiden (den 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 används i programidentifieringsaktiviteten och sidtypen ApplicationPage-guide .

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

  • Fält. Med användningsfält kan användare 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 i guiden måste tillhandahålla en metod för att redigera fältkonfigurationsinställningarna för fältet med hjälp av FieldElementControl.

  • Egenskaper. Uppsättningsmetoder hjälper dig 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 set-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.

  • Uppgifter. Data används för att lagra information som ska användas av guidesidan och andra komponenter. Du kan definiera data för sidor eller fält med elementen Data eller DataItem . Data kan definieras i en platt eller hierarkisk struktur genom korrekt användning av elementen Data eller DataItem . Den Config.xml i exemplet i SDK:n visar hur du skapar platta datastrukturer.

    Den anpassade sidredigeraren i guiden som du skapar måste kunna hantera de här konfigurationsinställningarna.

Granska exemplet med EditorPage

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

  • Användargränssnitt för att konfigurera inställningar 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 läses från och sparas 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 SampleEditor-guidens sidredigerare läses in och initieras i UDI-guiden Designer enligt beskrivningen i Granska guidens sidredigerare Inläsning och initiering.

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

  3. Granska användargränssnittet som används för att lägga till eller redigera platser i listan i AddEditLocationView.xaml- och AddEditLocationView.xaml.cs-filerna 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.

Inläsning och initiering av sidredigeraren i Granskningsguiden

Anpassade sidredigerare i guiden läses in efter behov av UDI-guiden Designer. UDI-guiden Designer konfigurationsfiler läses in när UDI-guiden Designer startar. UDI-guiden genomsöker Designer 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 SamplePage.dll.confg-filen till mappen install_folder\Bin\Config. När du startar UDI-guiden Designer hittas och läses SamplePage.dll.confg-filen in.

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

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

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

  • Typ. 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 skapas av UDI-guiden Designer.

  • Beskrivning. Använd det här attributet när du vill 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 av anpassad guidesida Microsoft.SamplePage.LocationPage, som sparas i Config.xml-filen. Den Config.xml filen finns i mappen local_folder\SDK\SamplePage\SamplePage (där local_folder är den mapp som du skapade på utvecklingsdatorn tidigare i konfigurationsprocessen).

Granska det användargränssnitt som används för att konfigurera kombinationsrutan för position

När guidens sidredigerare läses in och initieras läses SampleEditor-guidens sidredigerare in när en sida med en typ av Microsoft.SamplePage.LocationPage redigeras. Användargränssnittet för sidredigeraren lagras i filen LocationPageEditor.xaml.

Om du undersöker användargränssnittet på fliken Design och koden på XAML-fliken kan du se förhållandet 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 FieldElementControl-kontrollen .

Bindningsparametrarna i XAML-filen binder fälten på exempelsidans redigerare med informationen i konfigurationsfilen för UDI-guiden. Följande kod kopplar till exempel textrutan Standardvärde med elementet Default i konfigurationsfilen för UDI-guiden (Config.xml i exemplet):

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

Mer information finns i Så här gör du 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 kontrollen CollectionTControl för att visa rutnätsvyn och binda rutnätsvyn till dataelementet med namnet Location 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 sammanhangsberoende 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 snabbberoende meny. Menyfliksområdet har motsvarande knappar som gör att du kan utföra samma uppgifter. Kontrollelementet Views:CollectionsTControl i filen LocationPageEditor.xaml definierar de metoder som anropas baserat på den åtgärd som vidtas och de egenskaper som du anger enligt följande:

  • SelectedItem. Den här databundna egenskapen aktiveras när användaren väljer ett objekt i listan. Den här egenskapen är kopplad till egenskapen CurrentLocation i vymodellen, som finns i LocationPageEditorViewModel.cs-filen och används av kontrollen CollectionTControl för att skicka det markerade objektet 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 sammanhangsberoende 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 LocationPageEditorViewModel.cs-filen 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 sammanhangsberoende menyn. Det finns en databindning till en egenskap i vymodellen som returnerar EditLocationAction-objektet . 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 sammanhangsberoende 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 fönstermetoden ShowDialogWindow i LocationPageEditorViewModel.cs-filen.

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

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

    • En rubrik som du konfigurerar med hjälp av attributet DialogTitle för dialogramen

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

    • En Avbryt-knapp som anger returstatusen för egenskapen Godkänd till False (Returstatusen kontrolleras i metoden AddLocationCallback i LocationPageEditorViewModel.cs-filen 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 attributet Content

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

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

Konfigurationsinformationen för din anpassade guidesida lagras i konfigurationsfilen för UDI-guiden, som är:

  • Config.xml filen i exemplet med UDI SDK (Den här filen innehåller endast konfigurationsinställningarna för exemplet.)

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

    I exemplet med SampleEditor hjälper rutinen Platser till att hantera konfigurationsinformationen och finns i den LocationPageEditorViewModel.cs filen. Rutinen Platser returnerar en lista över platserna från konfigurationsfilen för UDI-guiden. Mer specifikt innehåller den returnerade listan 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 UDI-guidesidor är följande:

  1. Gör en kopia av SamplePage-lösningen som en startpunkt.

  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äsa 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 OnWindowShowed ), inklusive följande steg:

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

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

  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 minnesvariabler, aktivitetssekvensvariabler, miljövariabler eller XML-filinformation.

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

  7. Skapa lösningen.

    Se till att den version av DLL som du skapar är samma processorplattform som installationen av MDT – mer specifikt 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å såväl 32-bitars som 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 för Windows PE som du planerar att använda.

  8. Kopiera DLL-filen för sidan i den anpassade guiden 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).

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

Skapa anpassade sidredigerare i guiden

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

  1. Gör en kopia av SampleEditor-lösningen som en startpunkt.

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

  3. Lägg till instanser av kontrollen FieldElementControl som krävs av den sida i guiden som ska konfigureras (om det behövs).

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

  5. Lägg till instanser av kontrollen CollectionTControl som krävs av den sida i guiden 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å de konfigurationsinställningar som ska konfigureras med hjälp av din anpassade guidesidredigerare.

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

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

  10. Skapa lösningen.

    Obs!

    Kontrollera att den version av DLL-filen som du skapar är samma processorplattform som MDT-installationen. Om du till exempel installerar 64-bitarsversionen av MDT bygger 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 guidesidans redigerare finns i DesignerMappings-elementet , 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 den mapp där du installerade MDT-versionen).

  13. Kopiera DLL-filen för din anpassade guidesidredigerare 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-filen med UDI-guiden Designer aktivitetsbiblioteket genom att skapa en UDI-guide Designer konfigurationsfil (.config fil) och placera den i mappen installation_folder\Bin\Config (där installation_folder är den mapp 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 guidesidorna, uppgifterna och validerarna i DLL-filen.

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

  2. Skriv kod som registrerar fabriken för anpassad uppgiftsklass i fabriksregistret.

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

    Obs!

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

  4. Skapa ett aktivitetselement under elementet TaskLibrary i konfigurationsfilen för UDI-guiden Designer 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 ska innehålla parametern BitmapFilename . Ange alla andra parametrar som aktiviteten 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 den mapp där du installerade MDT).

  6. Kopiera DLL-filen för den anpassade uppgiften 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-validerare

UDI-validerare är DLL:er skrivna i C++ som implementerar IValidator-gränssnittet . Du registrerar DLL-filen med UDI-guiden Designer valideringsbiblioteket 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 till klassen BaseValidator och implementerar följande metoder:

    • Init(IControl *pControl, IWizardPageContainer *pContainer, IStringProperties *pProperties). Formulärkontrollanten anropar Init-medlemmen för att initiera valideraren. Den här metoden måste anropa metoden Init för klassen BaseValidator . Den läser vanligtvis alla egenskaper som angetts för valideraren från konfigurationsfilen för UDI-guiden. 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å IsValid-metoden 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 ta bort dem).

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

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

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

    Obs!

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

  4. Skapa ett valideringselement under elementet ValidatorLibrary i konfigurationsfilen för UDI-guiden Designer 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 den mapp där du installerade MDT).

  6. Kopiera DLL-filen för den anpassade uppgiften 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).

Referensinformation för UDI-guiden

Komponenter för guidesida

Du kan använda någon av flera färdiga 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 är registrerade med ett fabriksregister med hjälp av en sträng som nyckel till fabriken. Komponenten WmiRepository identifieras till exempel av strängen "Microsoft.Wizard.WmiRepository", som är tillgänglig i IWmiRepository-huvudfilen som ID_WmiRepository.

Om vi antar att du har skrivit din sida som en underklass till 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 Components

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

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

Tabell 3. Komponent-ID:n

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 upptäcka vilka programvaruobjekt som är installerade på datorn
ID_BackgroundTask (IBackgroundTask, IWizardComponent) Kan användas för att köra en uppgift i en annan tråd
ID_CopyFilesTask (ITask, IWizardComponent) En uppgift för att kopiera en eller flera filer
ID_FormController (IFormController) Du behöver helst inte skapa en instans själv, eftersom din sida får en egen instans
ID_InvalidCharactersValidator (IValidator) Säkerställer att inget textfält innehåller tecken från en lista som tillhandahållits valideraren
ID_Logger (ILogger) Du vill helst inte behöva skapa en instans själv, eftersom din sida får en pekare till den delade instansen
ID_NonEmptyValidator (IValidator) En validerare som ser till att inget fält är tomt
ID_PasswordValidator (IValidator) En validerare som säkerställer att inte två textfält har samma innehåll
ID_Regex (IRegEx) Utvärderar reguljära uttryck och söker efter matchningar
ID_RegExValidator (IValidator) En validerare som validerar mot ett reguljärt uttryck eller ett känt mönster
ID_SimpleStringProperties (IStringProperties, ISimpleStringProperties) Tillhandahåller ett enkelt sätt att skicka egenskaper för aktiviteter 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 (IXmlDokument) Skapar 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 služba Active Directory® Domain Services (AD DS)
ID_CpuInfo (ICpuInfo) Avgör om processorn är 32 eller 64 bitars
ID_DomainJoinValidator (IDomainJoinValidator) Har några metoder för att kontrollera om en uppsättning autentiseringsuppgifter tillåts för att 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 (istället för trådlöst) nätverkskort

Komponenter för kontroll

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

Tabell 6. Komponenter

Typer av dialogrutekontroller 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 kontrollera aktiverat och synligt läge
CONTROL_LIST_VIEW (IListView) En fasad som ger tillgång 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 alternativknappkontroller
CONTROL_STATIC_TEXT (IStaticText) En fasad som ger läs-/skrivbehörighet till texten i en kontroll, till exempel en etikett eller en textruta
CONTROL_TREE_VIEW (ItreeView) En fasad för att arbeta med en trädvykontroll

Komponenten Bildlista

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

FormController-komponent

Guiden skapar den här komponenten och skickar den till sidan. Du kommer åt den från sidan med hjälp av formulärmetoden , 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 letar efter en enda egenskap (ett Setter-element i .config-filen) med namnet InvalidChars, vilket är en lista med tecken som inte är tillåtna. Den kontrollerar tecknen i en textruta; Om texten innehåller tecken från den här listan rapporterar komponenten fel.

NonEmptyValidator-komponenten

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.

Komponenten PasswordValidator

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 inställningar ä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 lösenordskontrollen . På så sätt, om formulärkontrollanten inaktiverar lösenordskontrollen , inaktiverar den även kontrollen Bekräfta lösenord . Lägg sedan till en lösenordsvaliderare i formuläret. Slutligen ger du lösenordsvalideraren gränssnittet till 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.

Komponenten RegExValidator

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 set-inställning med namnet NamedPattern som är inställd på något av värdena i tabell 7.

Tabell 7. Namngivna mönsterställare

Mönster Beskrivning
Användarnamn Verifierar att texten antingen kommer från formuläret domän\användare eller user@domain
ComputerName (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 teckenuppsättning (till exempel =, + och ?)

FactoryRegistry-komponent

Denna komponent håller reda på alla klassfabriker och tjänster. Den implementerar IFactoryRegistry-gränssnittet och är tillgängligt indirekt via sidans Container metod. Dessutom läser registret in tilläggs-DLL:er. När en DLL-fil har lästs in söker registret efter en exporterad funktion med namnet RegisterFactories. Du måste implementera den här funktionen och i den registrera klassfabrikerna för dina sidor, uppgifter och validerare (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);
}

Logger-komponent

Den här komponenten är tillgänglig för din sida via loggningsmetoden (implementerad av WizardPageImpl). Den här metoden använder du 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 din sida med hjälp av Container()->Properties(). Minnesvariabler är användbara för att skicka tillfälliga data mellan olika sidor.

TSVariableBag- och TSRepository Components

Med TSVariableBag-komponenten kan du läsa och skriva aktivitetssekvensvariabler. Värdena sparas i minnet tills användaren väljer Slutför (standard). Du kan komma åt TSVariable-påsen via sidans TSVariables-metod (implementerad av basklassen WizardPageImpl ). De här komponenterna 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 IWmiRepository-gränssnittet . Den här komponenten returnerar resultatposter via IWmiIterator-gränssnittet .

Hjälpklasser för guidesidor

Du kan skapa anpassade UDI-guidesidor med hjälp av inbyggda hjälpklasser som medföljer UDI SDK. I tabell 8 visas 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 i fabriksregistret.
Klass för gränssnittsmall 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ägen Den här klassen innehåller vanliga fil-/katalogåtgärder.
Klass för pekarmall Den här klassen innehåller referensräkning för livslängdshantering i COM-komponenter. Det är viktigt att släppa gränssnitten 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 IUnknown-gränssnittet. För alla andra gränssnitt använder du mallklassen Pekar.
StringUtil Helper-klass Den här klassen tillhandahåller hjälpmetoder som gör det enklare att arbeta med strängar.
Undergränssnittsmallklass Den här basklassen gör det enklare att implementera en komponent som stöder ett gränssnitt som i sig ärver från ett annat gränssnitt.
Mallklass för UnknownImpl Den här klassen hanterar de flesta detaljer för att skapa en COM-komponent.
Mallklassen WizardComponent Den här basklassen används för att skapa komponenter som behöver åtkomst till guidetjänsterna, till exempel skapa och logga komponenter.
Mallklassen WizardPageImpl 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 i 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å exempelsidan i guiden som används för att definiera klassfabriken för sidan.

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

Klass för gränssnittsmall

Använd den här mallklassen när du vill skapa en komponent som implementerar mer ä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 (som råkar vara IWizardPage).

Hjälpklass för sökvägen

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 den instansreferens som du anger för den här metoden:

static inline std::wstring GetDirectoryName(LPCWSTR fullName)

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

static inline std::wstring GetFileName(LPCWSTR fullName)

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

Klass för pekarmall

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änssnitten när du är klar med dem. Microsoft tillhandahåller en mallklass som hanterar livslängden automatiskt. Om du till exempel vill använda en smart pekare för ett XML-gränssnitt kan du skriva ungefär så här:

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 smartpekare via ett annat samtal. Operatorn & släpper alltid ett befintligt gränssnitt om det innehåller ett och returnerar adressen till den interna pekaren. När du har hämtat en sådan pekare 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 för pekareQueryInterface för att hämta andra gränssnitt åt dig. Till exempel, när fabriksregistret skapar en ny instans av en komponent, har det kod så här:

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

Den första raden anropar QueryInterface i bakgrunden för att begära IWizardComponent-gränssnittet . 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 IUnknown-gränssnittet . För alla andra gränssnitt använder du mallklassen Pekar .

StringUtil Helper-klass

Den här klassen definieras i Utilities.h och tillhandahå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 samtidigt som skiftläge ignoreras (se tabell 9).

Tabell 9. StringUtil Helper-klass

Returer Beskrivning
0 Strängmatchning, 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)

De här metoderna påminner lite om Microsoft .NET Format-metoderna på så sätt att parametrarna är i formatet .{0} Men de utför inte någon 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 sträng så att du inte behöver allokera minne för strängar eller buffertar själv.

Undergränssnittsmallklass

Den här basklassen gör det enklare att implementera en komponent som stöder ett gränssnitt som i sig ä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.

Mallklass för UnknownImpl

Den här klassen definieras i UnknownImpl.h och hanterar de flesta detaljerna för 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.

Mallklassen WizardComponent

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 skapa och logga komponenter.

Så här definieras till exempel komponenten CopyFilesTask :

classCopyFilesTask :public WizardComponent<ITask>
{
    ...

Parametern för den här mallklassen är det "huvudgränssnitt" som du vill använda för komponenten, vilket när det gäller uppgifter är ITask. Att använda WizardComponent innebär att komponenten stöder både det gränssnitt 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.

Mallklassen WizardPageImpl

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

Gränssnitt för guidesidor

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 IStaticText-gränssnittet . Smarta pekare anropar automatiskt COM Release() -metoden när de hamnar utanför omfånget eller om du skickar adressen till 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 password, LPCTSTR domain)

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

Tabell 10. HResultValidLogon

HResult Beskrivning
S_OK Autentiseringsuppgifterna är giltiga
S_FALSE Autentiseringsuppgifterna är inte giltiga
E_FAIL Det gick inte att hitta domänkontrollanten. Mer information finns i loggarna
HRESULT HasAccess(LPCTSTR-användarnamn, LPCTSTR-lösenord, LPCTSTR-domän, LPCTSTR-datornamn, LPCTSTR-kontoDomän)

Den här metoden verifierar om en uppsättning autentiseringsuppgifter har läs-/skrivbehörighet till datorobjektet i AD DS, vilket visas i 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.

IBakgrundUppgiftsgrä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 i 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 IBackgroundTask.h-gränssnittet.

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

Det här gränssnittet initierar komponenten, som visas i tabell 12.

Tabell 12. HRESULT Init

Parameter Beskrivning
pTask Pekare till den klass som innehåller den kod som du vill köra på en annan tråd
Id Ett tal som du kan använda i motringningens Finished metod för att avgöra vilken aktivitet som har körts. Användbart om du startar flera aktiviteter med samma motringningsmetod
pCallback En klass som implementerar Finished metoden, som anropas när en aktivitet har körts. anropet till metoden Finished finns i bakgrundstråden, inte i användargränssnittstråden
void start(void)

Den här metoden startar aktiviteten på en bakgrundstråd och returnerar elementen som visas i tabell 13.

Tabell 13. Returnera bakgrundstråd

Returer Beskrivning
E_INVALIDARG Aktiviteten har redan körts, så du kan inte starta den just nu.
E_FAIL Det gick inte att starta tråden.
S_OK Tråden startades.
BOOL Running()

Den här metoden returnerar SANT om bakgrundsaktiviteten körs och FALSKT 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 avslutar tråden som körs (se tabell 14 och tabell 15). Det kan ta en stund att slutföra processen efter att den här metoden har återvänts.

Tabell 14. HRESULT Avsluta slutkod

Parameter Beskrivning
exitCode Den slutkod som skickas till den färdiga motringningsmetoden, som också är tillgänglig från GetExitCode metoden.

Tabell 15. Koder för uppsägning

Returer 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 få resultatet av att köra aktiviteten på bakgrundstråden (se tabell 16).

Tabell 16. Resultatkoder

Parameter Beskrivning
pCode Pekare till ett DWORD som anges till return 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 körningsmetod eller värdet som skickas till avslutsmetoden om du anropade den metoden.
pHresult Pekare till ett HRESULT som anges till return eller nullptr om du inte behöver HRESULT-värdet .
HRESULT Close(void)

Den här metoden frigör bakgrundstråden. Den returnerar E_INVALIDARG om tråden körs för närvarande och S_OK annars.

ICheckBox-gränssnitt

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

Ange kryssrutans markerade status. När metoden är TRUE är kryssrutan markerad. När metoden är FALSKT avmarkeras kryssrutan.

BOOL IsButtonChecked()

Den här metoden rapporterar den aktuella kontrollstatusen 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älp av 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 IBindableList-gränssnittet . Listrutan initierar innehållet med beskrivningarna från den här listan.

HRESULT Select(int index)

Markera objektet i kombinationsrutan i indexet.

int Selected(void)

Den här metoden returnerar indexet för det markerade objektet, eller -1 om ingenting är markerat.

void Add([in] LPCTSTR bildtext)

Lägga 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älp av hjälpfunktionen GetControlWrapper med typen CONTROL_GENERIC.

HRESULT SetEnable(BOOL enable)

Aktivera eller inaktivera kontrollen.

BOOL IsEnabled(void)

Returnerar SANT om kontrollen är aktiverad och FALSKT om den inte är det.

HRESULT SetVisible(BOOL visible)

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-bitars dator returnerar den här metoden SANT, eftersom den bara rapporterar bredden på processorn (inte operativsystemet).

IDirectory Interface
__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 ID_Directory, fungerar som en fasad för att arbeta med kataloger i filsystemet.

BOOL FileExists(LPCWSTR-namn)

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

BOOL FindFirst([in] LPCWSTR-namn)

Den här metoden hittar en första träff för namnet du anger. Det har stöd för jokertecken och returnerar både fil- och katalognamn. Metoden returnerar SANT om en matchning hittades, annars FALSKT.

HRESULT FoundName([out, retval] LPBSTR name)

Med den här metoden hämtas namnet på filen som hittas med ett anrop till FindFirst eller FindNext.

DWORD FoundAttributes(void)

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

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

Sök efter nästa. Den här metoden returnerar SANT om en annan matchning hittades, annars FALSKT.

void FinishFind(void)

Den här metoden frigör resurser som används för sökningen.

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 får en instans av det här gränssnittet med hjälp av ID_DomainJoinValidator värdet 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 sidan via sidans Logger-metod
pContainer Skickar resultatet från sidans Container-metod
pUsername Textrutan som innehåller det användarnamn 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 kommer att anslutas till domänen
HRESULT IsUsernameValid(LPCWSTR domainName)

Den här metoden använder IADHelper-ValidLogon> metoden för att utföra arbetet. Se den metoden för mer information.

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 kan du kontrollera 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 SetWhereClause(LPCTSTR whereClause)

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

Ange principen Minimera enhetsstorlek i byte för enheter som ska returneras från frågan.

HRESULT Update(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 section, 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 Update. 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, representerad som en sträng
DISKQUERY_DISKPARTITION DiskIndex (på engelska) Disknumret som ett heltal med början på 0
DISKQUERY_LOGICALDISK Volymnamn Volymetiketten
size_t Antal(void)

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

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

Den här metoden hämtar värdet för en egenskap från frågeresultaten, som visas i tabell 19.

Tabell 19. HRESULT GetProperty

Parameter Beskrivning
Index Nollbaserat index till resultatposten
propName Egenskapens namn, 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 bildtexter för en post som är samma som egenskapen Caption.

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 hanteras av den här komponenten. Anropa den här metoden endast en gång.

HImageList GetImageList(void)

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

int AddImage(HInstance hInstance, int resourceId)

Lägg till en ny bild i avbildningslistan från en resurs, som du ser i tabell 20.

Tabell 20. HRESULT IImageList-gränssnitt

Parameter Beskrivning
hInstans 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älp av hjälpfunktionen GetControlWrapper med typen CONTROL_LIST_VIEW.

int AddItem([i] LPCTSTR text)

Lägg till en ny rad i listrutan. Metoden returnerar indexet för det objekt som nyss lagts till.

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

Lägg till en ny kolumn i listvyn.

HRESULT SetSubItem(int index, int kolumn, [i] LPCTSTR text)

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

Tabell 21. HRESULT SetSubItem

Parameter Beskrivning
Innehållsförteckning Indexet för det listobjekt som du vill ändra
kolumn Indexet för kolumnen som du vill uppdatera. Den första kolumnen anges med AddItem, kolumn två och följande anges med den här metoden
Texten textas 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 det listvyobjekt som för tillfället är valt.

HRESULT SelectItem(int index)

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

BOOL IsItemChecked(int index)

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

int GetItemCount(void)

Den här metoden returnerar antalet objekt i listvyn.

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

Skapa en ny bildlista och koppla den till 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 visst listvyobjekt.

HRESULT Clear(void)

Ta bort alla objekt från listvyn.

IProgressBar Interface

__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älp av 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örloppsindikatorer® ett maxintervall på 100.

int GetPercentage(void)

Den här metoden returnerar den aktuella positionen för förloppsindikatorn.

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

Detta gränssnitt implementeras av komponenten RadioButtonWrapper . Du hämtar en instans av den här komponenten med hjälp av hjälpfunktionen GetControlWrapper med typen CONTROL_RADIO_BUTTON.

void SetGroup(int firstId, int lastId)

Förse omslaget med det urval av alternativknappar som ska hanteras som en grupp. Anropa denna metod innan du anropar CheckRadio.

void CheckRadio(int id)

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

BOOL IsButtonChecked(int id)

Den här metoden returnerar SANT om alternativknappen för närvarande är markerad, annars FALSKT.

void EnableRadio(int id, BOOL enable)

Den här metoden aktiverar eller inaktiverar en alternativknapp.

IStaticText Interface

__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älp av 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 på 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å preflight-sidan eller om du vill använda komponenten BackgroundTask för att utföra arbete med 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 preflight-sidan 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 set-värdena, medan parametern pTaskSettings ger åtkomst till Task-elementet och underordnade. De flesta uppgifter behöver bara läsa data från parametern pProperties .

Verkställ
HRESULT Execute(LPDWORD pReturnCode)

Det är här du skriver koden som utför uppgiften. Den här metoden ska returnera S_OK om det inte uppstod några fel och kan även returnera ett annat HRESULT om ett fel uppstod medan aktiviteten kördes. Andra värden än S_OK som den här metoden returnerar matchas med <felelement> i <avsnittet ExitCodes> om du använder preflight-sidan.

Parametern pReturnCode måste uppdateras med ett tal som rapporterar aktivitetens tillstånd. Dessa värden matchas av preflight-sidan med <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älp av hjälpfunktionen GetControlWrapper med typen CONTROL_TREE_VIEW.

void EnableCheckboxes(void)

Med den här metoden aktiverar du kryssrutor i trädvyn genom att ange TVS_CHECKBOXES-formatet .

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

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

int AddImage(HINSTANCE hInstance, int resourceId)

Lägg till en bild i avbildningslistan från en resurs (resourceId) i modulen med instansreferensen 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 handtaget för det överordnade objektet där du vill att det nya objektet ska läggas till. Den här metoden returnerar handtaget till det nya objektet.

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

Ange den bild som ska användas för ett trädvyobjekt. Du kan ställa in både normal och expanderad bild.

void Clear(void)

Ta bort alla objekt från trädvyn.

BOOL SetFirstVisible(HTREEITEM item)

Kontrollera att trädvyn är synlig. Trädvyn rullar om det behövs för att göra 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 säkerställa att det nyligen markerade objektet är synligt.

void CheckItem(HTREEITEM item, UINT checkState)

Metoden ställer i princip in bilden som kommer att visas för kryssrutan i trädvyn. Dessa bilder finns i en separat ImageList-kontroll som hanteras i trädvyn. Som standard innehåller den här bildlistan tre bilder, som visas i tabell 22.

Tabell 22.void CheckItem Image List Default

checkState Beskrivning
0 Tom
1 Rensas
2 Valda
HTREEITEM SelectedItem(void)

Denna metod returnerar handtaget på det trädvyelement som för närvarande är valt.

int SetItemHeight(SHORT height)

Den här metoden anger höjden för alla objekt i trädvykontrollen i bildpunkter. Den returnerar den tidigare höjden i bildpunkter.

HRESULT EnableItem(HTREEITEM-objekt, BOOL-aktivering)

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

void Expand(HTREEITEM hItem, BOOL expand)

Med den här metoden expanderar eller komprimerar du en nod i trädet.

HTREEITEM GetChild(HTREEITEM hParent)

Den här metoden returnerar det första underordnade värdet till ett trädvyelement eller NULL om det inte finns några underordnade objekt.

HTREEITEM GetParent(HTREEITEM hNode)

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

HTREEITEM GetNextItem(HTREEITEM hPrevious)

Du kan anropa den här metoden med en referens som GetChild returnerar för att iterera genom alla underordnade noder. Den här metoden returnerar nästa objekt på samma nivå i trädet som har samma överordnade sida.

UINT IsChecked(HTREEITEM item)

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

BOOL IsEnabled (HTREEITEM item)

Den här metoden returnerar SANT om trädvynoden är aktiverad, annars FALSKT.

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

Denna metod är endast för internt bruk.

HRESULT SetEventHandler(ITreeViewEvent *pEventHandler)

Anropa denna metod om du vill få ett meddelande när det valda objektet ändras eller användaren ändrar kontrollstatus för ett trädvyobjekt. Du måste implementera ITreeViewEvent i komponenten för att ta emot dessa motringningar.

void SetSelectedBackColor(COLORREF color)

Ange bakgrundsfärgen som ska användas 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, som visas i tabell 23.

Tabell 23. HRESULT Next(void) Query Returns

HRRESULT Beskrivning
S_OK Flyttade till nästa resultat; kan du använda GetProperty för att hämta egenskaper för 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)

Med den här metoden hämtas värdet för en egenskap från den aktuella resultatposten, som visas i 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 Result

HRESULT Beskrivning
S_OK Egenskapsvärdet har hämtats.
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. De värden som listas ä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 query, [out] IWmiIterator **ppIterator)

Kör en fråga mot WMI-namnområdesuppsättningen med ett anrop till SetNamespace, som visas i 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 tillgång till frågeresultaten

Tabell 27. HRESULT-frågeresultat

HRESULT Beskrivning
S_OK Frågan lyckades
Övrigt Om frågan inte lyckas returneras 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 denna kontrollant för att ansluta fältdata i den .config XML-filen till kontrollerna på bladet. Formulärkontrollanten hanterar sedan många av detaljerna åt dig.

Skapa formuläret

Vanligtvis konfigurerar du formulärkontrollanten i sidans OnWindowCreated-metod . Det innebär vanligtvis att man anropar de metoder som visas i tabell 28.

Tabell 28. OnWindowCreated-metoden

Metod Beskrivning
Init Initierar formulärkontrollanten
Lägg till fält Skapar 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 Tillåter underordnade kontroller som aktiveras eller inaktiveras tillsammans med deras överordnade eller baserat på vilken alternativknapp som är markerad
InitFields Anropa när du har anropat alla Add metoder för att konfigurera formuläret
Verifiera Utför den första verifieringen
Bearbeta formulärhändelser

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

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

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

Spara formulärdata

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

Tabell 29. Metoden OnNextSelected

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

Vanligtvis anropar du 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 (på engelska)
HRESULT SetPageInfo(ISettingsProperties *pPageInfo)

Den här metoden kallas internt och du bör inte anropa den själv. Det ger sidans XML till formulärkontrollanten.

Verifiera
HRESULT Validate(void)

Med den här metoden körs alla validerare 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)

Med den här metoden läggs kontrollen till som underordnad en kryssruta eller alternativknapp, så som visas i tabell 30. Alla sådana underordnade kontroller inaktiveras när den överordnade kontrollen inte är vald. Metoden returnerar alltid S_OK.

Tabell 30. AddToGroup

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

Den här metoden uppdaterar statusen för aktivering eller inaktivering av en grupps underordnade kontroller baserat på statusen 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.

Lägg till validerare
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 istället för med XML. Den här metoden returnerar alltid S_OK.

Lägg till validerare
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 istället för med XML.

DisableValidation
HRESULT DisableValidation(int controlId, BOOL disable)

Anropa den här metoden om du antingen uttryckligen vill inaktivera valideraren för en kontroll eller återställa normal validering enligt tabell 31. Den här metoden är till exempel användbar när du har regler för att aktivera/inaktivera för kontroller som inte omfattas av formulärverifiering och du behöver 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 Den kontroll som du vill aktivera eller inaktivera verifiering för
Inaktivera Ange SANT för att inaktivera verifiering och FALSKT för att återställa normal verifiering
Lägg till fält
HRESULT AddField(LPCWSTR fieldName, int controlId, BOOL suppressLog, DialogControlTypes type)

Lägg till en kontrollmappning mellan namnet i ett fältelement i .config XML-filen och kontroll-ID:t i sidans dialogruta, som visas i 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 så som det visas i sidans XML
controlId ID:t för kontrollen i sidans dialogrutemall
suppressLog Ange till SANT 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å SANT för lösenords- eller PIN-fält
Typ Typen av kontroll, som är någon 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)

Med den här metoden läggs en kontroll till i en namngiven alternativknappgrupp, som visas i tabell 33. Du måste anropa detta före metoden InitFields eftersom den metoden använder attribut i elementet RadioGroup för att styra inställningarna för alla alternativknappkontroller i gruppen. Radiogrupper kan låsas, till exempel så att alla alternativknappar är inaktiverade, 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
groupName En sträng som definierar en grupp med alternativknappar på den här sidan
radioControlId ID för en enskild 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 grupp med alternativknappar. Om du inaktiverar en alternativgrupp inaktiveras alla alternativknappkontroller i gruppen, liksom eventuella underordnade alternativknappar som har lagts till med AddToGroup. Se tabell 34 och tabell 35.

Tabell 34. EnableRadioGroup

Parameter Beskrivning
groupName Namnet på en alternativknappgrupp som du redan har definierat med ett anrop till AddRadioGroup
Aktivera Ange SANT för att aktivera alternativknappgruppen och FALSKT för att inaktivera gruppen

Tabell 35. HRESULT EnableRadioGroup

HRESULT Beskrivning
S_OK Grupp aktiverad eller inaktiverad
E_INVALIDARG Det finns ingen alternativknappgrupp 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ärkontrollanten SetFieldDefault för kontroller som inte är antingen CONTROL_STATIC_TEXT eller CONTROL_CHECK_BOX. På så sätt kan du hämta ett standardvärde från XML-koden och själv ange det i kontrollen.

SaveFields (spara)
HRESULT SaveFields(IFieldCallback *pFieldCallback = nullptr)

Den här metoden sparar fältvärden i aktivitetssekvensvariabler och i sammanfattningsdata som ska visas på sidan Sammanfattning . Genom att ange en pekare i pFieldCallback kan du hantera sparade 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.

InitAvsnitt
HRESULT InitSection(LPCWSTR key, LPCWSTR sectionCaption)

Den här metoden initierar sammanfattningsdata som ska visas på sammanfattningssidan , som visas i 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 se till att varje sida har sin egen sammanfattningsinformation.
sectionCaption Det huvud som visas på sammanfattningssidan 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å sammanfattningssidan utöver de objekt som anges med XML-koden. Se tabell 37.

Tabell 37. HRESULT AddSummaryItem

Parameter Beskrivning
Första Bildtext för sammanfattningsobjektet, som visas till vänster
För det andra Värdet som visas till höger
SuppressLogValue (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 i både en aktivitetssekvensvariabel och sammanfattningsavsnittet. Vanligtvis 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 för den textruta som innehåller värdet du vill spara (eller någon annan kontroll som kan returnera text)
tsVariableName Namnet på den aktivitetssekvensvariabel som du vill ändra
summaryCaption Bildtexten på sammanfattningssidan 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 ställer in textrutan på det här värdet.

ControlEvent (KontrollHändelse)
void ControlEvent(WORD eventId, WORD controlId)

Anropa den här metoden på din OnControlEvent metod för att säkerställa att formulärkontrollanten kan bearbeta kontrollhändelser, vilket den behöver göra för att fungera korrekt. Värdena 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 kontrollvaliderarna rapporterade ett fel returnerar den här metoden FALSE. Med andra ord returneras SANT endast om alla kontroller på sidan är giltiga.

IValidator Interface

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

Validerare är komponenter som kan validera en enstaka kontroll på sidan. Det enklaste sättet att implementera en validerare är att göra den till en underklass till BaseValidator-klassen , 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 Den kontroll som valideraren måste validera
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 validerare som skapas baserat på sidans XML. Se tabell 40.

Tabell 40. HRESULT Init-metod

Parameter Beskrivning
pControl Den kontroll som valideraren måste validera
pContainer Om din validerare behöver åtkomst till loggern eller behöver skapa andra komponenter
pProperties Ger åtkomst till egenskaperna (inställningselementen) för din validerare
BOOL, IsValid (LPBSTR pMessage)

Den här metoden returnerar SANT om kontrollen är giltig eller FALSKT om kontrollen är ogiltig. Vid retur ska pMessage fyllas i med en ny BSTR som innehåller det meddelande 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 finns med 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 finns med 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 finns med 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 ID_Regex komponenten (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 SANT om det finns 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ågon felbearbetning i den här metoden, och den returnerar antingen S_OK eller genererar ett undantag.

ISummaryInfo-gränssnitt

__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 ska inte behöva använda det här gränssnittet direkt. Använd IFormController i stället.

ISummaryBag

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

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

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ärdena 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([i] LPCTSTR variableName)

När aktivitetssekvensvariabler skrivs, till exempel när du väljer Slutför i UDI-guiden, skrivs namnen och värdena 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 är för intern användning av TSVariableBag för att läsa och skriva 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ör aktivitet som sparar aktivitetssekvensvariabler när du väljer Slutför. Om du avbryter guiden anger aktiviteten bara OSDSetupWizCancelled aktivitetssekvensvariabeln till TRUE och sparar inte ändringar i andra aktivitetssekvensvariabler.

Om du skapar en egen finjusteringskomponent måste du registrera den med en kod som ser ut så 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 datakällkomponent som du vill binda till en kombinationsruta genom att anropa dess bindningsmetod .

size_t Antal(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 visst 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 tillgång till hierarkiska data som kan sparas på en sida. Du får det här gränssnittet via metoder i ISettingsProperties-gränssnittet , 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>

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

size_t Antal()

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 den skulle använda den set-egenskapen för databindning. Kombinationsrutan skulle då innehålla Public 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 (från och med 0) för det DataItem som du vill hämta ett egenskapsvärde för
PropertyName Namnet på den set-egenskap 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 Fastigheten återfanns.
E_INVALIDARG Indexet har passerat 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 ett DataItem returneras hela DataItem omsluten i ett ISettingsProperties gränssnitt. Se tabell 43 och tabell 44.

Tabell 43. HRESULT GetNode

Parameter Beskrivning
Index Indexvärdet (från och med 0) för det DataItem 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 har passerat slutet av matrisen.

IFactoryRegistry-gränssnitt

__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 behöver du åtminstone skapa en sidfabrik – en klass som implementerar IClassFactory. (Du kan använda ClassFactoryImpl som basklass för fabriken.)

void Register (LPCTSTR typ, IClassFactory * pFactory)

Den här metoden registrerar en klassfabrik i registret. Se tabell 45.

Tabell 45. IClassFactory void Register

Parameter Beskrivning
Typ En sträng som identifierar fabriken du registrerar. I allmänhet bör den här parametern ha ditt företagsnamn i strängen för att säkerställa att det är unikt
pFactory En pekare till klassfabriksinstansen
HRESULT LoadAndRegister(LPCTSTR dllName, ILogger *pLogger)

Denna metod är endast för internt bruk.

BOOL Contains(LPCTSTR typ)

Denna metod är i allmänhet för internt bruk. 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 type, IUnknown **ppInstance)

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

HRESULT SetContainer(IWizardPageContainer *pContainer)

Denna metod är endast 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 för UDI-guiden till den språkidentifierare som du angav i parametern languageId .

LANGID GetLanguage()

Den här metoden returnerar värdet för den språkidentifierare 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 tillhandahålls med kommandoradsväxeln /locale

  • 0, om du inte angav kommandoradsväxeln /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 som hjälper dig att felsöka problem som hittas i fältet. Det är en bra idé att logga information på sidorna. Du kan få en pekare till det här gränssnittet inifrån sidan med hjälp av sidans Logger() -metod. Rader 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 elementet Style i .config-filen:

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

Denna metod är endast för internt bruk.

MoveLog (på engelska)
HRESULT MoveLog(LPCWSTR logFilename)

Denna metod är endast för internt bruk.

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

Denna metod är endast för internt bruk.

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

Denna metod är endast 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 samtal (Den här koden visas i loggposten som ett nummer.)
Komponent En sträng som identifierar källan till felet, som i allmänhet är sidan eller den komponent som du har skrivit
Meddelande Meddelandet som förklarar vad som orsakade felet
Fel2
HRESULT Error2(HRESULT error, LPCTSTR component, LPCTSTR message, LPCTSTR message2)

Den här metoden liknar Error metoden men gör att du kan ange ett meddelande i två delar. Det slutgiltiga meddelandet får "meddelande" och sedan "meddelande2" i utdatafilen. Detta är helt enkelt en bekvämlighetsmetod.

Normal
HRESULT Normal(LPCTSTR component, LPCTSTR message)

Med den här metoden loggas ett normalt meddelande. Se beskrivningen av felmetoden för parametrar.

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

Med den här metoden loggas 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.

Felsöka
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)

Denna metod är endast för internt bruk.

Stäng
HRESULT Close(void)

Denna metod är endast 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);
};

Detta gränssnitt är endast för internt bruk.

Gränssnitt för ISettings

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

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

Detta gränssnitt är endast för internt bruk.

Gränssnittet ISettingsProperties

__interface ISettingsProperties : IUnknown
{
    HRESULT GetAttribute(LPCTSTR attributeName, __out LPBSTR attributeValue);
    IStringProperties * Properties();
    HRESULT SelectNodes(LPCTSTR xPath, __out IXMLDOMNodeList **ppList);
    HRESULT SelectSingleNode(LPCTSTR xPath, __out IXMLDOMNode **ppNode);
    HRESULT GetDataNode(LPCTSTR name, __out ISettingsProperties **ppNode);
    HRESULT GetDataNodes(__out IDataNodes **ppNodes);
    HRESULT GetChildDataNodes(LPCTSTR childeName, __out IDataNodes **ppNodes);
};
Ö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 Settings() -metod.

HRESULT GetAttribute(LPCTSTR attributeName, LPBSTR attributeValue)

Med den här metoden kan du hämta värdena för attribut på huvudnoden, som är sidnoden när du använder metoden Settings() för sidan.

IStringProperties * Properties()

Den här metoden ger tillgång till set-egenskapsvärdena under huvudnoden. Det här är egenskaperna på den översta nivån för en sida.

HRESULT SelectNodes(LPCTSTR xPath, IXMLDOMNodeList **ppList)

Anropa den här metoden om du vill hämta en lista över XML-noder direkt med hjälp av 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 åt noderna på något annat sätt.

HRESULT SelectSingleNode(LPCTSTR xPath, IXMLDOMNode **ppNode)

Anropa den här metoden om du vill hämta en enskild XML-nod direkt med hjälp av 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 åt en nod på något annat sätt.

HRESULT GetDataNode(LPCTSTR name, ISettingsProperties **ppNode)

Hämta ett Data-element baserat på elementets namnattribut .

HRESULT GetDataNodes(IDataNodes, **ppNodes)

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

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

ISimpleStringProperties-gränssnitt

__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 ID_SimpleStringProperties-komponenten , som även implementerar IStringProperties gränssnittet. Du kan använda den här komponenten när du behöver skicka en uppsättning egenskaper till en annan komponent, till exempel en aktivitet, men du vill lägga till värden programmässigt i stället för att använda värden från XML. Här är ett exempel på hur du skulle använda 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 set-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. IHRESULT Get Property Value

Parameter Beskrivning
PropertyName Namnet på egenskapen som du vill läsa
pPropValue Vid utgång innehåller egenskapsvärdet som en sträng (Värdet blir nullptr om det inte finns någon sådan egenskap.)

Tabell 48. IHRESULT Få resultat för fastighetsvärde

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

Gränssnitt för ITaskManager

__interface ITaskManager : IUnknown
{
    HRESULT Init(IWizardPageView *pPageView, int idListView, int idMessage, int idRetryButton, ISettingsProperties *pPageInfo, ITaskManagerCallback *pCallback);
    HRESULT SetFailMessage(LPCWSTR message);

    HRESULT Start(void);

    HRESULT GetTaskMessage(size_t index, LPBSTR message);
    HRESULT GetResultType)(size_t index, LPBSTR type);
    HRESULT GetProperty(size_t index, LPCTSTR propertyName, LPBSTR value);
    int GetSelectedIndex(void);
    HRESULT Wait(DWORD waitMilliseconds);
    size_t FailedCount(void);
    size_t WarningCount(void);
    size_t SucceedCount(void);
    size_t RunningCount(void);

    void OnCommonControlEvent(WORD controlId, LPNMHDR pInfo);
    void OnControlEvent(WORD eventId, WORD controlId);
    void EnableButtons(BOOL enable);
}

Det här gränssnittet implementeras av TaskManager-komponenten (ID_TaskManager i ITaskManager.h), som är den komponent som kör uppgifter på preflight-sidan. Du kan antingen använda preflight-sidan direkt, vilket är vad du gör för det mesta, eller bygga en egen sida och låta den här komponenten gö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 sidan som ska köra uppgifter (Den här sidan måste ha en särskild uppsättning kontroller, som anges i följande parametrar.)
idListView Kontroll-ID för en ListView-kontroll som visar listan med uppgifter och status för dessa uppgifter
idMessage Kontroll-ID för en textruta som kommer att användas för att visa ett meddelande om den valda aktiviteten
idRetryButton Kontroll-ID för en knapp som du kan välja för att köra uppgifterna igen
pPageInfo En omslutning runt sidans XML (Aktivitetshanteraren läser in uppsättningen aktiviteter som ska köras från denna XML.)
pCallback Kan vara null (Om den här parametern inte är null anropar TaskManager metoden Started när en aktivitet startas och metoden Finished för varje aktivitet som har körts.)
HRESULT SetFailMessage(LPCWSTR-meddelande)

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

HRESULT Start(annulleras)

Med den här metoden startas alla aktiviteter. Varje aktivitet startas i en separat tråd.

HRESULT GetTaskMessage(size_t index, LPBSTR message)

Denna metod är endast 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 de tillgängliga typerna.

Tabell 50. HRESULT GetResultType

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

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

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

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

int GetSelectedIndex(void)

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

HRESULT Wait(DWORD waitMilliseconds)

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

size_t FailedCount(void)

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

size_t WarningCount(void)

Den här metoden returnerar antalet aktiviteter som för närvarande markerats som varning.

size_t SucceedCount(void)

Den här metoden returnerar antalet uppgifter 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 OnCommonControlEvent så att Aktivitetshanteraren kan bearbeta händelser som behövs.

void OnControlEvent(WORD eventId, WORD controlId)

Anropa den här metoden från sidans OnControlEvent så att TaskManager kan bearbeta händelser som behövs.

void EnableButtons(BOOL enable)

Denna metod är endast för internt bruk.

IWizardComponent Interface

__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 i registret får komponenten en pekare till IWizardPageContainer-instansen när den skapas. Detta hjälper dig till exempel att komma åt loggern eller registret för att skapa andra komponenter som din komponent 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);
};

Detta gränssnitt ä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);
};

Detta gränssnitt ä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å du behöver vanligtvis 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 om du vill skriva meddelanden till loggfilen, till exempel:

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

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

HRESULT CreateInstance(LPCTSTR type, [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 typifierad.

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 mallfunktionen GetService , som är starkt typifierad (i stället för att använda IUnknown).

HRESULT ReplaceVariables(LPCTSTR source, [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.)
%Namn% Antingen en aktivitetssekvensvariabel eller en miljövariabel. Ordningen är följande:

1. Använd värdet för en aktivitetssekvensvariabel, om det finns.
2. Använd värdet för en miljövariabel, om sådan 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 eller % ingen alls
pDest Innehåller vid retur en ny sträng där alla token har ersatts enligt tabell 51
HRESULT GotoPage(LPCTSTR pageName)

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

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

Den här metoden visar en meddelanderuta med text och bildtexter som du anger. Parametern uType är valfritt värde som du kan ange till Win32-funktionen MessageBox .

BOOL InPreview(void)

Den här metoden returnerar SANT om du startade guiden i "förhandsgranskningsläge" genom att ange växeln /preview . I förhandsgranskningsläge inaktiveras aldrig Nästa-knappen . Med den här metoden kan du kringgå kod i förhandsgranskningsläge, vilket till exempel 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 UDI-guidens programmeringsgränssnitt 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 omslag, som i själva verket är fasader för att interagera med kontrollerna på sidan. Att använda dessa fasader istället för de faktiska kontrollerna gör det mycket lättare att skriva tester för din sida, eftersom du kan tillhandahålla simulerade fasader 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 typad, till exempel:

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

Den här metoden returnerar sidans fönsterhandtag. Vanligtvis bör du inte behöva tillgång 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)

Denna metod är endast för internt bruk.

HRESULT Hide(void)

Denna metod är endast för internt bruk.

HRESULT Focus(int itemId)

Flytta indatafokus till en viss kontroll.

IWizardPage * Page(void)

Denna metod är endast för internt bruk.

IFormController * Form(void)

Denna metod är endast för internt bruk.

HRESULT FocusWizardButton(WizardButtons-knapp)

Flyttar fokus till en av guidens knappar. WizardButtons har två värden: BackButton och NextButton.

HRESULT SetEnable(WizardButtons-knappen, BOOL-aktivera)

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

void ShowWarningMessage(LPCTSTR message)

Med den här metoden visas ett varningsmeddelande längst ned i området med sidinnehåll. Det här meddelandet kan vara vilken text du vill.

void HideWarningMessage(void)

Dölj ett varningsmeddelande som du har visat vid 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

Detta gränssnitt implementeras av komponenten ID_IXmlDocument , som är en fasad som är utformad för att göra det lättare att arbeta med XML-dokument i C++.

HRESULT Load(LPCTSTR filnamn)

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

HRESULT LoadXml(LPCTSTR xml)

Med den här metoden läses ett XML-dokument in 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 i 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 inläsningen av XML-dokumentet, om det finns ett sådant. 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. Den namnrymd 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 Noden som du vill lägga till ett attribut till
Namn Namn 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 nodens appendChild-metod .

Hjälpfunktioner

Mallfunktionen CreateInstance

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

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

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

Den här koden skapar en ny ID_Directory komponent för att hämta komponentens IDiretory-gränssnitt .

Mallfunktionen GetService

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

Den här funktionen definieras i IWizardPageContainer.h och tillhandahåller en typsäker omslutning över IWizardPageContainer-GetService> metoden, 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 för klassen WizardPageImpl i stället.)

UDI-guiden Designer konfigurationsfilschemareferens

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 i guiden, anpassade uppgifter eller anpassade validerare. Filen måste sluta med .config och finnas i mappen installation_folder\Bin\Config (där installation_folder är den mapp där du installerade MDT).

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

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

Elementnamn Beskrivning
DesignerConfig Anger roten för alla andra element
DesignerMappings Grupperar en uppsättning sidelement
Sida Anger en guidesidredigerare som ska läsas in i UDI-guiden Designer, som används för att redigera konfigurationsinställningarna för en guidesida
Param (Param) Anger en parameter som skickas till det överordnade uppgifts - eller valideringselementet och som motsvarar ett setter-element i konfigurationsfilen för UDI-guiden Obs! Attributen för det här elementet skiljer sig åt om det överordnade elementet är uppgifts - eller valideringselementet .
Uppgift Anger en uppgift i uppgiftsbiblioteket
TaskItem (Uppgiftsobjekt) Anger en grupp med parametrar som skickas till aktiviteten
TaskLibrary (Uppgiftsbibliotek) Grupperar en uppsättning aktivitetselement
Validerare Anger en validerare i valideringsbiblioteket
ValidatorLibrary (ValidatorBibliotek) 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. DesignerConfig-elementinformation

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

Det här elementet har inga attribut.

Anmärkningar

Inga.

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. Elementinformation för DesignerMappings

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

Det här elementet har inga attribut.

Anmärkningar

Inga.

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 guidesidredigerare 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 Allt korrekt formaterat XML-innehåll
Attribut för element

I tabell 58 visas attributen för sidelementet och en beskrivning för vart och ett.

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

Attribut Beskrivning
Beskrivning Anger text som ger information om parametern, som visas i UDI-guiden Designer
Sammansatt konstruktör Anger namnet på den .dll fil som är associerad med guidens sidredigerare (Den .dll filen måste finnas i mappen installation_folder\Bin (där installation_folder är den mapp där du installerade MDT.)
DesignerType Anger namnet på guidens sidredigerare i den .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 (visningsnamn) 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.) Notera: Se till att DLL-processorarkitekturen matchar MDT-processorarkitekturen som är installerad. Om du till exempel har installerat en 32-bitarsversion av MDT måste du använda en 32-bitars DLL för guidesidan.
Bild Anger namnet på en bild av sidan som är i PNG-format (Portable Network Graphics) (Den .png filen 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 det namn 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 schemavalidering för att säkerställa att sidelementen och underordnade element har ett giltigt format. Det här elementet ger 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 en anpassad sidredigerare.

Exempel

Inga.

Param (Param)

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

Obs!

Attributen för det här elementet skiljer sig åt om det överordnade elementet är Task eller Validator .

Elementinformation

Tabell 59 innehåller information om Param-elementet .

Tabell 59. Information om paramelement

Attribut Värde
Antal förekomster En eller flera för varje överordnat TaskItem- eller Validator-element
Överordnade element TaskItem, Validator
Innehåll Allt korrekt formaterat XML-innehåll
Attribut för element

Tabell 60 visar attributen för Param-elementet och en beskrivning av var och en.

Tabell 60. Attribut och motsvarande värden för paramelementet

Attribut Beskrivning
Beskrivning Anger text som ger information om parametern, som visas i UDI-guiden Designer Obs! Det här attributet är endast giltigt för valideringselementet.
DisplayName (visningsnamn) 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 namnattributet.) Obs: Detta attribut är endast giltigt för valideringselementet.
Namn Anger namnet på parametern som skickas till uppgiften eller valideraren, beroende på det överordnade elementet (det här attributet blir egenskapsattributet i ett Setter-element i konfigurationsfilen för UDI-guiden.) Notera: Den här parametern används för både överordnade TaskItem- och Validator-element .
Anmärkningar

Inga.

Exempel

Inga.

Uppgift

Det här elementet anger en uppgift i uppgiftsbiblioteket.

Elementinformation

Tabell 61 innehåller information om aktivitetselementet .

Tabell 61. Information om aktivitetselement

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

Tabell 62 innehåller en lista över attributen för aktivitetselementet och en beskrivning av vart och ett.

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

Attribut Beskrivning
Beskrivning Anger text som tillhandahåller information om aktiviteten, som visas i UDI-guiden Designer
DLL Anger namnet på den .dll fil som är associerad med aktiviteten (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 för 64-bitarsversionen).
Namn Anger namnet på aktiviteten, som visas på lämplig sida i UDI-guiden och i UDI-guiden Designer
Typ Anger aktivitetstypen, som är registrerad i fabriksregistret och används för att anropa en specifik aktivitet i en .dll fil
Anmärkningar

Inga.

Exempel

Inga.

TaskItem (Uppgiftsobjekt)

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

Elementinformation

Tabell 63 innehåller information om TaskItem-elementet .

Tabell 63. Elementinformation för TaskItem

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

I tabell 64 visas attributen för TaskItem-elementet och en beskrivning av var och en.

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

Attribut Beskrivning
Typ Anger elementtypen 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 File-element i konfigurationsfilen för UDI-guiden.

För närvarande är de enda värden som stöds:

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

Inga.

Exempel

Inga.

TaskLibrary (Uppgiftsbibliotek)

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

Elementinformation

Tabell 65 innehåller information om TaskLibrary-elementet .

Tabell 65. Elementinformation i TaskLibrary

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 uppgifter i DLL-filen som motsvarar den här konfigurationsfilen för UDI-guiden Designer.)
Överordnade element DesignerConfig
Innehåll Uppgift
Attribut för element

Det här elementet har inga attribut.

Anmärkningar

Inga.

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>

Validerare

Det här elementet anger en validerare i valideringsbiblioteket.

Elementinformation

Tabell 66 innehåller information om Validator-elementet .

Tabell 66. Information om valideringselement

Attribut Värde
Antal förekomster Noll eller fler i ValidatorLibrary-elementet (Det här elementet är valfritt.)
Överordnade element ValidatorLibrary (ValidatorBibliotek)
Innehåll Param (Param)
Attribut för element

Tabell 67 innehåller en förteckning över validatorelementets attribut och en beskrivning av var och en.

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

Attribut Beskrivning
Beskrivning Anger text som tillhandahåller information om valideraren, som visas i UDI-guiden Designer
DisplayName (visningsnamn) Anger det användarvänliga namnet på valideraren som visas i UDI-guiden Designer (Det här namnet är vanligtvis mer beskrivande än Name-attributet.)
DLL Anger namnet på den .dll fil som är associerad med valideraren (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 för 64-bitarsversionen.)
Namn Anger namnet på valideraren, som visas på lämplig sida i UDI-guiden och i UDI-guiden Designer
Typ Anger den typ av validerare som är registrerad med registerfaktorn och används för att anropa en specifik validerare i en .dll fil
Anmärkningar

Inga.

Exempel

Inga.

ValidatorLibrary (ValidatorBibliotek)

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

Elementinformation

Tabell 68 innehåller information om ValidatorLibrary-elementet .

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 validerare i DLL-filen som motsvarar den här konfigurationsfilen för UDI-guiden Designer.)
Överordnade element DesignerConfig
Innehåll Validerare
Attribut för element

Det här elementet har inga attribut.

Anmärkningar

Inga.

Exempel

<DesignerConfig> + <TaskLibrary> - <ValidatorLibrary> +< Validator DLL="" Description="Kräver text i ett fält" Type="Microsoft.Wizard.Validation.NonEmpty" Name="NonEmpty"> +<Validator DLL="" Description="Tillåter inte att vissa tecken finns i ett fält" Type="Microsoft.Wizard.Validation.InvalidChars" Name="InvalidChars"> +<Validator DLL="" Description="Måste följa ett fördefinierat mönster" Type="Microsoft.Wizard.Validation.RegEx" Name=" NamedPattern"> +<Validator DLL="" Description="Kräv att innehållet matchar ett reguljärt uttryck" Type="Microsoft.Wizard.Validation.RegEx" Name="RegEx"></ValidatorLibrary> + <DesignerMappings></DesignerConfig>

UDI Wizard Designer Reference

Fjärrkontroll

Kontrollerna som används för att skapa anpassade guidsidredigerare för användning i UDI-guiden Designer är WPF UserControl-instanser. I tabell 69 listas de kontroller som du kan använda för att skapa anpassade sidredigerare för guiden.

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

Kontroll Beskrivning
SamlingTControl Den här kontrollen används för att redigera data som lagras i dataelementet i ett sidelement .
Fältelementkontroll 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 set-element i konfigurationsfilen för UDI-guiden.

SamlingTControl

Den här kontrollen ger många möjligheter att redigera data. Det bästa sättet att lära dig hur du använder den här kontrollen är att titta på exemplet, som visar hur du redigerar data under en sidas dataelement . Exemplet visar särskilt hur du lägger till, tar bort och redigerar objekt i den här kontrollen.

Fältelementkontroll

Använd den här kontrollen om du vill 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
Fältdata

Den här strängegenskapen innehåller information om hur du ansluter FieldElementControl till underliggande XML för fältet. Anslutningen görs till en egenskap i sidredigerarens gränssnitt. Följande utdrag från en XAML-fil illustrerar hur egenskapen FieldData används:

FieldData="{Binding DataContext.Location, ElementName=ControlRoot}"

I det här utdraget kallas sidredigerarens gränssnitt ControlRoot och anges i parametern ElementName . Bindningen utförs till egenskapen DataContext.Location i ControlRoot-sidredigeringsgränssnittet. DataContext är en vymodell som pekar på sidelementet i konfigurationsfilen för UDI-guiden. Plats är en egenskap i 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 kontrollen FieldElementControl . Rubriken fungerar som en rubrik för kontrollen och är formaterad som fet, orange text som visas direkt ovanför kontrollen.

Instruktionstext

Med den här strängegenskapen kan du ange informationstext för kontrollen FieldElementControl . Vanligtvis används texten för att ge en kort beskrivning av fältet och förklara hur konfigureringen av fältet påverkar motsvarande sida i guiden.

HideEnableButton

Med den här booleska egenskapen kan du styra visningen för knappen som ändrar tillstånd mellan Olåst och Låst (aktiverad eller inaktiverad). Om den är inställd på:

  • Det är sant att knappen inte visas

  • Falskt, knappen visas (Detta är standardvärdet.)

HideDefaultTab

Med den här booleska egenskapen kan du styra visningen för det avsnitt som innehåller kontrollen som används för att ange standardvärdet. Även om egenskapen refererar till en flik finns det ingen flik i FieldElementControl utan snarare ett avsnitt som kan döljas. Om den är inställd på:

  • Det är sant, avsnittet visas inte

  • Falskt, avsnittet visas (det här är standardvärdet.)

HideBorder

Med den här booleska egenskapen kan du styra visningen av kantlinjen runt fältkontrollen. Om den är inställd på:

  • Det är sant, kantlinjen visas inte

  • False, kantlinjen är synlig (Detta är standardvärdet.)

Dölj bild

Med den här booleska egenskapen kan du styra synligheten för bilden som egenskapen FieldImageSource konfigurerar. Om den är inställd på:

  • Det är sant att bilden inte visas

  • Falskt, bilden är synlig (Detta är standardvärdet.)

Fliken 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 snarare ett avsnitt som kan döljas. Om den är inställd på:

  • Det är sant, avsnittet visas inte

  • Falskt, avsnittet visas (det här är standardvärdet.)

HideSummaryTab

Med den här booleska egenskapen kan du styra synligheten för det avsnitt där du konfigurerar bildtexten för fältsammanfattningen. Bildtext och motsvarande värde från fältet visas på en SummaryPage-guidesidtyp i ett fasflöde. Även om egenskapen refererar till en flik finns det ingen flik i FieldElementControl utan snarare ett avsnitt som kan döljas. Om den är inställd på:

  • Det är sant, avsnittet visas inte

  • Falskt, avsnittet visas (det här är standardvärdet.)

HideTaskSequenceTab

Med den här booleska egenskapen kan du styra synligheten för det avsnitt där du konfigurerar aktivitetssekvensvariabeln som motsvarar fältet. Även om egenskapen refererar till en flik finns det ingen flik i FieldElementControl utan snarare ett avsnitt som kan döljas. Om den är inställd på:

  • Det är sant, avsnittet visas inte

  • Falskt, avsnittet visas (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 set-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 i vyn eller vymodellen som ansluter till inställningen. Det gör ungefär detsamma som att binda till ett fält, enligt beskrivningen för FieldElementControl.

HeaderText

Med den här egenskapen kan du ange vilken 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 sidhuvudet – vanligtvis instruktionstext som talar om för användaren av din anpassade redigerare när och varför de skulle vilja ändra fältets beteende.

Gränssnitt

I tabell 70 listas de gränssnitt som du kan använda för att skapa anpassade sidredigerare i guiden.

Tabell 70. Gränssnitt som kan användas för att skapa anpassade sidredigerare i guiden

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 tillgång 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 behöver. 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 (på engelska) Den här egenskapen ger åtkomst till XML-elementen, attributen och värdena under kontexten för den aktuella sidan som redigeras i konfigurationsfilen för UDI-guiden
CurrentPage (på engelska)
XElement CurrentPage { get; set; }

Den här egenskapen ger åtkomst till XML-koden för den aktuella sidan. Du bör aldrig ange den här egenskapen, men du kan ändra XML-koden för sidan. I exempelredigeraren visas exempel på hur du ändrar XML. Du använder den här egenskapen främst när du har anpassade data. För fält och egenskaper (sättare) kan du använda färdiga kontroller som tar hand om alla detaljer.

IMessageBoxService

Det här gränssnittet ger tillgång 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 hjälper till att skriva automatiserade tester för designersidor.

Att använda dessa metoder ger dock en användbar fördel: Dialogrutorna har alltid "ägare" inställd på UDI-guiden, vilket säkerställer att dialogrutan grupperas korrekt 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 IMessageBoxService-gränssnittet .

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 (String message, String bildtext, MessageBoxImage icon)
- ShowMessageBox(strängmeddelande, sträng bildtext, MessageBoxButton-knapp, MessageBoxImage ikon)
- ShowMessageBox(Undantag, undantag)
ShowDialogWindow Använd den här metoden om du vill 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 guidesidredigeraren. Den här medlemmen är överbelastad: Tabell 73 innehåller en förteckning över ledamöterna och en kort beskrivning av var och en. Fullständig information om varje medlem (inklusive syntax, användning och exempel) finns i respektive medlems avsnitt.

Tabell 73. Överlagrade medlemmar för metoden ShowMessagBox

Medlem Beskrivning
ShowMessageBox (String message, String bildtext, MessageBoxImage icon) 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(Undantag, undantag) Visar en meddelanderuta med information om ett undantag och knappen OK
ShowMessageBox (String message, String bildtext, MessageBoxImage icon)
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 icon)

Parameter Beskrivning
Meddelande Meddelandet som ska visas i innehållsområdet i meddelanderutan
bildtext Texten som ska visas i namnlisten i dialogrutan
Ikon Vilken 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 en uppsättning knappar som du vill visa och anger 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 innehållsområdet i meddelanderutan
bildtext Texten som ska visas i namnlisten i dialogrutan
knapp Vilka knappar som ska visas?
Ikon Vilken typ av ikon som ska visas i meddelanderutan
ShowMessageBox(Undantag, undantag)
void ShowMessageBox(Exception exception);

Den här metoden visar en meddelanderuta som rapporterar information om ett undantag. I den här meddelanderutan finns bara en OK-knapp . Se tabell 76.

Tabell 76. Parametrar för metoden ShowMessageBox(Exception exception)

Parameter Beskrivning
Undantag Undantaget som du vill rapportera (Dialogrutan använder undantag. Meddelande som innehållet.)
ShowDialogWindow
void ShowDialogWindow(Type viewType, DialogInteraction dialogPayload);

Med den här metoden skapas 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 kontrollen med hjälp av parametern dialog Payload . 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 tillhandahållit något exempel på hur du använder den här metoden.

Schemareferens för konfigurationsfil 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 av guidesidorna i UDI-guiden

  • Inställningar för fälten på varje sida i guiden

  • Tillgängliga steggrupper i UDI-guiden Designer

  • Tillgängliga steg i varje distributionsguide i UDI-guiden Designer

    77 listar elementen i konfigurationsfilen för UDI-guiden och deras beskrivningar. Elementet Wizard ä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 Page-element och namnges av Name-attributet .
Dataobjekt Grupperar de enskilda Set-elementen i ett sidelement . Du kan skapa hierarkiska data genom att infoga 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 ett DataItem för visningsnamnet och ett annat DataItem-element för motsvarande enhetsbeteckning.
Standard Anger ett standardvärde för fältet som anges i det överordnade fältet eller RadioGroup-elementet . Standardvärdet är inställt på det värde som parenteser för det här elementet.
DLL Anger en DLL som ska läsas in och refereras av UDI-guiden och UDI-guiden Designer.
DLL-filer Grupperar de enskilda DLL-elementen .
Fel Anger en möjlig felkod som en aktivitet kan returnera. Värdet för felkoden returneras av aktivitetens HRESULT och fångas upp av det här elementet för att ge mer specifik felinformation.
ExitCode Anger en möjlig slutkod för en uppgift. 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 Value-attributet för att hantera returkoder som inte anges i andra ExitCode-element .
Utgångskoder Grupperar en uppsättning ExitCode- och Error-element för ett Task-element eller ett Error-element.
Fält Anger en instans av en kontroll i ett sidelement som används för att anpassa XML. Det går inte att anpassa med XML i alla kontroller – bara kontroller som använder elementet Fält .
Fält Grupperar de enskilda fältelementen i ett sidelement .
Fil Anger källa och mål för en filkopieringsåtgärd med hjälp av aktivitetstypen Microsoft.Wizard.CopyFilesTask . Du kan ta med ett separat filelement om du vill kopiera flera filer i en 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ältelement .
StageGroup Anger en grupp med ett eller flera steg.
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 som namnges i egenskapen Property .
Fas Anger en fas i en StageGroup och innehåller ett eller flera PageRef-element .
Format Grupperar de enskilda set-elementen som konfigurerar UDI-guidens utseende, inklusive rubriken som visas högst upp i guiden och banderollbilden som visas i UDI-guiden.
Uppgift Anger en uppgift som ska köras på sidan som anges i det överordnade sidelementet .
Uppgifter Grupperar en uppsättning uppgifter för ett sidelement .
Validerare Anger en validerare för fältkontrollen som anges i det överordnade fältelementet .
Guiden Anger roten för alla andra element.

Uppgifter

Det här elementet grupperar de enskilda DataItem-elementen i ett Page-element och namnges av Name-attributet.

Elementinformation

Tabell 78 innehåller information om dataelementet .

Tabell 78. Information om dataelement

Attribut Värde
Antal förekomster Noll eller fler inom varje sidelement (det här elementet är valfritt.)
Överordnade element Page, DataItem
Innehåll DataItem, Setter
Attribut för element

I tabell 79 visas attributen för dataelementet och en beskrivning av vart och ett.

Tabell 79. Attribut och motsvarande värden för dataelementet

Attribut Beskrivning
Namn Anger namnet på dataelementet
Anmärkningar

Med namnattributet kan kod hämta en specifik uppsättning data.

Exempel

Inga.

Dataobjekt

Det här elementet grupperar de enskilda Set-elementen i ett Page-element . Du kan skapa hierarkiska data genom att infoga 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 ett DataItem för visningsnamnet och ett annat DataItem-element för motsvarande enhetsbeteckning.

Elementinformation

Tabell 80 innehåller information om elementet DataItem .

Tabell 80. Information om dataobjektelement

Attribut Värde
Antal förekomster Noll eller fler inom varje dataelement (Det här elementet är valfritt.)
Överordnade element Data
Innehåll Data, Setter
Attribut för element

Det här elementet har inga attribut.

Anmärkningar

Inga.

Exempel

Inga.

Standard

Det här elementet anger ett standardvärde för fältet som anges i det överordnade fält - eller RadioGroup-elementet . Standardvärdet är inställt på det värde som det här elementet står för.

Elementinformation

Tabell 81 innehåller information om standardelementet .

Tabell 81. Standardelementinformation

Attribut Värde
Antal förekomster Noll eller fler inom ett fält - eller radiogruppselement (Det här elementet är valfritt.)
Överordnade element Fält, RadioGroup
Innehåll Kan vara vilket korrekt formaterat XML-innehåll som helst, men är vanligtvis standardtext
Attribut för element

Det här elementet har inga attribut.

Anmärkningar

Inga.

Exempel

I följande exempel är standardvärdet för fältet TimeZone 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 DLL-filer
Innehåll Inget innehåll tillåts för det här elementet
Attribut för element

Tabell 83 listar attributen för DLL-elementet och ger 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 som ska refereras till
Anmärkningar

Inga.

Exempel
<DLLs>
  <DLL Name="OSDRefreshWizard.dll" />
  <DLL Name="SharedPages.dll" />
</DLLs>

DLL-filer

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 Ett
Överordnade element Guiden
Innehåll DLL
Attribut för element

Det här elementet har inga attribut.

Anmärkningar

Inga.

Exempel
<DLLs>
   <DLL Name="OSDRefreshWizard.dll" />
   <DLL Name="SharedPages.dll" />
</DLLs>

Fel

Det här elementet anger en möjlig felkod som en aktivitet 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 felelementet .

Tabell 85. Information om felelement

Attribut Värde
Antal förekomster Noll eller fler i varje ExitCode-element (det här elementet är valfritt.)
Överordnade element Utgångskoder
Innehåll Allt korrekt formaterat XML-innehåll
Attribut för element

I tabell 86 visas attributen för elementet Error och en beskrivning av var och en av dem.

Tabell 86. Information om felelement

Attribut Beskrivning
Tillstånd Anger returtillståndet för en aktivitet som påträffade ett fel. Vanligtvis är värdet för det här attributet inställt på Fel. Det här värdet visas i kolumnen Tillstånd på guidesidan i UDI-guiden.
Text Anger beskrivande text om det feltillstånd som aktiviteten påträffade.
Typ Anger om det här elementet representerar ett fel, en varning eller om det lyckades. Värdet som anges iTyp måste vara unikt inom 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 koden 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

Inga.

Exempel

Inga.

ExitCode

Det här elementet anger en möjlig slutkod för en uppgift. 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 Value-attributet 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 fler inom varje ExitCodes-element (Det här elementet är valfritt.)
Överordnade element Utgångskoder
Innehåll Minst ett ExitCode-element och noll eller flera felelement
Attribut för element

Tabell 88 innehåller attributen för ExitCode-elementet och en beskrivning av var och en.

Tabell 88. Attribut och motsvarande värden för ExitCode-elementet

Attribut Beskrivning
Tillstånd Anger returstatus för en aktivitet. Värdet för det här attributet visas i kolumnen Tillstånd på motsvarande guidesida i UDI-guiden. Du kan använda värden för det här attributet som är meningsfulla för uppgiften. Typiska värden för det här attributet är:

- Framgång
- Varning
- Fel
Text Anger beskrivande text om den befintliga koden för aktiviteten.
Typ Anger om det här elementet representerar ett fel, en varning eller om det lyckades. Värdet som anges i typ måste vara unikt inom 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 koden 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

Inga.

Exempel

Inga.

Utgångskoder

Det här elementet grupperar en uppsättning ExitCode- och Error-element för ett aktivitets- eller errorelement.

Elementinformation

Tabell 89 innehåller information om ExitCodes-elementet .

Tabell 89. Elementinformation för ExitCodes

Attribut Värde
Antal förekomster En inom varje uppgiftselement
Överordnade element Uppgift
Innehåll Fel, ExitCode
Attribut för element

Det här elementet har inga attribut.

Anmärkningar

Inga.

Exempel

Inga.

Fält

Det här elementet anger en instans av en kontroll i ett sidelement som används för att anpassa XML. Det går inte att anpassa med XML i alla kontroller – bara kontroller som använder elementet Fält .

Elementinformation

Tabell 90 innehåller information om fältelementet .

Tabell 90. Information om fältelement

Attribut Värde
Antal förekomster Noll eller fler inom varje fältelement (Det här elementet är valfritt.)
Överordnade element Fält
Innehåll Standard, Validator
Attribut för element

I tabell 91 visas fältelementets attribut och en beskrivning av vart och ett.

Tabell 91. Attribut och motsvarande värden för fältelementet

Attribut Beskrivning
Aktiverad Anger om fältet är aktiverat för användarindata (Attributet kan ställas in på sant eller falskt.)
Namn Anger namnet på fältet
Sammanfattning Anger den beskrivande texten som visas på sidan i Sammanfattningsguiden för det värde som anges i det här fältet
Var_namn Anger namnet på aktivitetssekvensvariabeln som lästs eller konfigurerats med hjälp av fältet i det överordnade fältelementet
Anmärkningar

Detta element kan innehålla noll eller flera standardelement och noll eller flera valideringselement .

Exempel

Inga.

Fält

Det här elementet grupperar de enskilda fältelementen i ett sidelement .

Elementinformation

Tabell 92 innehåller information om elementet Fields .

Tabell 92. Information om fältelement

Attribut Värde
Antal förekomster Noll eller fler inom varje sidelement (det här elementet är valfritt.)
Överordnade element Sida
Innehåll Fält, RadioGroup
Attribut för element

Det här elementet har inga attribut.

Anmärkningar

Inga.

Exempel

Inga.

Fil

Det här elementet anger källan och målet för en filkopieringsåtgärd med hjälp av aktivitetstypen Microsoft.Wizard.CopyFilesTask . Du kan ta med ett separat filelement om du vill kopiera flera filer i en 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 aktivitetstypen Microsoft.Wizard.CopyFilesTask
Överordnade element Uppgift
Innehåll Inga
Attribut för element

I tabell 94 visas attributen för filelementet och en beskrivning av vart och ett.

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 Microsoft.Wizard.CopyFilesTask aktivitetstypen kopierar. Det här attributet stöder jokertecken så att flera filer kan kopieras med ett enda File element. Miljövariabler tillåts som en del av sökvägen.
Anmärkningar

Inga.

Exempel

Inga.

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 inom varje sidelement
Överordnade element Sidor
Innehåll Data, fält, sättare, uppgifter
Attribut för element

I tabell 96 visas attributen för sidelementet och en beskrivning av vart och ett.

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

Attribut Beskrivning
DisplayName (visningsnamn) Anger det användarvänliga namnet på guidesidan som visas i UDI-guiden Designer. Det här namnet är vanligtvis mer beskrivande än namnattributet .
Namn Anger namnet på guidesidan som visas i UDI-guiden Designer.
Typ Anger vilken typ av guidesida som är direkt relaterad till en viss guidesida i en DLL-fil.
Anmärkningar

Inga.

Exempel

Inga.

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. Information om PageRef-elementet

Attribut Värde
Antal förekomster En eller flera inom ett Stage-element
Överordnade element Fas
Innehåll Inga
Attribut för element

I tabell 98 visas attributet för PageRef-elementet och en beskrivning av det.

Tabell 98. Attribut och motsvarande värden för PageRef-elementet

Attribut Beskrivning
Sida Anger förekomsten av en sida i en fas i en StageGroup. Ange det här värdet till attributet Name för ett Page-element .
Anmärkningar

Inga.

Exempel

Inga.

Sidor

Det här elementet grupperar de enskilda sidelementen .

Elementinformation

Tabell 99 innehåller information om sidelementet .

Tabell 99. Information om sidelement

Attribut Värde
Antal förekomster Ett
Överordnade element Guiden
Innehåll Sida
Attribut för element

Det här elementet har inga attribut.

Anmärkningar

Inga.

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 alternativknappar med i ett fältelement .

Elementinformation

Tabell 100 innehåller information om RadioGroup-elementet .

Tabell 100. Information om RadioGroup-element

Attribut Värde
Antal förekomster Noll eller fler inom ett Fields-element (Det här elementet är valfritt.)
Överordnade element Fält
Innehåll Standard
Attribut för element

Tabell 101 listar attributen för RadioGroup-elementet och ger 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:

- Det är 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å alternativgruppen.
Anmärkningar

Inga.

Exempel

Inga.

StageGroup

Det här elementet anger en distributionsfasgrupp.

Elementinformation

Tabell 102 innehåller information om elementet StageGroup .

Tabell 102. Elementinformation för StageGroup

Attribut Värde
Antal förekomster En eller flera i ett StageGroups-element
Överordnade element StageGroups
Innehåll Fas
Attribut för element

I tabell 103 visas attributen för StageGroup-elementet och en beskrivning av attributet.

Tabell 103. Attribut och motsvarande värden för elementet StageGroup

Attribut Beskrivning
DisplayName (visningsnamn) Anger det användarvänliga namnet på fasgruppen som visas i UDI-guiden Designer. Det här namnet är vanligtvis mer beskrivande än namnattributet .
Anmärkningar

Inga.

Exempel

Inga.

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
Attribut för element

Det här elementet har inga attribut.

Anmärkningar

Inga.

Exempel

Inga.

Setter

Det här elementet anger en egenskapsinställning för värdet för en egenskap som namnges i egenskapen Property .

Elementinformation

Tabell 105 innehåller information om Setter-elementet .

Tabell 105. Information om setter-element

Attribut Värde
Antal förekomster Noll eller fler inom 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
Attribut för element

I tabell 106 visas attributet för set-elementet och en beskrivning av det.

Tabell 106. Attribut och motsvarande värden för set-elementet

Attribut Beskrivning
Egenskap Anger namnet på egenskapen som anges. Egenskapsnamnet sätts till värdet inom detta attribut inom parenteser.
Anmärkningar

Inga.

Exempel

Inga.

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

Tabell 107. Information om scenelement

Attribut Värde
Antal förekomster En eller flera i ett StageGroup-element
Överordnade element StageGroup
Innehåll PageRef
Attribut för element

I tabell 108 visas attributen för scenelementet och en beskrivning av vart och ett.

Tabell 108. Attribut och motsvarande värden för scenelementet

Attribut Beskrivning
DisplayName (visningsnamn) Anger det användarvänliga namnet på guidesidan som visas i UDI-guiden Designer. Det här namnet är vanligtvis mer beskrivande än namnattributet .
Namn Anger namnet på fasen. Värdet för det här elementet används när UDI-guiden startas med kommandoradsparametern /stage: name .
Anmärkningar

Inga.

Exempel

Inga.

Format

Det här elementet grupperar de enskilda Setter-elementen som konfigurerar UDI-guidens utseende, inklusive rubriken som visas högst upp i guiden och banderollbilden som visas i UDI-guiden.

Elementinformation

Tabell 109 innehåller information om Style-elementet.

Tabell 109. Information om formatelement

Attribut Värde
Antal förekomster Ett
Överordnade element Guiden
Innehåll Setter
Attribut för element

Det här elementet har inga attribut.

Anmärkningar

Inga.

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 uppgift som ska köras på sidan som anges i det överordnade sidelementet .

Elementinformation

Tabell 110 innehåller information om uppgiftselementet .

Tabell 110. Information om aktivitetselement

Attribut Värde
Antal förekomster En eller flera i ett uppgiftselement
Överordnade element Uppgifter
Innehåll ExitCodes, fil, setter
Attribut för element

I tabell 111 visas attributen för uppgiftselementet och en beskrivning av vart och ett.

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 anges till namnattributet för ett annat aktivitetselement . Notera: Det här attributet kan inte konfigureras med UDI-guiden Designer. Du kan dock lägga till det här attributet manuellt i ett uppgiftselement genom att direkt ändra .xml-filen.
DisplayName (visningsnamn) Anger det användarvänliga namnet på aktiviteten som visas i UDI-guiden Designer. Det här namnet är vanligtvis mer beskrivande än namnattributet .
Namn Anger namnet på aktiviteten. Det här namnet måste vara unikt.
Typ Anger aktivitetstypen för aktiviteten som ska köras, som definieras i DLL-biblioteket som innehåller aktiviteten.
Anmärkningar

Inga.

Exempel

Inga.

Uppgifter

Det här elementet grupperar en uppsättning uppgifter för ett sidelement .

Elementinformation

Tabell 112 innehåller information om aktivitetselementet .

Tabell 112. Information om uppgiftselement

Attribut Värde
Antal förekomster Noll eller ett inom varje sidelement (det här elementet är valfritt.)
Överordnade element Sida
Innehåll Uppgift
Attribut för element

I tabell 113 visas attributen för elementet Tasks och en beskrivning av var och en av dem.

Tabell 113. Attribut och motsvarande värden för uppgiftselementet

Attribut Beskrivning
NameTitle Anger bildtexten som visas högst upp i kolumnen som innehåller namnet på aktiviteterna på lämplig sida i guiden.
StatusTitle Anger bildtexten som visas högst upp i kolumnen som innehåller status för aktiviteterna på lämplig guidesida.
Anmärkningar

Inga.

Exempel

Inga.

Validerare

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 Validator-elementet .

Tabell 114. Information om valideringselement

Attribut Värde
Antal förekomster Noll eller ett i ett fältelement
Överordnade element Fält
Innehåll Setter
Attribut för element

Tabell 115 listar attributet för valideringselementet och ger en beskrivning av det.

Tabell 115. Attribut och motsvarande värden för valideringselementet

Attribut Beskrivning
Typ Anger typen för valideraren, som definieras i det DLL-bibliotek som innehåller valideraren
Anmärkningar

Inga.

Exempel

Inga.

Guiden

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

Elementinformation

Tabell 116 innehåller information om guideelementet .

Tabell 116. Information om guideelement

Attribut Värde
Antal förekomster Ett
Överordnade element Inga
Innehåll DLL-bibliotek,sidor, fasgrupper, format
Attribut för element

Det här elementet har inga attribut.

Anmärkningar

Inga.

Exempel
<Wizard>
   + <DLLs>
   + <Style>
   + <Pages>
   + <StageGroups>
</Wizard>