Instalacja sterowana przez użytkownika — przewodnik dla deweloperów

Instalacja oparta na użytkownikach (UDI) ułatwia wdrażanie systemów operacyjnych klienta systemu Windows®, takich jak Windows 8.1, na komputerach korzystających z funkcji wdrażania systemu operacyjnego (OSD) w programie Microsoft® System Center 2012 R2 Configuration Manager. UDI jest częścią zestawu narzędzi wdrażania firmy Microsoft (MDT).

Wprowadzenie

Zazwyczaj podczas wdrażania systemów operacyjnych przy użyciu funkcji OSD należy podać wszystkie informacje niezbędne do wdrożenia systemu operacyjnego. Informacje są konfigurowane w plikach konfiguracji lub w bazach danych (takich jak plik CustomSettings.ini lub baza danych MDT [MDT DB]). Przed zainicjowaniem wdrożenia należy podać wszystkie ustawienia konfiguracji.

Środowisko UDI udostępnia interfejs oparty na kreatorze, który umożliwia dostarczanie informacji o konfiguracji bezpośrednio przed wdrożeniem. To zachowanie pozwala tworzyć ogólne sekwencje zadań OSD, a następnie dostarczać informacje specyficzne dla komputera w czasie wdrażania, co zapewnia większą elastyczność w procesie wdrażania.

Docelowej

Ten przewodnik jest napisany dla deweloperów, którzy tworzą niestandardowe strony kreatora dla Kreatora UDI i niestandardowych edytorów stron kreatora dla Kreatora UDI Projektant. W tym przewodniku założono, że znasz opracowywanie aplikacji systemu Windows przy użyciu następujących elementów:

  • C++, który służy do tworzenia niestandardowych stron kreatora

  • Microsoft .NET Framework, która służy do tworzenia niestandardowych edytorów stron kreatora

  • Windows Presentation Foundation (WPF), który służy do tworzenia niestandardowych edytorów stron kreatora

  • Języki obsługiwane przez WPF, takie jak C#, C++lub Microsoft Visual Basic® .NET, które są używane do tworzenia niestandardowych edytorów stron kreatora

Informacje o tym przewodniku

Ten przewodnik zawiera niezbędne informacje referencyjne ułatwiające dostosowanie czasu UTI dla organizacji. W tym przewodniku nie omówiono tematów administracyjnych ani operacyjnych, takich jak instalowanie mdt (w tym UDI), konfigurowanie UDI do wdrażania systemów operacyjnych i aplikacji lub wykonywanie wdrożeń przy użyciu Kreatora UDI. Aby uzyskać więcej informacji na te tematy, zobacz tematy UDI w using the Microsoft Deployment Toolkit, który jest dołączony do mdt.

Omówienie PROGRAMOWANIA UDI

Programowanie UDI pozwala rozszerzyć funkcje zapewniane przez UDI. Zazwyczaj programowanie UDI jest wymagane, gdy chcesz zebrać dodatkowe informacje, które wykorzystuje proces wdrażania UDI. Te dodatkowe informacje są zwykle zapisywane jako zmienne sekwencji zadań, które są krokami sekwencji zadań w sekwencji zadań UDI w Configuration Manager odczytu.

Architektura UDI

Ogólnym celem opracowywania UDI jest utworzenie niestandardowych stron kreatora, które mogą być wyświetlane w Kreatorze UDI. Tworząc niestandardowe strony kreatora, możesz rozszerzyć istniejące funkcje UDI w celu spełnienia wymagań biznesowych i technicznych organizacji. Niestandardowa strona kreatora zbiera informacje oprócz stron kreatora lub zamiast nich udostępnianych przez UDI.

Rysunek 1 przedstawia relację między Kreatorem UDI Projektant i Kreatorem UDI.

Rysunek 1. Relacja między Kreatorem UDI i Kreatorem UDI Projektant Rysunek 1. Relacja między Kreatorem UDI i Kreatorem UDI Projektant

Rysunek 1. Relacja między Kreatorem UDI i Kreatorem UDI Projektant

Na poziomie koncepcyjnym programowanie UDI obejmuje tworzenie następujących elementów:

  • Niestandardowe strony kreatora. Strony kreatora są wyświetlane w Kreatorze UDI i zbierają informacje wymagane do ukończenia procesu wdrażania. Strony kreatora są tworzone przy użyciu języka C++ w programie Microsoft Visual Studio®. Niestandardowe strony kreatora są implementowane jako biblioteki DLL odczytane przez Kreatora UDI. Zestaw UDI software development kit (SDK) zawiera przykład tworzenia niestandardowych stron kreatora.

  • Edytory stron kreatora niestandardowego. Edytory stron kreatora umożliwiają skonfigurowanie zachowania strony kreatora niestandardowego. Edytory stron kreatora niestandardowego są implementowane jako biblioteki DLL odczytane przez Kreatora UDI Projektant. Edytory stron kreatora są tworzone przy użyciu:

    • WPF w wersji 4.0

    • Microsoft Prism w wersji 4.0

    • Microsoft Unity Application Block (Unity) w wersji 2.1

      Funkcja MDT zawiera wszystkie zestawy niezbędne do utworzenia niestandardowego edytora stron kreatora do użycia w Kreatorze UDI Projektant. Zestaw UDI SDK zawiera przykład tworzenia niestandardowych edytorów stron kreatora.

    Ponadto Kreator UDI Projektant korzysta z plików konfiguracji edytora stron kreatora pomocniczego. Pliki konfiguracji edytora stron kreatora są tworzone w ramach procesu tworzenia niestandardowych stron kreatora i niestandardowych edytorów stron kreatora. Kreator UDI Projektant tworzy niezbędne informacje XML w pliku konfiguracji Kreatora UDI i odpowiednim pliku .app.

Przygotowywanie środowiska deweloperskiego UDI

Przed rozpoczęciem tworzenia własnych niestandardowych stron kreatora i edytorów stron kreatora wykonaj następujące kroki, aby przygotować środowisko deweloperskie UDI:

  1. Przygotuj wymagania wstępne środowiska deweloperskiego UDI zgodnie z opisem w artykule Przygotowywanie wymagań wstępnych środowiska deweloperskiego UDI.

  2. Skonfiguruj środowisko programistyczne UDI zgodnie z opisem w temacie Konfigurowanie środowiska deweloperskiego UDI.

  3. Sprawdź, czy środowisko deweloperskie UDI jest poprawnie skonfigurowane zgodnie z opisem w temacie Weryfikowanie środowiska deweloperskiego UDI.

Przygotowywanie wymagań wstępnych środowiska deweloperskiego UDI

Aby przygotować wymagania wstępne środowiska deweloperskiego UDI, wykonaj następujące kroki:

  1. Przygotuj wymagania sprzętowe środowiska deweloperskiego UDI zgodnie z opisem w artykule Przygotowywanie wymagań wstępnych dotyczących sprzętu środowiska deweloperskiego UDI.

  2. Przygotuj wymagania dotyczące oprogramowania środowiska deweloperskiego UDI zgodnie z opisem w artykule Przygotowywanie wymagań wstępnych środowiska deweloperskiego UDI.

Przygotowanie wymagań wstępnych dotyczących sprzętu środowiska deweloperskiego UDI

Wymagania wstępne dotyczące sprzętu środowiska deweloperskiego UDI są tymi samymi wymaganiami sprzętowymi dotyczącymi używanej wersji programu Microsoft Visual Studio. Aby uzyskać więcej informacji na temat tych wymagań, zobacz wymagania systemowe dla każdej wersji w dokumentacji programu Visual Studio.

Przygotowywanie wymagań wstępnych dotyczących oprogramowania środowiska deweloperskiego UDI

Środowisko deweloperskie UDI ma następujące wymagania wstępne dotyczące oprogramowania:

  • Każdy system operacyjny Windows obsługiwany przez program Visual Studio 2010 (zaleca się korzystanie z systemu Windows 7 lub Windows Server® 2008 R2).

    Potrzebny będzie system operacyjny Windows, który obsługuje architekturę procesora, dla której chcesz tworzyć. Tworzenie 32-bitowych i 64-bitowych UDI można przeprowadzić przy użyciu 64-bitowego systemu operacyjnego. Programowanie 32-bitowego UDI jest obsługiwane tylko w 32-bitowych systemach operacyjnych. Z tego powodu należy użyć 64-bitowego systemu operacyjnego.

    Uwaga

    Wersje intelitanium (IA-64) systemu operacyjnego Windows nie są obsługiwane w środowiskach deweloperskich UDI.

    Aby uzyskać więcej informacji na temat systemów operacyjnych obsługiwanych przez program Visual Studio 2010, zobacz wymagania systemowe dla każdej wersji w dokumentacji programu Visual Studio.

  • Microsoft .NET Framework wersji 4.0 (wymaganej przez program Visual Studio 2010)

  • Język C++ (język używany w rozszerzaniu stron Kreatora UDI)

  • Inne języki obsługiwane przez WPF, takie jak C#, Visual Basic .NET lub C++/Common Language Infrastructure, które są używane do rozszerzania Kreatora UDI Projektant edytorów stron kreatora

    Uwaga

    Przykładowy kod źródłowy kreatora UDI Projektant edytorów stron kreatora jest napisany w języku C#. Zainstaluj język C#, jeśli chcesz użyć przykładowego kodu źródłowego.

Konfigurowanie środowiska deweloperskiego UDI

Po spełnieniu wymagań wstępnych środowiska deweloperskiego UDI wykonaj następujące kroki, aby skonfigurować środowisko deweloperskie UDI:

  1. Zainstaluj program Visual Studio 2010.

    Upewnij się, że zainstalowano język C++ i dowolny inny język obsługiwany przez WPF.

    Uwaga

    Przykładowy kod źródłowy kreatora UDI Projektant stron edytora jest napisany w języku C#. Zainstaluj język C#, jeśli chcesz użyć przykładowego kodu źródłowego.

    Aby uzyskać więcej informacji na temat instalowania programu Visual Studio 2010, zobacz Instalowanie programu Visual Studio.

  2. Zainstaluj usługę MDT.

    Aby uzyskać więcej informacji na temat sposobu instalowania oprogramowania MDT, zobacz sekcję "Instalowanie lub uaktualnianie do mdt" w dokumencie MDT Using the Microsoft Deployment Toolkit (Instalowanie lub uaktualnianie do mdt) w dokumencie MDT using the Microsoft Deployment Toolkit (Instalowanie lub uaktualnianie do mdt) w dokumencie MDT using the Microsoft Deployment Toolkit (Używanie zestawu narzędzi wdrażania firmy Microsoft).

  3. W Eksploratorze Windows utwórz local_folder (gdzie local_folder jest dowolnym folderem znajdującym się na dysku lokalnym na komputerze deweloperskim).

  4. Skopiuj folder installation_folder\SDK do local_folder (gdzie installation_folder jest folderem, w którym zainstalowano oprogramowanie MDT, a local_folder jest dowolnym folderem znajdującym się na dysku lokalnym na komputerze deweloperskim).

    Folder zestawu SDK jest kopiowany do innej lokalizacji, ponieważ mdt jest zainstalowany w folderze Pliki programu, do którego nie można zapisać bez podwyższonego poziomu uprawnień. Skopiowanie folderu zestawu SDK do innej lokalizacji umożliwia modyfikowanie plików w folderze zestawu SDK bez konieczności używania uprawnień z podwyższonym poziomem uprawnień.

  5. Skopiuj folder installation_folder\Templates\Distribution\Tools do local_folder (gdzie installation_folder jest folderem, w którym zainstalowano usługę MDT, a local_folder jest folderem utworzonym wcześniej w tym procesie).

  6. Zmień nazwę folderu local_folder\Tools na local_folder\OSDSetupWizard (gdzie local_folder jest folderem utworzonym wcześniej w tym procesie).

    Po zakończeniu struktura folderów pod local_folder powinna wyglądać podobnie do struktury folderów przedstawionej na rysunku 2 (gdzie local_folder jest folderem utworzonym wcześniej w procesie i jest wyświetlana jako UDIDevelopment na rysunku).

    Rysunek 2. Struktura folderów dla programowania UDI Rysunek 2. Struktura folderów na potrzeby programowania UDI

    Rysunek 2. Struktura folderów na potrzeby programowania UDI

Weryfikowanie środowiska deweloperskiego UDI

Po skonfigurowaniu środowiska deweloperskiego UDI sprawdź, czy środowisko projektowe UDI jest poprawnie skonfigurowane, zapewniając, że przykładowe projekty są prawidłowo kompilowane w programie Visual Studio 2010.

Sprawdź, czy środowisko deweloperskie UDI jest poprawnie skonfigurowane, określając, czy:

Sprawdź, czy projekt SamplePage jest poprawnie kompilowany

Projekt SamplePage zawiera przykład tworzenia niestandardowej strony kreatora dla Kreatora UDI. Aby uzyskać więcej informacji na temat projektu SamplePage, zobacz Przeglądanie rozwiązania SamplePage Visual Studio.

Aby sprawdzić, czy projekt SamplePage jest poprawnie skompilowany

  1. Uruchom program Visual Studio 2010.

  2. Otwórz projekt SamplePage.

    Projekt SamplePage znajduje się w folderze local_folder\SDK\UDI\SamplePage (gdzie local_folder jest folderem utworzonym wcześniej w procesie).

  3. W programie Visual Studio 2010 w Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt SamplePage, a następnie wybierz pozycję Właściwości.

    Zostanie wyświetlone okno dialogowe Strony właściwości SamplePage .

  4. W oknie dialogowym SamplePage Property Pages (Strony właściwości samplepage ) przejdź do pozycji Właściwości konfiguracji/Debugowanie.

  5. We właściwościach debugowania w obszarze Konfiguracja wybierz pozycję Wszystkie konfiguracje.

  6. We właściwościach debugowania w obszarze Polecenie wpisz $(TargetDir)\OSDSetupWizard.exe.

  7. We właściwościach debugowania w obszarze Katalog roboczy wpisz $(TargetDir).

  8. W oknie dialogowym Strony właściwości SamplePage przejdź do pozycji Właściwości konfiguracji/Zdarzenia kompilacji/Zdarzenie po kompilacji.

  9. We właściwościach zdarzenia po kompilacji w obszarze Wiersz polecenia wpisz następujące polecenie:

    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. W oknie dialogowym SamplePage Property Pages (Strony właściwości SamplePage ) wybierz przycisk OK.

  11. Zapisz projekt.

  12. Z menu Debugowanie wybierz pozycję Rozpocznij debugowanie.

    Zostanie wyświetlone okno dialogowe Programu Microsoft Visual Studiowskazujące, że źródło jest nieaktualne i zostanie wyświetlone pytanie, czy chcesz skompilować projekt.

  13. W oknie dialogowym Microsoft Visual Studio wybierz pozycję Tak.

    Zostanie wyświetlone okno dialogowe Brak informacji debugowania informujące o tym, że żadne informacje debugowania nie są dostępne dla OSDSetupWizard.exe.

  14. W oknie dialogowym Brak informacji debugowania wybierz pozycję Tak.

    Zostanie otwarty Kreator UDI z wyświetloną stroną kreatora niestandardowego.

  15. Sprawdź, czy możesz wybrać wartość w obszarze Wybierz lokalizację.

  16. W kreatorze z formularzem przykładowej strony wybierz pozycję Anuluj.

    Zostanie wyświetlone okno dialogowe Kreator anulowania .

  17. W oknie dialogowym Kreator anulowania wybierz pozycję Tak.

  18. Zamknij program Visual Studio 2010.

Sprawdź, czy projekt SampleEditor jest poprawnie kompilowany

Projekt SampleEditor zawiera przykład tworzenia niestandardowego edytora stron kreatora dla Kreatora UDI Projektant. Aby uzyskać więcej informacji na temat projektu SampleEditor, zobacz Przeglądanie rozwiązania SamplePage Visual Studio.

Aby sprawdzić, czy projekt SampleEditor jest poprawnie skompilowany

  1. Uruchom program Visual Studio 2010.

  2. Otwórz projekt SampleEditor.

    Projekt SampleEditor znajduje się w folderze local_folder\SDK\UDI\SampleEditor (gdzie local_folder jest folderem utworzonym wcześniej w procesie).

  3. W programie Visual Studio 2010 w Eksplorator rozwiązań wybierz projekt SampleEditor.

  4. Z menu Project (Projekt ) wybierz pozycję Dodaj odwołanie.

    Zostanie otwarte okno dialogowe Dodawanie odwołania .

  5. W oknie dialogowym Dodawanie odwołania wybierz kartę Przeglądaj .

  6. Na karcie Przeglądaj przejdź do installation_folder\Bin (gdzie installation_folder jest folderem, w którym zainstalowano mdt). Wybierz następujące pliki, a następnie wybierz przycisk 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

    Uwaga

    Możesz wybrać wiele plików na karcie Przeglądaj , przytrzymując klawisz CTRL podczas wybierania plików.

  7. W Eksplorator rozwiązań przejdź do pozycji SampleEditor/References.

  8. Sprawdź, czy żadne odwołanie nie ma żadnych ostrzeżeń lub błędów.

  9. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt SampleEditor, a następnie wybierz pozycję Właściwości.

    Zostanie wyświetlone okno dialogowe Strony właściwości SampleEditor .

  10. W oknie dialogowym SampleEditor Property Pages (Przykładowe strony właściwości) wybierz kartę Debugowanie .

  11. Na karcie Debugowanie wybierz pozycję Uruchom program zewnętrzny.

  12. W obszarze Uruchom program zewnętrzny wpisz installation_folder\Bin\UDIDesigner.exe (gdzie installation_folder jest folderem, w którym zainstalowano mdt), a następnie wybierz przycisk OK.

    Porada

    Możesz wybrać przycisk wielokropka (...), aby przejść do folderu i wybrać pozycję UDIDesigner.exe.

  13. Z menu Plik wybierz pozycję Zapisz wszystko.

  14. Skopiuj plik \SDK\SamplePage\SamplePage.dll.config local_folder do folderu installation_folder\Bin\Config (gdzie local_folder jest folderem utworzonym na komputerze deweloperskim wcześniej w procesie konfiguracji, ainstallation_folder jest folderem, w którym zainstalowano mdt).

  15. W programie Visual Studio 2010 z menu Debugowanie wybierz pozycję Rozpocznij debugowanie.

    Zostanie uruchomiony kreator UDI Projektant.

  16. W Kreatorze UDI Projektant na wstążce wybierz pozycję Otwórz.

    Zostanie wyświetlone okno dialogowe Otwieranie .

  17. W oknie dialogowym Otwieranie otwórz plik \SDK\SamplePage\SamplePage\Config.xml local_folder (gdzie local_folder jest folderem utworzonym na komputerze deweloperskim wcześniej w procesie konfiguracji).

    Zostanie otwarty plik Config.xml, a w okienku szczegółów zostanie wyświetlona niestandardowa grupa etapów .

  18. W okienku szczegółów wybierz kartę Konfiguruj .

  19. Przejrzyj informacje o konfiguracji pola Lokalizacja , w tym następujące informacje:

    • Odblokowany przycisk, za pomocą którego można włączyć lub wyłączyć pole Lokalizacja

    • Pole wartości domyślnej, w którym wprowadź wartość domyślną, która ma być wyświetlana w polu Lokalizacja

    • Przyjazna nazwa wyświetlana widoczna na stronie podsumowania, w której wprowadza się podpis informacji wyświetlanych na stronie Podsumowanie

    • Pole listy lokalizacji , które zawiera listę możliwych lokalizacji

  20. Zamknij Projektant Kreatora UDI.

  21. Zamknij program Visual Studio 2010.

Przeglądanie przykładów zestawu UDI SDK

Przed rozpoczęciem opracowywania zapoznaj się z przykładami podanymi w zestawie UDI SDK. Skorzystaj z informacji zawartych w tym przewodniku i kodu źródłowego w przykładach, aby ułatwić tworzenie własnych niestandardowych stron kreatora UDI i edytorów stron kreatora.

Zapoznaj się z przykładami zestawu UDI SDK, przeglądając następujące elementy:

Przejrzyj zawartość folderu zestawu SDK

Podczas konfiguracji środowiska deweloperskiego UDI skopiowano folder zestawu SDK z folderu, w którym zainstalowano mdt, do innego utworzonego folderu. Tabela 1 zawiera listę folderów znajdujących się bezpośrednio pod folderem zestawu SDK i zawiera krótki opis każdego z nich.

Tabela 1. Foldery w zestawie UDI SDK

Folder Ten folder zawiera
Zawiera Pliki nagłówka języka C++ niezbędne do utworzenia niestandardowych stron kreatora dla Kreatora UDI
Libs Pliki biblioteki języka C++, które zostaną połączone ze stroną niestandardową; Istnieją 32-bitowe i 64-bitowe wersje bibliotek łączy statycznych. Uwaga: Wersje itanium bibliotek (IA-64) są niedostępne.
SampleEditor Projekt programu Visual Studio służący do tworzenia edytora niestandardowego służącego do edytowania strony SamplePage w Kreatorze UDI Projektant, który jest napisany w języku C#
SamplePage Projekt programu Visual Studio służący do tworzenia niestandardowej strony kreatora UDI, która jest napisana w języku Visual C++

Przejrzyj rozwiązanie SamplePage Visual Studio

Przed rozpoczęciem tworzenia niestandardowych stron kreatora i edytorów stron kreatora wykonaj następujące zadania, aby przygotować środowisko projektowe UDI:

Przegląd cyklu życia strony kreatora

Strona kreatora UDI zawiera metody odpowiadające poszczególnym etapom (lub fazom) cyklu życia strony. W ramach tworzenia niestandardowej strony kreatora należy zastąpić te metody kodem. Tabela 2 zawiera listę metod, które należy zastąpić, i zawiera krótki opis każdej metody, w tym informacje o tym, kiedy używać metody w cyklu życia strony kreatora.

Tabela 2. Metody w cyklu życia strony kreatora

Metoda Opis
OnWindowCreated Ta metoda jest wywoływana raz po utworzeniu okna strony.

W przypadku tej metody napisz kod, który inicjuje stronę po raz pierwszy i musi zostać wykonany tylko raz. Na przykład użyj tej metody, aby zainicjować pola lub odczytać informacje o konfiguracji z elementów Setter w pliku konfiguracji Kreatora UDI.
OnWindowShown Ta metoda jest wywoływana za każdym razem, gdy strona jest wyświetlana (pokazana) w Kreatorze UDI. Jest ona wywoływana przy pierwszym wyświetleniu strony i za każdym razem, gdy przechodzisz do strony, wybierając pozycję Dalej lub Wstecz w kreatorze.

W przypadku tej metody napisz kod, który przygotowuje stronę do wyświetlenia — na przykład odczyt zmiennych pamięci, zmiennych sekwencji zadań lub zmiennych środowiskowych, a następnie aktualizuje stronę na podstawie wszelkich zmian w tych zmiennych.
OnCommonControlEvent Tę metodę można wywołać za każdym razem, gdy zostanie wyświetlona strona kreatora i otrzyma komunikat WM_NOTIFY od elementu podrzędnego (zazwyczaj typowe kontrolki).

Dla tej metody napisz kod, który obsługuje WM_NOTIFY na podstawie komunikatu powiadomienia. Na przykład możesz chcieć reagować na zdarzenia ze wspólnej kontrolki, takie jak reagowanie na zdarzenia wybierania lub dwukrotnego kliknięcia kontrolki TreeView .
OnUnhandledEvent Ta metoda jest wywoływana za każdym razem, gdy dla strony kreatora wystąpi nieobsługiwany komunikat okna. Ta metoda zapewnia możliwość przechwycenia i obsługi tych nieobsługiwanych komunikatów okien.

W przypadku tej metody napisz kod, który obsługuje komunikaty okien, które są odpowiednie dla strony kreatora. Zazwyczaj nie trzeba zastępować tej metody.
OnNextSelected Ta metoda jest wywoływana po wybraniu przycisku Dalej w kreatorze.

W przypadku tej metody napisz kod, który wykonuje wszelkie niezbędne akcje przed przejściem do następnej strony kreatora — na przykład wykonywanie walidacji, która może zająć dużo czasu. Jeśli weryfikacja nie powiedzie się, możesz anulować następne żądanie i wyświetlić komunikat.
OnWindowHidden Ta metoda jest wywoływana za każdym razem, gdy strona jest ukryta po wyświetleniu poprzedniej lub następnej strony kreatora.

W przypadku tej metody napisz kod, który wykonuje wszelkie akcje przed ukryciem strony przed wyświetleniem innej strony. Zazwyczaj nie trzeba zastępować tej metody.

Przejrzyj przykład samplepage

Przejrzyj przykład samplepage, korzystając z poniższej listy, która reprezentuje sekwencję zdarzeń podczas cyklu życia strony kreatora przykładu SamplePage:

  1. Kreator UDI, OSDSetupWizard.exe, odczytuje informacje o konfiguracji z pliku konfiguracji Kreatora UDI w przykładzie (pliku Config.xml) zgodnie z opisem w kroku 1: Kreator UDI (OSDSetupWizard.exe) odczytuje plik Config.xml.

  2. Kreator UDI ładuje biblioteki DLL wymagane dla każdej strony kreatora wymienionej w pliku konfiguracji Kreatora UDI zgodnie z opisem w kroku 2: Kreator UDI ładuje bibliotekę DLL dla strony Kreatora niestandardowego.

  3. Kreator UDI wyświetla stronę kreatora niestandardowego i umożliwia żądaną interakcję sterowania zgodnie z opisem w kroku 3. Kreator UDI wyświetla stronę Kreatora niestandardowego.

  4. Gdy strona kreatora niestandardowego zbierze informacje, przed wybraniem przycisku Dalej wykonaj wszelkie niezbędne zadania, aby przejść do następnego kreatora zgodnie z opisem w sekcji Krok 4: Następny przycisk jest zaznaczony na stronie Kreatora niestandardowego.

Krok 1. Kreator UDI (OSDSetupWizard.exe) odczytuje plik Config.xml

Po uruchomieniu Kreatora UDI (OSDSetupWizard.exe) domyślnie odczytuje plik konfiguracji Kreatora UDI, który jest plikiem UDIWizard_Config.xml — podstawowym plikiem konfiguracji Kreatora UDI.

Uwaga

W przykładzie użyto pliku Config.xml jako pliku konfiguracji. W rozwiązaniu MDT domyślnym plikiem konfiguracji jest plik UDIWizard_Config.xml, który znajduje się w folderze Scripts w pakiecie MDT Files na potrzeby konfiguracji.

Domyślny plik konfiguracji używany przez Kreatora UDI można zastąpić, modyfikując krok sekwencji zadań Kreatora UDI w celu użycia parametru /definition . Aby uzyskać więcej informacji na temat zastępowania domyślnego pliku konfiguracji używanego przez Kreatora UDI, zobacz "Zastępowanie pliku konfiguracji używanego przez Kreatora UDI".

Elementy najwyższego poziomu w pliku Config.xml są

  • DLL , element

  • Styl , element

  • Element Pages

  • StageGroups , element

    Aby uzyskać więcej informacji na temat schematu pliku konfiguracji Kreatora UDI i każdego z tych elementów, zobacz Dokumentacja schematu pliku konfiguracji kreatora UDI.

    Kreator UDI skanuje element biblioteki DLL w poszukiwaniu plików .dll do załadowania. W tym przykładzie są wyświetlane dwa pliki .dll: SamplePage.dll i SharedPages.dll. Te pliki .dll muszą znajdować się w tym samym folderze co OSDSetupWizard.exe — folder Tools\platform (gdzie platforma jest x86 dla wersji 32-bitowej lub x64 dla wersji 64-bitowej).

    Kreator UDI skanuje element Pages w poszukiwaniu zdefiniowanych stron. W tym przykładzie zdefiniowano dwie strony: Custom i SummaryPage. Atrybut Typ elementu Page jest zdefiniowany w pliku PageClassIDs.h i jednoznacznie definiuje typ strony niestandardowej.

    W tym przykładzie zdefiniowany typ to Microsoft.SamplePage.LocationPage. Na stronie niestandardowej zastąp następujące elementy, aby uniknąć potencjalnych konfliktów z innymi stronami, które można utworzyć w przyszłości:

  • Nazwa organizacji w miejscu firmy Microsoft.

  • Nazwa projektu w miejscu samplePage.

  • Nazwa strony kreatora niestandardowego w miejscu LocationPage.

Krok 2. Kreator UDI ładuje bibliotekę DLL dla strony Kreatora niestandardowego

Gdy Kreator UDI ładuje bibliotekę DLL, wywołuje funkcję RegisterFactories , która musi zostać zaimplementowana w pliku .dll. W tym przykładzie ta funkcja jest implementowana w pliku dllmain.ccp. Każda utworzona strona kreatora musi zaimplementować funkcję RegisterFactories .

Funkcja RegisterFactories służy do rejestrowania klasy fabryki strony kreatora w rejestrze fabryki klas dla Kreatora UDI. Fabryki klas to klasy, które mogą tworzyć wystąpienie innej klasy. Funkcja RegisterFactories tworzy nowe wystąpienie klasy factory i przekazuje tę klasę do rejestru fabryki klas dla Kreatora UDI, co udostępnia tę klasę fabryki kreatorowi. Kreator UDI szuka klasy fabryki zarejestrowanej przy użyciu identyfikatora zgodnego z atrybutem Type elementu Page dla strony kreatora niestandardowego.

W tym przykładzie identyfikator jest definiowany jako ID_Location w pliku PageClassIds.h jako Microsoft.SamplePage.LocationPage, który jest zgodny z atrybutem Type elementu Page w pliku Config.xml. ID_Location jest przekazywana jako parametr w funkcji RegisterFactories zaimplementowanego w pliku dllmain.ccp.

Funkcję można utworzyć przy użyciu szablonu funkcji Register_name , aby uprościć tworzenie nowego wystąpienia fabryki i zarejestrować nowo utworzone wystąpienie. Wartość nazwy podana przy użyciu szablonu funkcji Register musi zaimplementować interfejs iClassFactory . Klasa ClassFactoryImpl obsługuje większość szczegółów dotyczących implementowania fabryki klas.

Można również użyć funkcji RegisterFactories do rejestrowania typów zadań i typów modułów walidatora. Aby uzyskać więcej informacji, zobacz następujące artykuły:

Uwaga

Przykład zawiera i rejestruje tylko jedną niestandardową stronę kreatora. Przykład nie obejmuje zadań niestandardowych ani modułów walidatorów, dlatego nie rejestruje żadnych niestandardowych zadań ani modułów walidatorów.

Krok 3. Kreator UDI wyświetla stronę Kreatora niestandardowego

Strona kreatora niestandardowego w przykładzie jest zdefiniowana w pliku LocationPage.cpp. Strony kreatora pochodzą z klas szablonów, które zapewniają wiele funkcji dostępnych na stronie. Wszystkie strony kreatora powinny pochodzić z klasy szablonu WizardPageImpl, która implementuje interfejs IWizardPage. Każda strona kreatora może implementować inne opcjonalne klasy szablonów i odpowiednie interfejsy w zależności od potrzeb strony.

Klasa szablonu WizardPageImpl ma kilka przydatnych interfejsów, które mogą ułatwić pisanie niestandardowych stron kreatora. Zaimplementuj klasę szablonu WizardPageImpl jako klasę podstawową dla strony kreatora niestandardowego.

Aby uzyskać listę dostępnych elementów:

  • Klasy szablonów dla stron kreatora, zobacz Wizard Page Helper Classes (Klasy pomocników stron kreatora)

  • Interfejsy dla klas szablonów stron kreatora można znaleźć w temacie Wizard Page Interfaces (Interfejsy stron kreatora)

    Strona kreatora niestandardowego w przykładzie pochodzi z klasy szablonu WizardPageImpl i implementuje interfejs IWizardPage. Ponadto niestandardowa strona kreatora implementuje interfejs IFieldCallback . Oba te elementy są implementowane w pliku LocationPage.cpp.

    Przykładowa strona kreatora niestandardowego zastępuje następujące metody:

  • OnWindowCreated. Metoda OnWindowCreated na przykładowej stronie kreatora wywołuje następujące metody:

    • AddField. Ta metoda wiąże kontrolkę pola IDC_COMBO_LOCATION w zasobie IDD_LOCATION_PAGE z elementem Dane o nazwie Location w pliku Config.xml.

      Oprócz metody AddField można użyć metod AddRadioGroup i AddToGroup do obsługi innych kontrolek i zachowań.

      Uwaga

      Przed wywołaniem metody InitFields upewnij się, że wywołujesz metodę AddField, AddRadioGroup lub AddToGroup.

    • InitFields. Ta metoda służy do inicjowania pól (kontrolek), które zostały dodane do formularza. Wskaźnik strony jest parametrem. W tym przykładzie ten wskaźnik jest przekazywany, co odnosi się do bieżącej strony.

      Uwaga

      Aby obsługiwać użycie tego wskaźnika, należy zaimplementować interfejs IFieldCallback oprócz interfejsów obsługiwanych przez klasę szablonów WizardPageImpl .

      Interfejs IFieldCallback wywołuje metodę SetFieldDefault , która służy do ustawiania wartości domyślnych kontrolek innych niż pola tekstowe i kontrolek pól wyboru. W tym przykładzie metoda SetFieldDefault ustawia początkowy indeks kontrolki pola kombi na podstawie wartości domyślnej określonej w elemencie Default elementu Field w pliku Config.xml.

      Metoda OnWindowCreated konfiguruje kontroler formularzy przy użyciu interfejsu IFormController. Aby uzyskać więcej informacji na temat konfigurowania kontrolera formularzy, zobacz Konfigurowanie formularza.

  • InitLocations. Ta metoda wypełnia pole kombi z listy lokalizacji w pliku Config.xml. Element Dane i podrzędne elementy DataItem w pliku Confg.xml zawierają listę możliwych wartości.

  • OnNextSelected. Ta metoda wykonuje następujące zadania:

    • Aktualizacje zmiennej sekwencji zadań TSLocation z wartością wybraną w polu kombi przy użyciu metody SaveFields

    • Dodaje informacje, które będą wyświetlane na stronie Podsumowanie przy użyciu metody SaveFields

Krok 4. Na stronie Kreatora niestandardowego wybrano następny przycisk

Gdy użytkownik ukończy pola na stronie kreatora niestandardowego, wybierz przycisk Dalej, który wywołuje metodę OnNextSelected . Metoda OnNextSelected wykonuje wszelkie niezbędne zadania przed przejściem do następnej strony kreatora, takie jak rejestrowanie wszelkich zmian konfiguracji wprowadzonych na stronie kreatora niestandardowego.

Na przykładowej stronie kreatora niestandardowego zastąpienie metody OnNextSelected jest implementowane w pliku LocationPage.ccp. W metodzie OnNextSelected na przykładowej stronie kreatora niestandardowego są wywoływane następujące metody:

  1. InitSection. Ta metoda inicjuje nagłówek (etykieta podpis) dla danych podsumowania wyświetlanych na stronie Podsumowanie. Zazwyczaj można ustawić tę wartość przy użyciu funkcji DisplayName( ). Dane skojarzone z tym podpis są zapisywane przy użyciu metody SaveFields.

  2. SaveFields. Ta metoda zapisuje wartości pól w zmiennych sekwencji zadań i w danych wyświetlanych na stronie Podsumowanie .

Zapoznaj się z rozwiązaniem SampleEditor Visual Studio

Przed rozpoczęciem tworzenia własnych niestandardowych stron kreatora i edytorów stron kreatora wykonaj następujące kroki, aby przygotować środowisko deweloperskie UDI:

Przejrzyj architekturę Projektant Kreatora UDI

Kreator UDI Projektant został opracowany przy użyciu WPF, Prism i Unity. Projektant UDI służy do edytowania pliku konfiguracji Kreatora UDI (UDIWizard_Config.xml), który Kreator UDI (OSDSetupWizard.exe) odczytuje w czasie wykonywania. Element Pages w pliku konfiguracji Kreatora UDI zawiera listę stron, które mają oddzielny element Page dla każdej strony kreatora.

Podczas edytowania ustawień konfiguracji strony kreatora Kreator UDI Projektant ładuje niestandardowy edytor stron odpowiadający typowi strony kreatora. Edytory stron kreatora niestandardowego są opracowywane jako kontrolki użytkownika WPF. Niestandardowe strony edytora stron kreatora używają wzorca projektu Model-View-ViewModel (MVVM) dla platformy WPF.

Wzorzec projektu MVVM pomaga oddzielić interfejs użytkownika (interfejs użytkownika; prezentację) od prezentowanych danych. Dane są fasadą elementu Page w pliku konfiguracji Kreatora UDI (pliku Config.xml w przykładzie), do którego uzyskuje się dostęp przy użyciu właściwości CurrentPage interfejsu IDataService .

Kreator UDI Projektant używa elementu DependencyAttribute w celu uzyskania dostępu do klasy DataService na podstawie struktury wstrzykiwania zależności w środowisku Unity. Aby uzyskać więcej informacji na temat struktury wstawiania zależności w środowisku Unity, zobacz Wstrzykiwanie pewnego życia do aplikacji — poznawanie bloku aplikacji aparatu Unity.

Przejrzyj konfigurowalne składniki strony Kreatora UDI

Podczas tworzenia strony kreatora niestandardowego niektóre ustawienia konfiguracji mogą być ustawione w kodzie i nie można ich zmienić po skompilowaniu strony. Jednak w przypadku innych ustawień konfiguracji należy zezwolić na zmianę tych ustawień konfiguracji przy użyciu Kreatora UDI Projektant.

Zazwyczaj ustawienia konfiguracji, które chcesz skonfigurować przy użyciu Kreatora UDI, Projektant są zapisywane w pliku konfiguracji Kreatora UDI (pliku Config.xml w przykładzie). W razie potrzeby można jednak również utworzyć własny oddzielny plik konfiguracji. Jednym z przykładów użycia oddzielnego pliku konfiguracji jest plik UDIWizard_Config.xml.app, którego używają zadanie odnajdywania aplikacji i typ strony kreatora applicationpage .

Poniżej przedstawiono listę typowych ustawień konfiguracji, które można zarządzać przy użyciu Kreatora UDI Projektant:

  • Pole. Użyj pól, aby umożliwić użytkownikom podanie danych wejściowych. Pola są wyświetlane jako elementy pola w pliku konfiguracji Kreatora UDI (UDIWizard_Config.xml), który zawiera ustawienia konfiguracji dla każdego pola. Odpowiedni edytor stron kreatora musi podać metodę edytowania ustawień konfiguracji pola przy użyciu kontrolki FieldElementControl.

  • Właściwości. Elementy ustawiące ułatwiają tworzenie właściwości jednostek na stronie, takich jak strony w elemencie Page , pola w elemencie Field lub dane w elementach Data lub DataItem . Właściwości można skonfigurować w elementach Setter . Dodaj oddzielny element Setter dla każdej właściwości, którą chcesz zdefiniować. Właściwości można edytować przy użyciu kontrolki SetterControl i konfigurować inne elementy Setter przy użyciu innych kontrolek.

  • Dane. Dane są używane do przechowywania informacji do użycia przez stronę kreatora i inne składniki. Dane dla stron lub pól można zdefiniować przy użyciu elementów Data lub DataItem . Dane można zdefiniować w strukturze płaskiej lub hierarchicznej dzięki prawidłowemu użyciu elementów Data lub DataItem . Config.xml w przykładzie w zestawie SDK pokazuje, jak tworzyć płaskie struktury danych.

    Utworzony niestandardowy edytor stron kreatora musi mieć możliwość zarządzania tymi ustawieniami konfiguracji.

Przejrzyj przykład editorpage

Przykład EditorPage służy do konfigurowania ustawień konfiguracji strony kreatora SamplePage w pliku konfiguracji Kreatora UDI. Przykład editorpage zawiera następujące składniki podstawowe:

  • Interfejs użytkownika do konfigurowania ustawień pola kombi Lokalizacja

  • Interfejs użytkownika służący do dodawania lub edytowania lokalizacji na liście możliwych lokalizacji, które są wyświetlane w polu kombi Lokalizacja

  • Ustawienia konfiguracji odczytane i zapisane w pliku konfiguracji Kreatora UDI

  • Kod pomocniczy dla innych składników

    Przejrzyj przykład editorpage w programie Visual Studio, wykonując następujące kroki:

  1. Zapoznaj się ze sposobem ładowania i inicjowania edytora stron kreatora SampleEditor w Kreatorze UDI Projektant zgodnie z opisem w temacie Przeglądanie kreatora ładowania i inicjowania edytora stron.

  2. Przejrzyj interfejs użytkownika używany do edytowania pola kombi Lokalizacja w pliku LocationPageEditor.xaml i LocationPageEditor.xaml.cs plików zgodnie z opisem w artykule Przeglądanie interfejsu użytkownika używanego do konfigurowania pola kombi lokalizacji.

  3. Przejrzyj interfejs użytkownika używany do dodawania lub edytowania lokalizacji do listy w plikach AddEditLocationView.xaml i AddEditLocationView.xaml.cs zgodnie z opisem w artykule Przeglądanie interfejsu użytkownika używanego do modyfikowania listy możliwych lokalizacji.

  4. Przejrzyj kod używany do zarządzania informacjami o konfiguracji zapisanymi w pliku konfiguracji Kreatora UDI, zgodnie z opisem w artykule Przeglądanie kodu używanego do zarządzania informacjami o konfiguracji.

Przeglądanie ładowania i inicjowania edytora stron Kreatora

Niestandardowe edytory stron kreatora są ładowane zgodnie z wymaganiami Kreatora UDI Projektant. Kreator UDI Projektant pliki konfiguracji są ładowane po uruchomieniu Kreatora UDI Projektant. Kreator UDI Projektant skanuje folder install_folder\Bin\Config (gdzie install_folder jest nazwą folderu, w którym zainstalowano mdt) w poszukiwaniu plików z rozszerzeniem .config pliku.

Podczas konfiguracji środowiska deweloperskiego UDI skopiowano plik SamplePage.dll.confg do folderu install_folder\Bin\Config. Po uruchomieniu Kreatora UDI Projektant plik SamplePage.dll.confg zostanie znaleziony i załadowany.

Kreator UDI Projektant używa następujących atrybutów elementu Page w pliku SamplePage.dll.confg do załadowania i zainicjowania przykładu editorpage:

  • DesignerAssembly. Ten atrybut określa nazwę biblioteki DLL do załadowania. Ta bibliotekę DLL należy umieścić w tym samym folderze co plik UDIDesigner.exe, który jest folderem install_folder\Bin (gdzie install_folder jest nazwą folderu, w którym zainstalowano funkcję MDT).

  • Typ projektanta. Ten atrybut jest nazwą typu Microsoft .NET klasy, która zawiera kontrolkę użytkownika WPF.

  • Wpisz. Ten atrybut służy do konfigurowania typu strony niestandardowej strony kreatora, którą ładuje Kreator UDI. Kreator UDI Projektant używa tego atrybutu do zlokalizowania odpowiedniego elementu Page w pliku konfiguracji Kreatora UDI.

  • Dll. Użyj tego atrybutu, aby skonfigurować element DLL w pliku konfiguracji Kreatora UDI, który kreator UDI Projektant tworzy.

  • Opis. Użyj tego atrybutu, aby podać informacje o edytorze stron kreatora. Wartość tego atrybutu jest wyświetlana w oknie dialogowym Dodawanie nowej strony w Kreatorze UDI Projektant, który służy do dodawania strony kreatora do "Biblioteki stron".

  • DisplayName. Użyj tego atrybutu, aby podać nazwę niestandardowej strony kreatora, która jest wyświetlana w Kreatorze UDI Projektant. Wartość tego atrybutu jest wyświetlana w oknie dialogowym Dodawanie nowej strony w Kreatorze UDI Projektant, który służy do dodawania strony kreatora do "Biblioteki stron".

    W tym przykładzie typ strony kreatora niestandardowego SamplePage to Microsoft.SamplePage.LocationPage, który jest zapisywany w pliku Config.xml. Plik Config.xml znajduje się w folderze local_folder\SDK\SamplePage\SamplePage do folderu (gdzie local_folder jest folderem utworzonym na komputerze deweloperskim wcześniej w procesie konfiguracji).

Zapoznaj się z interfejsem użytkownika używanym do konfigurowania pola kombi lokalizacji

Po załadowaniu i zainicjowaniu edytora stron kreatora edytor stron kreatora SampleEditor jest ładowany po edycji strony o typie Microsoft.SamplePage.LocationPage . Interfejs użytkownika edytora stron jest przechowywany w pliku LocationPageEditor.xaml.

Jeśli sprawdzisz interfejs użytkownika na karcie Projektowanie i kod na karcie XAML , zobaczysz relację między graficznym interfejsem użytkownika a elementami i atrybutami w języku XAML (Extensible Application Markup Language).

Jeśli na przykład przejrzysz element Controls:FieldElementControl w języku XAML, zobaczysz, jak odnosi się to do układu odpowiedniego interfejsu użytkownika. Użyj elementu Controls:FieldElementControl , aby zdefiniować kontrolkę FieldElementControl .

Parametry powiązania w pliku XAML wiążą pola w edytorze przykładowych stron z informacjami w pliku konfiguracji kreatora UDI. Na przykład poniższy kod wiąże pole tekstowe Wartość domyślna z elementem Default w pliku konfiguracji kreatora UDI (Config.xml w przykładzie):

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

Aby uzyskać więcej informacji, zobacz Instrukcje: udostępnianie danych do powiązania w języku XAML.

Użyj elementu Views:CollectionTControl.ColumnCollectionView w języku XAML, aby edytować listę dostępnych lokalizacji w widoku siatki. Kontrolka CollectionTControl służy do wyświetlania widoku siatki i powiązania widoku siatki z elementem Dane o nazwie Lokalizacja w pliku konfiguracji UDI.

Przejrzyj interfejs użytkownika używany do modyfikowania listy możliwych lokalizacji

Interfejs użytkownika do modyfikowania listy możliwych lokalizacji składa się z następujących elementów:

Przejrzyj menu kontekstowe i przyciski wstążki, aby zmodyfikować listę lokalizacji

Po kliknięciu prawym przyciskiem myszy w polu listy zawierającym listę lokalizacji zostanie wyświetlone menu kontekstowe. Wstążka zawiera odpowiednie przyciski, które umożliwiają wykonywanie tych samych zadań. Element kontrolki Views:CollectionsTControl w pliku LocationPageEditor.xaml definiuje metody wywoływane na podstawie podjętej akcji i właściwości ustawionych w następujący sposób:

  • SelectedItem. Ta właściwość powiązana z danymi jest aktywowana, gdy użytkownik wybierze element z listy. Ta właściwość jest powiązana z właściwością CurrentLocation w modelu widoku, która znajduje się w pliku LocationPageEditorViewModel.cs i jest używana przez kontrolkę CollectionTControl do przekazania elementu wybranego podczas edytowania lub usuwania istniejącego elementu.

  • AddItemAction. Ta akcja jest wykonywana, gdy użytkownik wybierze opcję Dodaj element z menu kontekstowego lub odpowiednich przycisków na Wstążce. Istnieje powiązanie danych z właściwością w modelu widoku, które zwraca obiekt AddLocationAction . Ten obiekt jest metodą AddLocationCallback znajdującą się w pliku LocationPageEditorViewModel.cs i wyświetla okno dialogowe w pliku AddEditLocationView.xaml.

  • EditItemAction. Ta akcja jest wykonywana, gdy użytkownik wybierze opcję Edytuj element z menu kontekstowego. Istnieje powiązanie danych z właściwością w modelu widoku, które zwraca obiekt EditLocationAction . Ten obiekt jest metodą EditLocationCallback znajdującą się w pliku LocationPageEditorViewModel.cs i wyświetla okno dialogowe w pliku AddEditLocationView.xaml.

  • RemoveAction. Ta akcja jest wykonywana, gdy użytkownik wybierze opcję Usuń element z menu kontekstowego. Istnieje powiązanie danych z właściwością w modelu widoku, które zwraca obiekt RemoveAction . Ten obiekt jest metodą EditLocationCallback znajdującą się w pliku LocationPageEditorViewModel.cs i wyświetla komunikat potwierdzający usunięcie lokalizacji.

Przejrzyj okno dialogowe dodawania lub edytowania lokalizacji

Jeśli dodasz nową lokalizację do listy lokalizacji lub zmodyfikujesz istniejącą lokalizację, zostanie wyświetlony komunikat w pliku AddEditLocationView.xaml. Komunikat jest wyświetlany przy użyciu metody okna ShowDialogWindow w pliku LocationPageEditorViewModel.cs.

Interfejs użytkownika w pliku AddEditLocationView.xaml składa się z następujących elementów:

  • Ramka okna dialogowego o nazwie DialogFrame zawierająca następujące elementy:

    • Tytuł konfigurowany przy użyciu atrybutu DialogTitle ramki okna dialogowego

    • Przycisk OK , który ustawia stan zwracany dla właściwości Approved na wartość True (Stan zwracany jest sprawdzany w metodzie AddLocationCallback w pliku LocationPageEditorViewModel.cs, aby określić, czy użytkownik wybrał przycisk OK).

    • Przycisk Anuluj , który ustawia stan zwracany dla właściwości Approved na wartość False (stan zwracany jest sprawdzany w metodzie AddLocationCallback w pliku LocationPageEditorViewModel.cs, aby określić, czy użytkownik wybrał opcję Anuluj).

  • Element WPF, który zawiera:

    • Etykieta skonfigurowana przy użyciu atrybutu Zawartość

    • Pole tekstowe powiązane z elementem Dane o nazwie Location w pliku konfiguracji UDI (plik Config.xml w przykładzie)

Przejrzyj kod używany do zarządzania informacjami o konfiguracji

Informacje o konfiguracji strony kreatora niestandardowego są przechowywane w pliku konfiguracji Kreatora UDI, który jest następujący:

  • Config.xml pliku w przykładzie dostarczonym z zestawem UDI SDK (ten plik zawiera tylko ustawienia konfiguracji dla przykładu).

  • UDIWizard_Config.xml plik dostarczony z mdt, przechowywane w folderze installation_folder\Templates\Distribution\Scripts (gdzie installation_folder jest folderem, w którym zainstalowano mdt); ten plik zawiera ustawienia konfiguracji dla wszystkich wbudowanych stron kreatora i etapów

    W przykładzie SampleEditor procedura Lokalizacje ułatwia zarządzanie informacjami o konfiguracji i znajduje się w pliku LocationPageEditorViewModel.cs. Procedura Lokalizacje zwraca listę lokalizacji z pliku konfiguracji Kreatora UDI. W szczególności zwracana lista zawiera element dla każdego elementu DataItem w pliku konfiguracji Kreatora UDI.

Tworzenie niestandardowych stron Kreatora UDI

Proces wysokiego poziomu tworzenia niestandardowych stron kreatora UDI jest następujący:

  1. Utwórz kopię rozwiązania SamplePage jako punkt początkowy.

  2. Umieść żądane kontrolki (pola) w formularzu.

  3. Napisz kod, aby wykonać odpowiednie zadania podczas ładowania strony kreatora (zastępuje metodę OnWindowCreated ), w tym następujące kroki:

    1. Inicjowanie formularza.

    2. Odczytywanie zmiennych pamięci, zmiennych sekwencji zadań, zmiennych środowiskowych lub informacji o pliku XML (takich jak właściwości settera ).

  4. Napisz dowolny kod, aby wykonać odpowiednie zadania, gdy zostanie wyświetlona strona (zastąpi metodę OnWindowShown ), w tym następujące kroki:

    1. Włącz lub wyłącz kontrolki na podstawie informacji odczytanej po załadowaniu strony w kroku 3.

    2. Zaktualizuj kontrolki na podstawie informacji odczytanych po załadowaniu strony w kroku 3, takich jak populacja kontrolek na podstawie odczytanych informacji.

  5. Napisz dowolny kod, aby wykonać odpowiednie zadania, gdy użytkownik wchodzi w interakcję ze stroną kreatora.

  6. Napisz dowolny kod, aby wykonać odpowiednie zadania, gdy użytkownik wybierze pozycję Dalej w Kreatorze UDI (zastępuje metodę OnNextSelected ), w tym następujące kroki:

    1. Zaktualizuj wszelkie zmienne pamięci, zmienne sekwencji zadań, zmienne środowiskowe lub informacje o pliku XML.

    2. Zaktualizuj informacje o stronie podsumowania (jeśli nie są wykonywane przez pola na stronie).

  7. Skompiluj rozwiązanie.

    Upewnij się, że utworzona wersja biblioteki DLL jest tą samą platformą procesora co instalacja mdt — w szczególności platforma procesora dla środowiska preinstalacji systemu Windows (Windows PE). Kreator UDI może działać w:

    • Istniejący system operacyjny na komputerze docelowym. 32-bitowe wersje strony kreatora można uruchamiać w 32-bitowych lub 64-bitowych systemach operacyjnych Windows. Można jednak uruchamiać tylko 64-bitowe wersje strony kreatora w 64-bitowych systemach operacyjnych Windows.

    • Windows PE na komputerze docelowym. System Windows PE nie obsługuje uruchamiania aplikacji 32-bitowych w 64-bitowej wersji środowiska Windows PE. Dlatego musisz utworzyć wersję strony kreatora dla każdej architektury procesora systemu Windows PE, która ma być używana.

  8. Skopiuj bibliotekę DLL dla strony kreatora niestandardowego do folderu installation_folder\Templates\Distribution\Tools\ platform (gdzie installation_folder jest folderem, w którym zainstalowano oprogramowanie MDT, a platforma to x86 dla wersji 32-bitowej lub x64 jest w wersji 64-bitowej).

  9. Wykonaj kroki tworzenia niestandardowego edytora stron.

Tworzenie edytorów stron kreatora niestandardowego

Proces wysokiego poziomu tworzenia niestandardowych edytorów stron kreatora UDI jest następujący:

  1. Utwórz kopię rozwiązania SampleEditor jako punkt początkowy.

  2. Utwórz interfejs użytkownika edytora stron podstawowych w pliku xaml.

  3. Dodaj wystąpienia kontrolki FieldElementControl zgodnie z wymaganiami strony kreatora do skonfigurowania (jeśli jest to wymagane).

  4. Dodaj wystąpienia kontrolki SetterControl zgodnie z wymaganiami strony kreatora do skonfigurowania (jeśli jest to wymagane).

  5. Dodaj wystąpienia kontrolki CollectionTControl zgodnie z wymaganiami strony kreatora do skonfigurowania (jeśli jest to wymagane).

  6. Dodaj interfejs IDataService .

  7. Napisz odpowiedni kod, aby zaktualizować plik konfiguracji Kreatora UDI na podstawie ustawień konfiguracji, które mają zostać skonfigurowane przy użyciu niestandardowego edytora stron kreatora.

  8. Utwórz okna dialogowe podrzędne w pliku xaml i wywołaj je z edytora stron podstawowych przy użyciu interfejsu IMessageBoxService zgodnie z wymaganiami strony kreatora do skonfigurowania.

  9. Dodaj odpowiednie interfejsy do Kreatora UDI Projektant Wstążki na podstawie wymagań strony kreatora do skonfigurowania.

  10. Skompiluj rozwiązanie.

    Uwaga

    Upewnij się, że utworzona wersja biblioteki DLL jest tą samą platformą procesora co instalacja mdt. Jeśli na przykład zainstalujesz 64-bitową wersję mdt, skompiluj 64-bitową wersję niestandardowego edytora stron.

  11. Utwórz kreatora UDI Projektant pliku konfiguracji, aby załadować niezbędne biblioteki DLL i zamapować edytor stron kreatora na odpowiednią stronę kreatora (plik SamplePage.dll.config w przykładzie).

    Aby uzyskać więcej informacji o elementach wymaganych do wykonania mapowania między stroną kreatora a edytorem stron kreatora, zobacz element DesignerMappings , elementy podrzędne i odpowiednie atrybuty.

  12. Skopiuj plik konfiguracji kreatora UDI Projektant utworzony w poprzednim kroku do folderu installation_folder\Bin\Config (gdzie installation_folder jest folderem, w którym zainstalowano wersję MDT).

  13. Skopiuj bibliotekę DLL dla niestandardowego edytora stron kreatora do folderu installation_folder\Bin (gdzie installation_folder jest folderem, w którym zainstalowano funkcję MDT).

Tworzenie niestandardowych zadań UDI

Zadania UDI to biblioteki DLL napisane w języku C++, które implementują interfejs ITask. Bibliotekę DLL można zarejestrować za pomocą Kreatora UDI Projektant biblioteki zadań, tworząc Kreatora UDI Projektant pliku konfiguracji (plik .config) i umieszczając go w folderze installation_folder\Bin\Config (gdzie installation_folder jest folderem, w którym zainstalowano mdt).

Uwaga

Możesz utworzyć bibliotekę DLL zawierającą strony kreatora, zadania i moduły sprawdzania poprawności w tym samym pliku .dll. Można również utworzyć jeden kreator UDI Projektant pliku konfiguracji (.config), który zawiera ustawienia konfiguracji stron kreatora, zadań i modułów sprawdzania poprawności w bibliotekę DLL.

Aby utworzyć niestandardowe zadania UDI

  1. Napisz kod, który implementuje interfejs ITask i następujące metody:

    • Init. Ta metoda jest wywoływana w celu zainicjowania zadania.

    • Wykonaj. Ta metoda jest wywoływana w celu uruchomienia zadania.

  2. Napisz kod, który rejestruje niestandardową fabrykę klas zadań w rejestrze fabryki.

  3. Skompiluj rozwiązanie dla zadania niestandardowego.

    Uwaga

    Upewnij się, że utworzona wersja biblioteki DLL jest tą samą platformą procesora co instalacja mdt. Jeśli na przykład zainstalujesz 64-bitową wersję mdt, skompiluj 64-bitową wersję niestandardowego zadania UDI.

  4. Utwórz element Task w elemencie TaskLibrary w kreatorze UDI Projektant pliku konfiguracji podobnym do następującego fragmentu:

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

    Uwaga

    Wszystkie elementy zadania powinny zawierać parametr BitmapFilename . Określ wszystkie inne parametry zgodnie z wymaganiami zadania. Na przykład w poprzednim fragmencie parametr dziennika służy do określania parametru lokalizacji pliku dziennika.

  5. Skopiuj kreatora UDI Projektant plik konfiguracji utworzony w poprzednim kroku do folderu installation_folder\Bin\Config (gdzie installation_folder jest folderem, w którym zainstalowano mdt).

  6. Skopiuj bibliotekę DLL zadania niestandardowego do folderu platformy installation_folder\Templates\Distribution\Tools\ (gdzie installation_folder jest folderem, w którym zainstalowano oprogramowanie MDT, a platforma to x86 dla wersji 32-bitowej lub x64 jest przeznaczony dla wersji 64-bitowej).

Tworzenie niestandardowych modułów sprawdzania poprawności UDI

Moduły sprawdzania poprawności UDI to biblioteki DLL napisane w języku C++, które implementują interfejs IValidator . Bibliotekę DLL można zarejestrować za pomocą kreatora UDI Projektant biblioteki modułu sprawdzania poprawności, tworząc Kreatora UDI Projektant pliku konfiguracji (plik .config) i umieszczając go w folderze installation_folder\Bin\Config (gdzie installation_folder jest folderem, w którym zainstalowano funkcję MDT).

Aby utworzyć niestandardowe moduły sprawdzania poprawności UDI

  1. Napisz kod, który tworzy podklasę klasy BaseValidator i implementuje następujące metody:

    • Init(IControl *pControl, IWizardPageContainer *pContainer, IStringProperties *pProperties). Kontroler formularzy wywołuje element członkowski Init w celu zainicjowania modułu sprawdzania poprawności. Ta metoda musi wywołać metodę Init dla klasy BaseValidator . Zazwyczaj odczytuje wszystkie właściwości ustawione dla modułu sprawdzania poprawności z pliku konfiguracji Kreatora UDI. Na przykład moduł sprawdzania poprawności InvalidCharactersValidator pobiera wartość właściwości InvalidChars przy użyciu tej metody.

    • IsValid. Kontroler formularzy wywołuje tę metodę, aby sprawdzić, czy kontrolka zawiera prawidłowy tekst. Poniżej przedstawiono przykład metody IsValid dla modułu sprawdzania poprawności, który sprawdza, czy pole nie jest puste:

      BOOL IsValid(LPBSTR pMessage)
      {
          __super::IsValid(pMessage);
      
          _bstr_t text;
          m_pText->GetText(text.GetAddress());
          return (text.length() > 0);
      }
      
    • Init(IControl *pControl, komunikat LPCTSTR). Kontroler formularzy wywołuje ten element członkowski dla każdego naciśnięcia klawisza i innych zdarzeń, aby moduł sprawdzania poprawności mógł zweryfikować zawartość kontrolki i zaktualizować komunikaty w dolnej części strony kreatora (lub wyczyścić je).

      Zazwyczaj są to jedyne metody, które należy zastąpić. Jednak w zależności od modułu sprawdzania poprawności może być konieczne zastąpienie innych metod w podklasie tworzonej klasy BaseValidator . Aby uzyskać więcej informacji na temat tych innych metod, zobacz BaseValidator , klasa.

  2. Napisz kod, który rejestruje niestandardową klasę zadań w fabryce rejestru.

  3. Skompiluj rozwiązanie dla zadania niestandardowego.

    Uwaga

    Upewnij się, że utworzona wersja biblioteki DLL jest tą samą platformą procesora co instalacja mdt. Jeśli na przykład zainstalujesz 64-bitową wersję mdt, skompiluj 64-bitową wersję niestandardowego zadania UDI.

  4. Utwórz element Validator w elemencie ValidatorLibrary w Kreatorze UDI Projektant plik konfiguracji podobny do następującego fragmentu:

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

    Ostrzeżenie

    Wszystkie elementy modułu sprawdzania poprawności powinny zawierać parametr Komunikat . Określ wszystkie inne parametry zgodnie z wymaganiami modułu weryfikatora. Na przykład w poprzednim fragmencie parametr NamedPattern jest używany do określania parametru dla nazwy wstępnie zdefiniowanego wzorca wyrażenia regularnego.

  5. Skopiuj kreatora UDI Projektant plik konfiguracji utworzony w poprzednim kroku do folderu installation_folder\Bin\Config (gdzie installation_folder jest folderem, w którym zainstalowano mdt).

  6. Skopiuj bibliotekę DLL zadania niestandardowego do folderu platformy installation_folder\Templates\Distribution\Tools\ (gdzie installation_folder jest folderem, w którym zainstalowano oprogramowanie MDT, a platforma to x86 dla wersji 32-bitowej lub x64 jest przeznaczony dla wersji 64-bitowej).

Dokumentacja kreatora UDI

Składniki strony Kreatora

Do tworzenia stron niestandardowych można użyć dowolnego z kilku wstępnie utworzonych składników.

Tworzenie wystąpień składników

Kreator UDI używa fabryk klas do tworzenia nowych wystąpień obiektów. Te fabryki są rejestrowane w rejestrze fabryki przy użyciu ciągu jako klucza do fabryki. Na przykład składnik WmiRepository jest identyfikowany przez ciąg "Microsoft.Wizard.WmiRepository", który jest dostępny w pliku nagłówka IWmiRepository jako ID_WmiRepository.

Zakładając, że strona została napisana jako podklasa WizardPageImpl, możesz utworzyć nowe wystąpienie obiektu WmiRepoistory w następujący sposób:

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

Funkcja CreateInstance jest funkcją bezpiecznego dla typu szablonu do tworzenia nowych wystąpień składników. PWmiRepository to inteligentny wskaźnik, który obsługuje zliczanie odwołań.

Składniki creatable

Istnieje zestaw składników, które można zarejestrować w rejestrze. Pierwszy zestaw składników jest zawsze zarejestrowany, ponieważ udostępnia go główny plik wykonywalny Kreatora UDI. Pozostałe dwa zestawy składników są dostępne w "opcjonalnych" bibliotekach DLL. Aby te składniki były dostępne, biblioteka DLL musi być wymieniona w sekcji biblioteki DLL pliku XML .config. Kod nie musi wiedzieć, który plik wykonywalny zawiera określony składnik.

Lista identyfikatorów składników dla składników (nazwa składnika jest taka sama jak identyfikator, ale bez początkowej ID_) zarejestrowana w rejestrze fabryki (zdefiniowana w OSDSetupWizard) jest wyświetlana w tabeli 3.

Tabela 3. Identyfikatory składników

IDENTYFIKATOR Opis
ID_ACPowerTask (ITask, IWizardComponent) Zadanie wstępne, które gwarantuje, że komputer nie jest uruchomiony tylko na baterii
ID_AppDiscoveryTask (ITask, IWizardComponent) Wyspecjalizowane zadanie do odnajdywania elementów oprogramowania zainstalowanych na komputerze
ID_BackgroundTask (IBackgroundTask, IWizardComponent) Może służyć do uruchamiania zadania w innym wątku
ID_CopyFilesTask (ITask, IWizardComponent) Zadanie kopiowania co najmniej jednego pliku
ID_FormController (IFormController) Najbardziej lubisz, aby nie trzeba było samodzielnie tworzyć wystąpienia, ponieważ strona otrzymuje własne wystąpienie
ID_InvalidCharactersValidator (IValidator) Zapewnia, że żadne pole tekstowe nie zawiera znaków z listy dostarczonej do modułu sprawdzania poprawności
ID_Logger (ILogger) Najbardziej lubisz, aby nie trzeba było samodzielnie tworzyć wystąpienia, ponieważ strona otrzymuje wskaźnik do udostępnionego wystąpienia
ID_NonEmptyValidator (IValidator) Moduł sprawdzania poprawności, który zapewnia, że żadne pole nie jest puste
ID_PasswordValidator (IValidator) Moduł sprawdzania poprawności, który zapewnia, że żadne dwa pola tekstowe nie mają tej samej zawartości
ID_Regex (IRegEx) Ocenia wyrażenia regularne w poszukiwaniu dopasowań
ID_RegExValidator (IValidator) Moduł sprawdzania poprawności, który sprawdza poprawność względem wyrażenia regularnego lub znanego wzorca
ID_SimpleStringProperties (IStringProperties, ISimpleStringProperties) Zapewnia prosty sposób wysyłania właściwości do zadań bez użycia kodu XML
ID_ShellExecuteTask (ITask, IWizardComponent) Wykonywanie programu zewnętrznego
ID_SummaryBag (ISummaryBag) Dostępne pośrednio na stronie za pośrednictwem metody Form
ID_TaskManager (ITaskManager, IBackgroundCallback, IWizardComponent) Zarządza uruchamianiem zestawu zadań i interfejsu użytkownika
ID_WmiRepository (IWmiRepository, IWizardComponent) Umożliwia uruchamianie zapytań instrumentacji zarządzania windows (WMI)
ID_IXmlDocument (IXmlDocument) Zapewnia fasadę do odczytywania i pisania dokumentów XML

Zdefiniowane OSDRefreshWizard.dll, strony udostępnione i inne składniki kontrolek są wyświetlane w tabelach 4 i 5.

Tabela 4. Kontrolki katalogów

IDENTYFIKATOR Opis
ID_Directory (IDirectory) Fasada do uzyskiwania informacji o katalogu z systemu plików

Tabela 5. Zdefiniowane SharedPages.dll

IDENTYFIKATOR Opis
ID_ADHelper (IADHelper) Zapewnia fasadę dla ograniczonego zestawu funkcji w usłudze Active Directory® Domain Services (AD DS)
ID_CpuInfo (ICpuInfo) Określa, czy procesor CPU ma 32 czy 64 bity
ID_DomainJoinValidator (IDomainJoinValidator) Ma kilka metod sprawdzania, czy zestaw poświadczeń może dołączyć do domeny
ID_DriveList (IDriveList, IBindableList, IWizardComponent) Używa usługi WMI do uzyskania listy dysków na komputerze
ID_WiredNetworkTask (ITask) Zadania, które sprawdzają, czy masz połączenie z siecią za pomocą przewodowej (zamiast bezprzewodowej) karty sieciowej

Składniki kontrolki

Kontrolki na stronie są używane za pomocą funkcji szablonu GetControlWrapper , która zapewnia dostęp do jednego z typów składników wymienionych w tabeli 6.

Tabela 6. Składniki

Typy kontrolek okien dialogowych Opis
CONTROL_CHECK_BOX (ICheckBox) Fasada do pracy z kontrolkami pól wyboru
CONTROL_COMBO_BOX (IComboBox) Fasada kontrolek pola kombi
CONTROL_GENERIC (IControl) Umożliwia pracę z większością typów kontrolek w celu kontrolowania stanu włączania i widocznego
CONTROL_LIST_VIEW (IListView) Fasada zapewniająca dostęp do funkcji kontrolki widoku listy
CONTROL_PROGRESS_BAR (IProgressBar) Fasada do pracy z położeniem kontrolki paska postępu
CONTROL_RADIO_BUTTON (IRadioButton) Fasada do pracy z kontrolkami przycisków radiowych
CONTROL_STATIC_TEXT (IStaticText) Fasada, która zapewnia uprawnienie do odczytu/zapisu do tekstu kontrolki, na przykład etykiety lub pola tekstowego
CONTROL_TREE_VIEW (ItreeView) Fasada do pracy z kontrolką widoku drzewa

Składnik listy obrazów

Ten składnik jest fasadą kontrolki ImageList na stronie. Listę obrazów można utworzyć za pośrednictwem interfejsu IListView lub ITreeView .

Składnik FormController

Kreator tworzy ten składnik i przekazuje go do strony. Dostęp do niej można uzyskać ze strony przy użyciu metody Form , którą implementuje klasa bazowa WizardPageImpl .

InvalidCharacterValidator, składnik

Jest to typ modułu weryfikatora, który można uwzględnić na stronie. Identyfikator jest ID_InvalidCharactersValidator (zdefiniowany w pliku IValidator.h), który ma wartość tekstową "Microsoft.Wizard.Validation.InvalidChars".

Ten moduł sprawdzania poprawności szuka pojedynczej właściwości (elementu Setter w pliku .config) o nazwie InvalidChars, która jest listą niedozwolonych znaków. Sprawdza znaki w polu tekstowym; Jeśli tekst zawiera znaki z tej listy, składnik zgłasza błąd.

NonEmptyValidator, składnik

Jest to typ modułu weryfikatora, który można uwzględnić na stronie. Identyfikator jest ID_NonEmptyValidator (zdefiniowany w pliku IValidator.h), który ma wartość tekstową "Microsoft.Wizard.Validation.NonEmpty".

Ten moduł sprawdzania poprawności zgłasza błąd, jeśli pole tekstowe (lub dowolna inna kontrolka obsługujące tekst IStaticText) ma pustą wartość ciągu.

PasswordValidator, składnik

Jest to typ modułu weryfikatora, który można uwzględnić na stronie. Identyfikator jest ID_PasswordValidator (zdefiniowany w pliku IValidator.h), który ma wartość tekstową "Microsoft.Wizard.Validation.Password".

Ten moduł sprawdzania poprawności współpracuje z dwoma różnymi kontrolkami tekstowymi (kontrolkami obsługują funkcję IStaticText) i zgłasza błąd, jeśli nie zawierają tych samych wartości. Innymi słowy, niepowodzenie kończy się niepowodzeniem, jeśli pola tekstowe Hasło i Potwierdź hasło nie są zgodne.

Ponieważ ten moduł sprawdzania poprawności wymaga dwóch kontrolek, wymaga większej konfiguracji niż inne moduły sprawdzania poprawności. Konfiguracja może wyglądać mniej więcej tak:

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

Najpierw należy zdefiniować kontrolkę Potwierdź hasło jako "podrzędną" kontrolki Hasło . Dzięki temu, jeśli kontroler formularza wyłączy kontrolkę Hasło , wyłączy również kontrolkę Potwierdź hasło . Następnie dodaj moduł sprawdzania poprawności haseł do formularza. Na koniec podaj moduł sprawdzania poprawności haseł z interfejsem do kontrolki Potwierdź hasło .

Ze względu na wymagania dotyczące dwóch kontrolek należy użyć kodu do skonfigurowania tego modułu sprawdzania poprawności, a nie .config pliku XML.

RegExValidator, składnik

Jest to typ modułu weryfikatora, który można uwzględnić na stronie. Identyfikator jest ID_RegExValidator (zdefiniowany w pliku IValidator.h), który ma wartość tekstową "Microsoft.Wizard.Validation.RegEx".

Ten moduł sprawdzania poprawności porównuje zawartość kontrolki tekstu (która obsługuje tekst IStaticText) z wyrażeniem regularnym i kończy się niepowodzeniem, jeśli tekst nie jest zgodny z wyrażeniem regularnym.

Możesz też użyć tego modułu weryfikatora ze wstępnie zdefiniowanym wzorcem nazwanym. Aby używać wyrażenia regularnego, kod XML musi zawierać właściwość setter o nazwie Pattern. Jeśli chcesz zamiast tego użyć nazwanego wzorca, użyj settera o nazwie NamedPattern ustawionego na jedną z wartości w tabeli 7.

Tabela 7. Nazwane settery wzorców

Wzorzec Opis
Nazwa użytkownika Sprawdza, czy tekst ma postać domain\user lub user@domain
Nazwa_komputera Nazwa musi mieć długość od 1 do 15 znaków i nie może zawierać zestawu znaków (takich jak : i ?)
Workgroup Nazwa musi mieć długość od 1 do 15 znaków i nie może zawierać zestawu znaków (takich jak =, +i ?)

FactoryRegistry, składnik

Ten składnik śledzi wszystkie fabryki i usługi klasy. Implementuje interfejs IFactoryRegistry i jest dostępny pośrednio za pośrednictwem metody kontenera strony. Ponadto rejestr ładuje biblioteki DLL rozszerzeń. Po załadowaniu biblioteki DLL rejestr szuka wyeksportowanych funkcji o nazwie RegisterFactories. Należy zaimplementować tę funkcję i w niej zarejestrować fabryki klas dla stron, zadań i walidatorów (i innych fabryk klas, które chcesz zarejestrować). Oto przykład z przykładowego projektu:

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

Składnik rejestratora

Ten składnik jest dostępny na stronie za pośrednictwem metody Logger (implementowane przez WizardPageImpl). Ta metoda służy do zapisywania wpisów w pliku dziennika. Zawartość pliku dziennika jest przydatna do diagnozowania problemów, w których użytkownicy mogą uruchamiać Kreatora UDI.

PropertyBag, składnik

Worek właściwości jest kontenerem dla zmiennych pamięci. Jest ona dostępna na twojej stronie przy użyciu polecenia Container()->Properties(). Zmienne pamięci są przydatne do przekazywania danych tymczasowych między różnymi stronami.

Składniki TSVariableBag i TSRepository

Składnik TSVariableBag umożliwia odczytywanie i zapisywanie zmiennych sekwencji zadań. Przechowuje wartości w pamięci, dopóki użytkownik nie wybierze opcji Zakończ (domyślnie). Dostęp do torby TSVariable można uzyskać za pomocą metody TSVariables strony (wdrożonej przez klasę bazową WizardPageImpl ). Te składniki rejestrują wszystkie operacje odczytu i zapisu zmiennych sekwencji zadań.

Składnik WmiRepository

Ten składnik zapewnia fasadę do pracy z zapytaniami WMI. Aby uzyskać wystąpienie tego składnika, które obsługuje interfejs IWmiRepository, można wywołać funkcję pomocnika CreateInstance z ID_WmiRepository. Ten składnik zwraca rekordy wyników za pośrednictwem interfejsu IWmiIterator .

Klasy pomocników stron kreatora

Niestandardowe strony kreatora UDI można tworzyć przy użyciu wbudowanych klas pomocniczych dostarczanych z zestawem UDI SDK. Tabela 8 zawiera listę klas pomocniczych, których można użyć do tworzenia niestandardowych stron kreatora.

Tabela 8. Klasy pomocnika

Klasa pomocnika Opis
ClassFactoryImpl, klasa Jest to przydatna klasa podstawowa do tworzenia fabryki klas, którą można następnie zarejestrować w rejestrze fabryki.
Klasa szablonu interfejsu Ta klasa szablonu służy do tworzenia składnika implementującego więcej niż jeden interfejs.
Klasa pomocnika ścieżki Ta klasa udostępnia typowe operacje na plikach/katalogach.
Klasa szablonu wskaźnika Ta klasa zapewnia zliczanie odwołań do zarządzania okresem istnienia w składnikach COM. Ważne jest, aby wydawać interfejsy, gdy skończysz z nimi korzystać. Ta klasa szablonu automatycznie obsługuje okres istnienia.
Klasa PUnknown Ta klasa jest inteligentnym wskaźnikiem przeznaczonym specjalnie dla interfejsu IUnknown. W przypadku wszystkich innych interfejsów użyj klasy Szablon wskaźnika.
StringUtil, klasa pomocnika Ta klasa udostępnia metody pomocnicze, które ułatwiają pracę z ciągami.
SubInterface, klasa szablonu Ta klasa podstawowa ułatwia zaimplementowanie składnika obsługującego interfejs, który sam dziedziczy po innym interfejsie.
UnknownImpl, klasa szablonu Ta klasa obsługuje większość szczegółów tworzenia składnika COM.
WizardComponent, klasa szablonu Ta klasa podstawowa jest używana do tworzenia składników, które wymagają dostępu do usług kreatora, takich jak tworzenie składników i rejestrowanie.
WizardPageImpl, klasa szablonu Ta klasa podstawowa powinna być używana jako klasa podstawowa dla wszystkich stron kreatora niestandardowego

ClassFactoryImpl, klasa

Jest to przydatna klasa podstawowa do tworzenia fabryki klas, którą można następnie zarejestrować w rejestrze fabryki.

Poniżej przedstawiono fragment pliku LocationPage.h w przykładowym projekcie w celu zdefiniowania klasy ClassFactoryImpl .

#pragma once

#include "ClassFactoryImpl.h"

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

Poniżej przedstawiono fragment pliku LocationPage.cpp na przykładowej stronie kreatora użytej do zdefiniowania fabryki klas dla strony.

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

Klasa szablonu interfejsu

Użyj tej klasy szablonu, gdy chcesz utworzyć składnik, który implementuje więcej niż jeden interfejs — na przykład:

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

Ten kod tworzy łańcuch klas bazowych, który obsługuje zarówno IFieldCalback , jak i interfejsy obsługiwane przez program WizardPageImpl (czyli IWizardPage).

Klasa pomocnika ścieżki

Ta klasa udostępnia typowe operacje na plikach/katalogach:

static inline std::wstring GetModulePath(HINSTANCE hModule)

Zwraca również pełną ścieżkę do pliku .exe lub .dll z dojściem wystąpienia podanym w tej metodzie:

static inline std::wstring GetModuleFilename(HINSTANCE hModule)

Klasa zwraca pełną ścieżkę i nazwę pliku .exe i .dll z dojściem wystąpienia podanym w tej metodzie:

static inline std::wstring GetDirectoryName(LPCWSTR fullName)

. . . lub tylko ścieżkę podczas usuwania nazwy pliku:

static inline std::wstring GetFileName(LPCWSTR fullName)

Biorąc pod uwagę ścieżkę o nazwie pliku, klasa pomocnika ścieżki zwraca tylko nazwę pliku:

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

Na koniec klasa zwraca nowy ciąg, który jest połączoną ścieżką i nazwą pliku (lub inną ścieżką).

Klasa szablonu wskaźnika

Ta klasa jest zdefiniowana w pliku Pointer.h. Ponieważ składniki COM używają zliczania odwołań do zarządzania okresem istnienia, ważne jest, aby zawsze wydawać interfejsy po zakończeniu pracy z nimi. Firma Microsoft udostępnia klasę szablonu, która automatycznie obsługuje okres istnienia. Jeśli na przykład potrzebujesz inteligentnego wskaźnika dla interfejsu XML, możesz napisać coś takiego:

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

Pierwszy wiersz definiuje inteligentny wskaźnik. Drugi wiersz przedstawia pobieranie inteligentnego wskaźnika za pośrednictwem innego wywołania. Operator & zawsze zwalnia istniejący interfejs, jeśli go zawiera, i zwraca adres wewnętrznego wskaźnika. Po pobraniu takiego wskaźnika wystąpienie wskaźnika wywołuje dla Ciebie wersję , gdy zmienna wykracza poza zakres. Firma Microsoft zaleca używanie inteligentnych wskaźników zamiast ręcznego wywoływania funkcji AddRef i Release .

Ponadto klasa wskaźnika inteligentnego wskaźnika wywołujefunkcję QueryInterface w celu pobrania innych interfejsów. Na przykład gdy rejestr fabryki tworzy nowe wystąpienie składnika, ma kod podobny do następującego:

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

Pierwszy wiersz wywołuje funkcję QueryInterface w tle, aby zażądać interfejsu IWizardComponent . Wynikowy inteligentny wskaźnik będzie równy nullptr , jeśli składnik nie obsługuje tego interfejsu.

Klasa PUnknown

Ta klasa jest inteligentnym wskaźnikiem przeznaczonym specjalnie dla interfejsu IUnknown . W przypadku wszystkich innych interfejsów użyj klasy Szablon wskaźnika .

StringUtil, klasa pomocnika

Ta klasa jest zdefiniowana w pliku Utilities.h i udostępnia metody pomocnicze, które ułatwiają pracę z ciągami:

static inline int CompareIgnore(LPCWSTR first, LPCWSTR second)

Ta metoda porównuje dwa ciągi podczas ignorowania wielkości liter (zobacz Tabela 9).

Tabela 9. StringUtil, klasa pomocnika

Zwraca Opis
0 Ciągi są zgodne, ignorując wielkość liter
<0 Pierwsza < sekunda
>0 Pierwsza > sekunda

Oto przykład:

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

Te metody są nieco podobne do metod formatu microsoft .NET w tym sensie, że parametry mają postać {0}. Jednak nie wykonują one żadnego formatowania danych wejściowych — wystarczy podstawić:

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)

Otoki wokół stringCchPrintf , które zwracają wstring , więc nie trzeba przydzielać pamięci dla ciągów lub buforów siebie.

SubInterface, klasa szablonu

Ta klasa podstawowa ułatwia zaimplementowanie składnika obsługującego interfejs, który sam dziedziczy po innym interfejsie. Na przykład interfejs ICheckBox dziedziczy element iControl. Oto jak ta klasa jest używana do definiowania elementu CheckBoxWrapper:

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

Interfejs podstawowy jest pierwszym parametrem, podczas gdy interfejs pochodny jest drugim parametrem.

UnknownImpl, klasa szablonu

Ta klasa jest zdefiniowana w pliku UnknownImpl.h i obsługuje większość szczegółów tworzenia składnika COM. Oto przykład użycia tej klasy bazowej:

classDirectory :public UnknownImpl<IDirectory>

Ten kod definiuje klasę, która obsługuje interfejs IDirectory .

WizardComponent, klasa szablonu

Ta klasa jest zdefiniowana w pliku IWizardComponent.h i jest przydatną klasą podstawową do tworzenia składników wymagających dostępu do usług kreatora, takich jak tworzenie i rejestrowanie składników.

Oto przykład definiowania składnika CopyFilesTask :

classCopyFilesTask :public WizardComponent<ITask>
{
    ...

Parametrem dla tej klasy szablonu jest "główny" interfejs, którego chcesz użyć dla składnika, który w przypadku zadań to ITask. Użycie składnika WizardComponent oznacza, że składnik obsługuje zarówno interfejs udostępniany przez Użytkownika (ITask w tym przykładzie), jak i IWizardComponent.

Za każdym razem, gdy do utworzenia nowego składnika jest używany rejestr fabryki klas, rejestr wywołuje metodę IWizardComponent-SetContainer> składnika w celu zapewnienia dostępu składnika do usług kreatora.

WizardPageImpl, klasa szablonu

Użyj tej klasy jako klasy podstawowej dla stron niestandardowych — na przykład:

class LocationPage :public WizardPageImpl<IDD_LOCATION_PAGE>

Parametr to identyfikator zasobu szablonu okna dialogowego.

Interfejsy strony kreatora

Kreator UDI używa interfejsów do uzyskiwania dostępu do różnych kontrolek na stronie. Na stronie można pobrać otokę kontrolki za pomocą funkcji GetControlWrapper . Oto przykład:

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

W tym miejscu PStaticText jest inteligentnym wskaźnikiem do interfejsu IStaticText . Inteligentne wskaźniki automatycznie wywołują metodę COM Release(), gdy wykraczają poza zakres lub przekazujesz adres zmiennej (takiej jak &pFormat) do metody.

Interfejs IADHelper

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

HRESULT Init(ILogger *pLogger)

Zainicjuj ten składnik, przekazując go do rejestratora, aby mógł rejestrować informacje.

HRESULTValidLogon(LPCTSTR userName, LPCTSTR password, LPCTSTR domain)

Ta metoda sprawdza, czy zestaw poświadczeń jest prawidłowy, jak pokazano w tabeli 10.

Tabela 10. HResultValidLogon

Hresult Opis
S_OK Poświadczenia są prawidłowe
S_FALSE Poświadczenia są nieprawidłowe
E_FAIL Nie można zlokalizować kontrolera domeny; sprawdź dzienniki, aby uzyskać szczegółowe informacje
HRESULT HasAccess(LPCTSTR username, LPCTSTR password, LPCTSTR domain, LPCTSTR computerName, LPCTSTR accountDomain)

Ta metoda sprawdza, czy zestaw poświadczeń ma dostęp do odczytu/zapisu do obiektu komputera w usługach AD DS, jak pokazano w tabeli 11.

Tabela 11. HResult HasAccess

HRESULT Opis
S_OK Użytkownik ma dostęp
E_FAIL Użytkownik nie ma dostępu. Sprawdź plik dziennika, aby uzyskać dodatkowe informacje.

IBackgroundTask, interfejs

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

Strona Postęp używa tej klasy do uruchamiania zadań w osobnym wątku. Tej klasy można również używać zawsze, gdy chcesz wykonywać operacje w osobnym wątku. Zadania to dowolna klasa, która obsługuje interfejs ITask .

Ten interfejs jest implementowany przez składnik ID_BackgroundTask ("Microsoft.Wizard.BackgroundTask") zdefiniowany w interfejsie IBackgroundTask.h.

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

Ten interfejs inicjuje składnik, jak pokazano w tabeli 12.

Tabela 12. HRESULT Init

Parametr Opis
pTask Wskaźnik do klasy zawierającej kod, który chcesz uruchomić w innym wątku
Id Numer, którego można użyć w metodzie Zakończono wywołania zwrotnego , aby określić, które zadanie zostało zakończone; przydatne, jeśli uruchamiasz kilka zadań przy użyciu tej samej metody wywołania zwrotnego
pCallback Klasa, która implementuje metodę Finished , która jest wywoływana za każdym razem, gdy zadanie zakończy działanie; wywołanie metody Finished będzie znajdować się w wątku tła, a nie wątku interfejsu użytkownika
void Start(void)

Ta metoda uruchamia zadanie w wątku w tle i zwraca elementy wyświetlane w tabeli 13.

Tabela 13. Zwracanie wątku tła

Zwraca Opis
E_INVALIDARG Zadanie jest już uruchomione, więc nie można go teraz uruchomić.
E_FAIL Wystąpił problem podczas uruchamiania wątku.
S_OK Wątek został uruchomiony.
BOOL Running()

Ta metoda zwraca wartość TRUE, jeśli zadanie w tle jest obecnie uruchomione i false, jeśli nie jest uruchomione.

HRESULT Wait(DWORD waitMilliseconds)

Ta metoda czeka, aż wątek przestanie działać lub upłynie liczba milisekund.

HRESULT Terminate(DWORD exitCode)

Ta metoda zabija uruchomiony wątek (zobacz Tabelę 14 i Tabelę 15). Po zwróceniu tej metody ukończenie tego procesu może zająć krótki czas.

Tabela 14. HRESULT — kod zakończenia zakończenia

Parametr Opis
Exitcode Kod zakończenia, który zostanie wysłany do metody Finished callback, który będzie również dostępny w metodzie GetExitCode .

Tabela 15. Kody zakończenia

Zwraca Opis
E_FAIL Wywołanie zakończenia nie powiodło się.
S_OK Żądanie zakończenia wątku zakończyło się pomyślnie.
HRESULT GetExitCode(LPDWORD pCode, HRESULT *pHresult)

Użyj tej metody, aby uzyskać wyniki uruchomienia zadania w wątku w tle (zobacz Tabela 16).

Tabela 16. Kody wyników

Parametr Opis
pCode Wskaźnik do dword , który zostanie ustawiony na return lub nullptr , jeśli nie potrzebujesz wartości zwracanej. Po zakończeniu ten parametr jest ustawiony na STILL_ACTIVE , jeśli wątek jest uruchomiony, kod zwrócony przez metodę Execute zadania lub wartość przekazana do metody Terminate , jeśli została wywołana ta metoda.
pHresult Wskaźnik do hresult , który zostanie ustawiony na return lub nullptr , jeśli nie potrzebujesz wartości HRESULT .
HRESULT Close(void)

Ta metoda zwalnia wątek tła. Zwraca E_INVALIDARG , jeśli wątek jest obecnie uruchomiony i S_OK w przeciwnym razie.

ICheckBox, interfejs

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

Ustaw zaznaczony stan pola wyboru. Gdy metoda ma wartość TRUE, pole wyboru jest zaznaczone. gdy metoda ma wartość FALSE, pole wyboru jest wyczyszczone.

BOOL IsButtonChecked()

Ta metoda zgłasza bieżący stan wyboru pola wyboru.

IComboBox, interfejs

__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();
};
Omówienie

Ten interfejs jest implementowany przez składnik CheckBoxWrapper . Wystąpienie tego składnika jest pobierane przy użyciu funkcji pomocnika GetControlWrapper z typem CONTROL_COMBO_BOX.

HRESULT Bind([in] IBindableList *pList)

Użyj tej metody, jeśli masz źródło danych implementujące interfejs IBindableList . Pole listy inicjuje zawartość z podpisami z tej listy.

HRESULT Select(indeks int)

Wybierz element w polu kombi w indeksie.

int Selected(void)

Ta metoda zwraca indeks wybranego elementu lub -1 , jeśli nic nie jest zaznaczone.

void Add([in] LPCTSTR podpis)

Ręcznie dodaj element do pola kombi.

HRESULT GetText([out, retval] LPBSTR pText)

Pobierz ciąg aktualnie wybranego elementu w polu kombi.

void Clear()

Usuń wszystkie elementy z pola kombi.

IControl, interfejs

__interface IControl : IUnknown
{
    HRESULT SetEnable(BOOL enable);
    BOOL IsEnabled(void);
    HRESULT SetVisible(BOOL visible);
};
Omówienie

Ten interfejs jest implementowany przez składnik ControlWrapper . Wystąpienie tego składnika jest pobierane przy użyciu funkcji pomocnika GetControlWrapper o typie CONTROL_GENERIC.

HRESULT SetEnable(bool enable)

Włącz lub wyłącz kontrolkę.

BOOL IsEnabled(void)

Zwraca wartość TRUE, jeśli kontrolka jest włączona, wartość FALSE, jeśli nie jest.

HRESULT SetVisible(bool visible)

Pokaż lub ukryj kontrolkę.

ICpuInfo, interfejs

__interface ICpuInfo : IUnknown
{
    BOOL Is64Bit(void);
};
Omówienie

Ten interfejs można uzyskać, tworząc nowy składnik ID_CpuInfo . Pojedyncza metoda zgłasza, czy procesor JEST 32 lub 64-bitowy. Należy pamiętać, że jeśli masz 32-bitowy system operacyjny na komputerze 64-bitowym, ta metoda zwraca wartość TRUE, ponieważ zgłasza tylko szerokość procesora CPU (a nie system operacyjny).

IDirectory, interfejs
__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);
};
Omówienie

Składnik katalogowy tworzony przy użyciu ID_Directory zapewnia fasadę do pracy z katalogami w systemie plików.

BOOL FileExists(nazwa LPCWSTR)

Ta metoda zwraca wartość TRUE, jeśli istnieje plik o podanej nazwie.

BOOL FindFirst([in] Nazwa LPCWSTR)

Ta metoda znajduje pierwsze dopasowanie do podanej nazwy. Obsługuje symbole wieloznaczne i zwraca zarówno nazwy plików, jak i katalogów. Metoda zwraca wartość TRUE, jeśli znaleziono dopasowanie, w przeciwnym razie wartość FALSE.

HRESULT FoundName([out, retval] LPBSTR name)

Ta metoda pobiera nazwę znalezionego pliku za pomocą wywołania polecenia FindFirst lub FindNext.

DWORD FoundAttributes(void)

Ta metoda zwraca atrybut najnowszego znalezionego pliku lub katalogu. Możesz użyć kodu w następujący sposób, aby sprawdzić, czy jest to katalog:

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

Znajdź następny. Ta metoda zwraca wartość TRUE, jeśli znaleziono inne dopasowanie, w przeciwnym razie wartość FALSE.

void FinishFind(void)

Ta metoda zwalnia zasoby używane do operacji Znajdowanie.

IDomainJoinValidator, interfejs

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

Wystąpienie tego interfejsu jest uzyskiwane przy użyciu wartości ID_DomainJoinValidator do funkcji szablonu CreateInstance .

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

Inicjowanie wystąpienia, jak pokazano w tabeli 17.

Tabela 17. Inicjowanie HRESULT — inicjowanie wystąpienia

Parametr Opis
pLogger Wystąpienie rejestratora, które jest dostępne dla Twojej strony za pośrednictwem metody Rejestrator strony
pContainer Przekazuje wyniki z metody kontenera na stronie
pUsername Pole tekstowe zawierające nazwę użytkownika do zweryfikowania
pPassword Pole tekstowe zawierające hasło do zweryfikowania
PComputerName Pole tekstowe zawierające nazwę komputera, który zostanie ostatecznie przyłączony do domeny
HRESULT IsUsernameValid(LPCWSTR domainName)

Ta metoda używa metody IADHelper-ValidLogon> do wykonania pracy. Aby uzyskać szczegółowe informacje, zobacz tę metodę.

BOOL CanModifyComputerAdEntry(LPCWSTR domainName)

Sprawdź, czy użytkownik ma uprawnienia do modyfikowania wpisu komputera. Większość pracy jest wykonywana przez IADHelper-HasAccess>. Jeśli ta metoda zwraca wartość FALSE, sprawdź plik dziennika, aby uzyskać szczegółowe informacje.

IDriveList, interfejs

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

Wywołaj tę metodę przed wywołaniem innych składników. Przed wywołaniem tej metody należy utworzyć nową metodę WmiRepository .

HRESULT SetWhereClause(LPCTSTR whereClause)

Ta metoda umożliwia dodanie tekstu, który będzie wyświetlany jako klauzula "where" w zapytaniu. Na przykład następująca linia zwraca tylko dyski USB:

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

Ustaw minimalny rozmiar dysku w bajtach dla dysków, które zostaną zwrócone z zapytania.

HRESULT Update(void)

Wykonaj zapytanie. Lista dysków dostępna po wywołaniu tej metody jest sortowana według litery dysku.

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

Ta metoda dodaje nazwy dodatkowych właściwości, które chcesz udostępnić w wynikach zapytania. Wywołaj tę metodę przed wywołaniem funkcji Update. W tabeli 18 przedstawiono trzy przydatne właściwości.

Tabela 18. HrESULT AddProperty: Przydatne właściwości

Sekcji Właściwość Opis
DISKQUERY_LOGICALDISK Rozmiar Rozmiar w bajtach reprezentowany jako ciąg
DISKQUERY_DISKPARTITION DiskIndex Numer dysku jako liczba całkowita, począwszy od 0
DISKQUERY_LOGICALDISK VolumeName Etykieta woluminu
size_t Count(void)

Liczba rekordów zwracanych przez zapytanie. Wywołaj polecenie Update przed wywołaniem tej metody.

HRESULT GetProperty(indeks size_t, LPCTSTR propName, wartość LPVARIANT)

Ta metoda pobiera wartość właściwości z wyników zapytania, jak pokazano w tabeli 19.

Tabela 19. HRESULT GetProperty

Parametr Opis
Indeks Indeks oparty na zerowej wartości do rekordu wyniku
propName Nazwa właściwości, na przykład "Size"
Wartość Po powrocie ten parametr zawiera wartość wariantu właściwości
HRESULT GetCaption(indeks size_t, LPBSTR pCaption)

Ta metoda pobiera podpis dla rekordu, który jest taki sam jak właściwość Caption.

IImageList, interfejs

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

Ten interfejs jest implementowany przez składnik ImageList . Wystąpienie tego składnika jest pobierane z interfejsu IListView .

HRESULT CreateImageList(szerokość całkowita, wysokość całkowita, flagi UINT)

Utwórz nową listę obrazów, którą zarządza ten składnik. Wywołaj tę metodę tylko raz.

HImageList GetImageList(void)

Ta metoda zwraca dojście do listy obrazów na wypadek konieczności wykonania innych operacji na liście obrazów.

int AddImage(HInstance hInstance, int resourceId)

Dodaj nowy obraz do listy obrazów z zasobu, jak pokazano w tabeli 20.

Tabela 20. HRESULT IImageList, interfejs

Parametr Opis
hInstance Dojście wystąpienia modułu zawierającego zasób mapy bitowej
Resourceid Identyfikator zasobu do załadowania na listę obrazów

IListView, interfejs

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

Ten interfejs jest implementowany przez składnik ControlWrapper . Wystąpienie tego składnika jest pobierane przy użyciu funkcji pomocnika GetControlWrapper z typem CONTROL_LIST_VIEW.

int AddItem([in] tekst LPCTSTR)

Dodaj nowy wiersz do pola listy. Metoda zwraca indeks właśnie dodanej pozycji.

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

Dodaj nową kolumnę do widoku listy.

HRESULT SetSubItem(indeks int, kolumna int, [w] tekście LPCTSTR)

Ustaw tekst w kolumnie innej niż pierwsza kolumna pola listy, jak pokazano w tabeli 21.

Tabela 21. HRESULT SetSubItem

Parametr Opis
Indeks Indeks elementu listy, który chcesz zmodyfikować
Kolumna Indeks kolumny, którą chcesz zaktualizować; Pierwsza kolumna jest ustawiona przy użyciu polecenia AddItem, kolumny 2 i następujące są ustawiane za pomocą tej metody
Tekst Ciąg do pokazania w kolumnie
int GetWidth(void)

Ta metoda zwraca szerokość całego pola tekstowego.

void SetExtendedStyle(styl DWORD)

Ta metoda umożliwia ustawianie stylów rozszerzonych w polu listy — na przykład:

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

Ta metoda zwraca indeks aktualnie wybranego elementu widoku listy.

HRESULT SelectItem(indeks int)

Ustaw wybrany element na liście na ten indeks.

BOOL IsItemChecked(indeks int)

Ta metoda zwraca wartość TRUE, jeśli wybrano element na liście. Ta metoda wymaga wywołania metody SetExtendedStyle w celu ustawienia stylu pola wyboru.

int GetItemCount(void)

Ta metoda zwraca liczbę elementów w widoku listy.

HRESULT CreateImageList(szerokość całkowita, wysokość całkowita, flagi UINT)

Utwórz nową listę obrazów i dołącz ją do widoku listy.

int AddImage(HINSTANCE hInstance, int resourceId)

Dodaj obraz do listy obrazów widoku listy. Najpierw należy wywołać funkcję CreateImageList.

HRESULT SetImage(indeks int, int imageIndex)

Ustaw obraz, który będzie wyświetlany po lewej stronie dla określonego elementu widoku listy.

HRESULT Clear(void)

Usuń wszystkie elementy z widoku listy.

IProgressBar, interfejs

__interface IProgressBar : IControl
{
    HRESULT SetPercentage(int position);
    int GetPercentage(void);
};
Omówienie

Ten interfejs jest implementowany przez składnik ProgressBarWrapper . Wystąpienie tego składnika jest pobierane przy użyciu funkcji pomocnika GetControlWrapper o typie CONTROL_PROGRESS_BAR.

HRESULT SetPercentage(pozycja int)

Ustaw położenie paska postępu, używając liczby z zakresu od 0 do 100. Domyślnie nowe paski postępu Win32® mają maksymalny zakres 100.

int GetPercentage(void)

Ta metoda zwraca bieżącą pozycję paska postępu.

IRadioButton, interfejs

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

Ten interfejs jest implementowany przez składnik RadioButtonWrapper . Wystąpienie tego składnika jest pobierane przy użyciu funkcji pomocnika GetControlWrapper o typie CONTROL_RADIO_BUTTON.

void SetGroup(int firstId, int lastId)

Podaj otokę z zakresem przycisków radiowych, które powinny być traktowane jako grupa. Wywołaj tę metodę przed wywołaniem funkcji CheckRadio.

void CheckRadio(identyfikator int)

Ustaw określony przycisk radiowy na pojedynczy przycisk w wybranej grupie przycisków radiowych. Wywołaj polecenie SetGroup przed wywołaniem tej metody.

BOOL IsButtonChecked(identyfikator int)

Ta metoda zwraca wartość TRUE, jeśli przycisk radiowy jest aktualnie zaznaczony, w przeciwnym razie wartość FALSE.

void EnableRadio(int id, BOOL enable)

Ta metoda włącza lub wyłącza przycisk radiowy.

IStaticText, interfejs

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

Ten interfejs jest implementowany przez składnik StaticTextWrapper . Wystąpienie tego składnika jest pobierane przy użyciu funkcji pomocnika GetControlWrapper o typie CONTROL_STATIC_TEXT.

HRESULT SetText([in] LPCTSTR pText)

Ustaw tekst kontrolki.

HRESULT GetText([out, retval] LPBSTR pText)

Ta metoda zwraca bieżącą wartość tekstu dla kontrolki.

ITask, interfejs

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

Zaimplementuj ten interfejs, jeśli chcesz, aby składnik był dostępny jako zadanie na stronie wstępnej lub jeśli chcesz użyć składnika BackgroundTask do wykonywania pracy nad wątkiem w tle.

Oto składniki implementujące interfejs ITask :

  • ID_ShellExecuteTask, L"Microsoft.Wizard.ShellExecuteTask"

  • ID_CopyFilesTask, L"Microsoft.Wizard.CopyFilesTask"

  • ID_ACPowerTask, L"Microsoft.OSDRefresh.ACPowerTask"

  • ID_WiredNetworkTask, L"Microsoft.SharedPages.WiredNetworkTask"

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

Jeśli piszesz zadanie dla strony wstępnej, wywołaj tę metodę, aby zainicjować zadanie. Plik .config zawiera kod XML, który może wyglądać mniej więcej tak:

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

Parametr pProperties zapewnia dostęp do trzech wartości settera, natomiast parametr pTaskSettings zapewnia dostęp do elementu Task i elementów podrzędnych. Większość zadań musi odczytywać tylko dane z parametru pProperties .

Wykonywanie
HRESULT Execute(LPDWORD pReturnCode)

Tutaj piszesz kod, który wykonuje zadanie. Ta metoda powinna zwracać S_OK , jeśli nie wystąpiły błędy, i może zwrócić inny hresult , jeśli wystąpił błąd podczas wykonywania zadania. Wartości inne niż S_OK zwracane przez tę metodę są dopasowywane do <elementów Błąd> w <sekcji ExitCodes> , jeśli używasz strony wstępnej.

Parametr pReturnCode musi zostać zaktualizowany o liczbę, która zgłasza stan zadania. Te wartości są dopasowywane przez stronę preflights do <elementów ExitCode> .

ITreeView, interfejs

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

Ten interfejs jest implementowany przez składnik TreeViewWrapper . Wystąpienie tego składnika jest pobierane przy użyciu funkcji pomocnika GetControlWrapper o typie CONTROL_TREE_VIEW.

void EnableCheckboxes(void)

Ta metoda włącza pola wyboru w kontrolce widoku drzewa, ustawiając styl TVS_CHECKBOXES .

HRESULT CreateImageList(szerokość całkowita, wysokość całkowita, flagi UINT)

Dodaj nową listę obrazów do kontrolki widoku drzewa. Parametr flags jest przekazywany w wywołaniu do funkcji ImageList_Create Win32.

int AddImage(HINSTANCE hInstance, int resourceId)

Dodaj obraz do listy obrazów z zasobu (resourceId) w module z uchwytem wystąpienia hInstance.

HTREEITEM AddItem(Tekst LPCTSTR, HTREEITEM hParent = NULL)

Dodaj węzeł do widoku drzewa. Nowy węzeł zostanie dodany na najwyższym poziomie, jeśli hParent ma wartość NULL. W przeciwnym razie podaj dojście do elementu nadrzędnego, do którego ma zostać dodany nowy element. Ta metoda zwraca dojście do nowego elementu.

void SetImage(element HTREEITEM, obraz int, int expandImage)

Ustaw obraz do użycia dla elementu widoku drzewa. Można ustawić obraz normalny i rozwinięty.

void Clear(void)

Usuń wszystkie elementy z widoku drzewa.

BOOL SetFirstVisible(HTREEITEM item)

Upewnij się, że element widoku drzewa jest widoczny. Widok drzewa będzie przewijany, jeśli jest to wymagane, aby ten element był widoczny.

BOOL SelectItem(HTREEITEM item)

Ustaw aktualnie wybrany element na podany element. Następnie możesz wywołać polecenie SetFirstVisible , aby upewnić się, że nowo wybrany element jest widoczny.

void CheckItem(element HTREEITEM, UINT checkState)

Metoda zasadniczo ustawia obraz, który będzie wyświetlany dla pola wyboru w widoku drzewa. Te obrazy znajdują się w osobnej kontrolce ImageList zarządzanej przez widok drzewa. Domyślnie ta lista obrazów zawiera trzy obrazy wyświetlane w tabeli 22.

Tabela 22.void CheckItem Image List Default

Checkstate Opis
0 Puste
1 Wyczyszczone
2 Wybrane
HTREEITEM SelectedItem(void)

Ta metoda zwraca uchwyt aktualnie wybranego elementu widoku drzewa.

int SetItemHeight(KRÓTKA wysokość)

Ta metoda ustawia wysokość wszystkich elementów w kontrolce widoku drzewa w pikselach. Zwraca poprzednią wysokość w pikselach.

HRESULT EnableItem(HTREEITEM item, BOOL enable)

Ta metoda włącza lub wyłącza pojedynczy element w drzewie. Wyłączenie elementu z elementami podrzędnymi nie spowoduje wyłączenia elementów podrzędnych.

void Expand(HTREEITEM hItem, ROZWIŃ BOOL)

Ta metoda rozszerza lub zwija węzeł w drzewie.

HTREEITEM GetChild(HTREEITEM hParent)

Ta metoda zwraca pierwszy element podrzędny elementu widoku drzewa lub wartość NULL, jeśli nie ma elementów podrzędnych.

HTREEITEM GetParent(HTREEITEM hNode)

Ta metoda zwraca dojście elementu nadrzędnego dla węzła w widoku drzewa lub null, jeśli węzeł znajduje się na najwyższym poziomie.

HTREEITEM GetNextItem(HTREEITEM hPrevious)

Tę metodę można wywołać za pomocą uchwytu, który funkcja GetChild zwraca, aby iterować wszystkie elementy podrzędne węzła. Ta metoda zwraca następne elementy równorzędne w drzewie, które ma ten sam element nadrzędny.

UINT IsChecked(HTREEITEM item)

Ta metoda zwraca wartość 0 , jeśli węzeł widoku drzewa nie jest zaznaczony i 1 , jeśli jest.

BOOL IsEnabled(HTREEITEM item)

Ta metoda zwraca wartość TRUE, jeśli węzeł widoku drzewa jest włączony, w przeciwnym razie wartość FALSE.

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

Ta metoda służy tylko do użytku wewnętrznego.

HRESULT SetEventHandler(ITreeViewEvent *pEventHandler)

Wywołaj tę metodę, jeśli chcesz otrzymywać powiadomienia, gdy wybrany element zmieni się lub użytkownik zmieni stan sprawdzania elementu widoku drzewa. Aby odbierać te wywołania zwrotne, należy zaimplementować element ITreeViewEvent w składniku.

void SetSelectedBackColor (kolor COLORREF)

Ustaw kolor tła używany dla wybranego elementu.

IWmiIteration, interfejs

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

Zwykle używasz tego interfejsu, wraz z IWmiRepository, podczas pracy z wywołaniami WMI. Interfejs IWmiIteration umożliwia iterację wartości zwracanych przez zapytanie.

HRESULT Next(void)

Przejdź do następnego elementu w wynikach zapytania, jak pokazano w tabeli 23.

Tabela 23. HrESULT Next(void) Zapytanie zwraca

HRRESULT Opis
S_OK Przeniesiono do następnego wyniku; Możesz użyć funkcji GetProperty , aby pobrać właściwości tego wyniku.
S_FALSE Na liście nie ma więcej elementów.
E_NOT_SET Brak wyników zapytania
HRESULT GetProperty(LPCTSTR propertyName, [out] LPVARIANT pValue)

Ta metoda pobiera wartość właściwości z bieżącego rekordu wyników, jak pokazano w tabelach 24 i 25.

Tabela 24. HRESULT GetProperty

Parametr Opis
Propertyname Nazwa właściwości, którą chcesz pobrać
pValue Wskazuje strukturę VARIANT, która po powrocie zawiera wartość właściwości

Tabela 25. Hresult GetProperty — wynik

HRESULT Opis
S_OK Pobrano wartość właściwości.
WBEM_E_NOT_FOUND Nie ma właściwości o nazwie.
E_NOT_VALID_STATE Nie ma bieżącego rekordu.

Uwaga

Metoda GetProperty może zwrócić inne kody błędów usługi WMI inne niż wymienione w tabeli 25. Wymienione wartości są typowymi wynikami, które są zwracane.

IWmiRepository, interfejs

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

Ten interfejs jest implementowany przez składnik WmiRepository (ID_WmiRepository).

HRESULT SetNamespace(LPCWSTR namespaceName)

Ta metoda ustawia przestrzeń nazw usługi WMI, która będzie używana dla zapytania. Wywołaj tę metodę przed wywołaniem zapytania ExecQuery. Jeśli nie wywołasz tej metody, przestrzeń nazw będzie mieć wartość root\cimv2. Ta metoda zawsze zwraca S_OK.

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

Wykonaj zapytanie względem zestawu przestrzeni nazw usługi WMI za pomocą wywołania setNamespace, jak pokazano w tabelach 26 i 27.

Tabela 26. HRESULT ExecQuery

Parametr Opis
Kwerendy Ciąg zapytania WMI, które chcesz wykonać
ppIterator Przekaż wskaźnik do wskaźnika interfejsu, który po powrocie zostanie wypełniony interfejsem, zapewniając dostęp do wyników zapytania

Tabela 27. Wynik zapytania HRESULT

HRESULT Opis
S_OK Zapytanie zakończyło się pomyślnie
Inne Jeśli zapytanie nie powiodło się, zwraca wartość HRESULT usługi WMI

IFormController, interfejs

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

Każda strona w Kreatorze UDI ma własny kontroler formularzy, który implementuje ten interfejs. Ten kontroler służy do łączenia danych pola w pliku XML .config z kontrolkami na stronie. Następnie kontroler formularza obsługuje wiele szczegółów.

Konfigurowanie formularza

Ogólnie rzecz biorąc, skonfiguruj kontroler formularzy w metodzie OnWindowCreated na stronie. Zwykle wiąże się to z wywołaniem metod przedstawionych w tabeli 28.

Tabela 28. OnWindowCreated, metoda

Metoda Opis
Init Inicjuje kontroler formularzy
AddField Zapewnia połączenie między polem w pliku XML .config, który jest nazwą ciągu, a kontrolką w oknie dialogowym strony, która jest identyfikatorem
AddRadioGroup Służy do łączenia przycisku radiowego zarówno z grupą, jak i kontrolką w oknie dialogowym
AddToGroup Umożliwia włączenie lub wyłączenie kontrolek podrzędnych wraz z ich elementem nadrzędnym lub na podstawie wybranego przycisku radiowego
Pola init Wywoływanie po wywołaniu wszystkich metod Dodaj w celu skonfigurowania formularza
Sprawdzania poprawności Wykonuje wstępną walidację
Przetwarzanie zdarzeń formularza

Dodaj następujące wywołanie do metody OnControlEvent :

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

To wywołanie przekazuje zdarzenia do kontrolera formularza, aby można było przetwarzać zdarzenia związane z formularzami.

Zapisywanie danych formularza

W metodzie OnNextSelected wywołaj metody formularza pokazane w tabeli 29.

Tabela 29. OnNextSelected, metoda

Metoda Opis
InitSection Zawiera nazwę sekcji, która będzie wyświetlana na stronie Podsumowanie dla tej strony
SaveFields Zapisz wartości pól w zmiennych sekwencji zadań i na stronie Podsumowanie
Init
HRESULT Init(IWizardPageView *pView, IWizardPageContainer *pContainer)

Zazwyczaj wywołujesz tę metodę w pobliżu początku metody OnWindowCreated strony. Polecenie powinno wyglądać mniej więcej tak:

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

Ta metoda jest wywoływana wewnętrznie i nie należy nazywać jej samodzielnie. Udostępnia ona kod XML strony kontrolerowi formularzy.

Sprawdzania poprawności
HRESULT Validate(void)

Ta metoda wykonuje wszystkie moduły sprawdzania poprawności dołączone do kontrolek. Jeśli moduł sprawdzania poprawności nie przejdzie, kontroler formularza wyświetla komunikat ostrzegawczy i wyłącza przycisk Dalej , a następnie zatrzymuje sprawdzanie poprawności przetwarzania. Zazwyczaj należy wywołać tę metodę tylko na końcu metody OnWindowCreated ; zawsze zwraca S_OK.

AddToGroup
AddToGroup(int groupControlId, int controlId)

Ta metoda dodaje kontrolkę jako "podrzędną" pola wyboru lub przycisku radiowego, jak pokazano w tabeli 30. Wszystkie takie kontrolki podrzędne zostaną wyłączone, gdy kontrolka nadrzędna nie zostanie wybrana. Metoda zawsze zwraca S_OK.

Tabela 30. AddToGroup

Parametr Opis
groupControlId Identyfikator pola wyboru lub przycisku radiowego, który będzie kontrolować stan włączania kontrolki podrzędnej
Kontrolowane Identyfikator kontrolki, którą chcesz dodać jako element podrzędny
UpdateCheckGroup
HRESULT UpdateCheckGroup(int groupControlId)

Ta metoda aktualizuje stan włączania lub wyłączania kontrolek podrzędnych grupy na podstawie stanu kontrolki nadrzędnej. Ogólnie rzecz biorąc, nie trzeba wywoływać tej metody samodzielnie, ponieważ kontroler formularzy wywołuje ją za Ciebie.

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

Wywołaj tę metodę tylko wtedy, gdy masz moduł sprawdzania poprawności, który chcesz utworzyć w kodzie, a nie w kodzie XML. Ta metoda zawsze zwraca S_OK.

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

Wywołaj tę metodę tylko wtedy, gdy masz moduł sprawdzania poprawności, który chcesz utworzyć w kodzie, a nie w kodzie XML.

DisableValidation
HRESULT DisableValidation(int controlId, BOOL disable)

Wywołaj tę metodę, aby jawnie wyłączyć moduł sprawdzania poprawności dla kontrolki lub przywrócić normalną walidację, jak pokazano w tabeli 31. Ta metoda jest przydatna, na przykład gdy masz reguły włączania/wyłączania kontrolek, które nie są objęte weryfikacją formularza, i musisz wyłączyć walidację kontrolki. Innymi słowy, ta metoda nie jest zwykle wywoływana. Ta metoda zawsze zwraca S_OK.

Tabela 31. HRESULT DisableValidation

Parametr Opis
Controlid Kontrolka, dla której chcesz włączyć lub wyłączyć walidację
Wyłączyć Ustaw wartość TRUE, aby wyłączyć walidację i wartość FALSE, aby przywrócić normalną walidację
AddField
HRESULT AddField(LPCWSTR fieldName, int controlId, BOOL suppressLog, DialogControlTypes type)

Dodaj mapowanie kontrolki między nazwą w elemencie Field pliku XML .config i identyfikatorem kontrolki w oknie dialogowym strony, jak pokazano w tabeli 32. Należy wywołać tę metodę przed wywołaniem polecenia InitFields, ponieważ usługa InitFields używa tych informacji. Ta metoda zawsze zwraca S_OK.

Tabela 32. HRESULT AddField

Parametr Opis
Fieldname Nazwa pola wyświetlana w kodzie XML strony
Controlid Identyfikator kontrolki w szablonie okna dialogowego strony
suppressLog Ustaw wartość TRUE, jeśli nie chcesz, aby wartości z tego pola były zapisywane w pliku dziennika. zawsze ustaw ten parametr na wartość TRUE dla pól hasła lub numeru PIN
Type Typ kontrolki, który jest jednym z następujących:

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

Ta metoda dodaje kontrolkę do nazwanej grupy przycisków radiowych, jak pokazano w tabeli 33. Należy wywołać tę metodę przed metodą InitFields , ponieważ ta metoda używa atrybutów w elemencie RadioGroup do kontrolowania ustawień wszystkich kontrolek przycisków radiowych w grupie. Grupy radiowe mogą być zablokowane, na przykład tak, aby wszystkie przyciski radiowe były wyłączone, ale kontrolki podrzędne są włączone lub wyłączone tylko na podstawie tego, który przycisk radiowy jest zaznaczony. Ta metoda zawsze zwraca S_OK.

Tabela 33. HRESULT AddRadioGroup

Parametr Opis
Groupname Ciąg definiujący grupę przycisków radiowych na tej stronie
radioControlId Identyfikator pojedynczego przycisku radiowego do dodania do tej grupy
EnableRadioGroup
HRESULT EnableRadioGroup(LPCWSTR groupName, BOOL enable)

Ta metoda umożliwia włączenie lub wyłączenie całej grupy przycisków radiowych. Wyłączenie grupy radiowej powoduje wyłączenie wszystkich kontrolek przycisków radiowych w grupie, a także wszystkich elementów podrzędnych tych przycisków radiowych, które zostały dodane za pomocą polecenia AddToGroup. Zobacz Tabele 34 i Tabela 35.

Tabela 34. EnableRadioGroup

Parametr Opis
Groupname Nazwa grupy przycisków radiowych zdefiniowanej już za pomocą wywołania polecenia AddRadioGroup
Włączyć Ustaw wartość TRUE, aby włączyć grupę przycisków radiowych i wartość FALSE, aby wyłączyć grupę

Tabela 35. HRESULT EnableRadioGroup

HRESULT Opis
S_OK Grupa jest włączona lub wyłączona
E_INVALIDARG Nie ma grupy przycisków radiowych o podanej nazwie
Pola init
HRESULT InitFields(IFieldCallback *pFieldCallback = nullptr)

Przed wywołaniem tej metody wywołaj polecenie AddField dla każdego pola, które może kontrolować kod XML. Ta metoda zawsze zwraca S_OK.

Parametr pFieldCallback jest opcjonalny. W przypadku jego podania kontroler formularzy wywołuje funkcję SetFieldDefault dla kontrolek, które nie są CONTROL_STATIC_TEXT lub CONTROL_CHECK_BOX. To zachowanie umożliwia pobranie wartości domyślnej z pliku XML i samodzielne ustawienie jej w kontrolce.

SaveFields
HRESULT SaveFields(IFieldCallback *pFieldCallback = nullptr)

Ta metoda zapisuje wartości pól w zmiennych sekwencji zadań i w danych podsumowania, które będą wyświetlane na stronie Podsumowanie . Podanie wskaźnika w parametrze pFieldCallback umożliwia obsługę zapisywania wartości kontrolek, które nie obsługują CONTROL_STATIC_TEXT.

IsFieldDisabled
BOOL IsFieldDisabled(int controlId)

Ta metoda umożliwia określenie, czy pole zostało wyłączone w kodzie XML.

InitSection
HRESULT InitSection(LPCWSTR key, LPCWSTR sectionCaption)

Ta metoda inicjuje dane podsumowania, które będą wyświetlane na stronie Podsumowanie , jak pokazano w tabeli 36. Wywołaj tę metodę w metodzie OnNextSelected przed wywołaniem polecenia SaveFields. Ta metoda zawsze zwraca S_OK.

Tabela 36. HRESULT InitSection

Parametr Opis
Klucz Ten parametr powinien być unikatowy dla strony. Służy do zapewnienia, że każda strona ma własne informacje podsumowujące.
sectionCaption Nagłówek, który zostanie wyświetlony na stronie Podsumowanie informacji podsumowania tej strony. Zazwyczaj jako wartości tego parametru jest używana wartość DisplayName( ).
AddSummaryItem
HRESULT AddSummaryItem(LPCWSTR first, LPCWSTR second)

Ta metoda umożliwia dodawanie elementów podsumowania do strony Podsumowanie powyżej i poza tymi elementami ustawionymi przy użyciu kodu XML. Zobacz Tabela 37.

Tabela 37. HRESULT AddSummaryItem

Parametr Opis
Pierwszym Podpis dla elementu podsumowania, który jest wyświetlany po lewej stronie
Drugi Wartość wyświetlana po prawej stronie
SuppressLogValue
HRESULT SuppressLogValue(LPCWSTR tsVariableName)

Wywołaj tę metodę dla zmiennych sekwencji zadań, dla których nie chcesz, aby wartości były zapisywane w pliku dziennika. Wywołaj tę metodę dla zmiennych sekwencji zadań, które przechowują hasła, numery PIN lub inne poufne wartości, które może wprowadzić użytkownik.

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

Ta metoda zapisuje wartość kontrolki tekstu zarówno w zmiennej sekwencji zadań, jak i w sekcji podsumowania. Zazwyczaj nie trzeba wywoływać tej metody samodzielnie, ponieważ kontroler formularzy wykonuje to dla wszystkich pól. Zobacz Tabela 38.

Tabela 38. HRESULT SaveText

Parametr Opis
Controlid Identyfikator pola tekstowego zawierającego wartość, którą chcesz zapisać (lub dowolną inną kontrolkę, która może zwracać tekst)
tsVariableName Nazwa zmiennej sekwencji zadań, którą chcesz zmodyfikować
summaryCaption Podpis na stronie Podsumowanie dla tej wartości
LoadText
HRESULT LoadText(int controlId, LPCWSTR tsVariableName)

Ta metoda odczytuje wartość zmiennej sekwencji zadań i ustawia pole tekstowe na tę wartość.

ControlEvent
void ControlEvent(WORD eventId, WORD controlId)

Wywołaj tę metodę w metodzie OnControlEvent , aby upewnić się, że kontroler formularzy może przetwarzać zdarzenia sterowania, co należy zrobić, aby działało poprawnie. Wartości przekazywane do tej metody są tymi samymi wartościami przekazanymi do metody OnControlEvent .

Isvalid
BOOL IsValid(void)

Ta metoda zwraca stan najnowszej weryfikacji formularza. Jeśli którykolwiek z modułów sprawdzania poprawności kontroli zgłosił błąd, ta metoda zwraca wartość FALSE. Innymi słowy zwraca wartość TRUE tylko wtedy, gdy wszystkie kontrolki na stronie są prawidłowe.

IValidator, interfejs

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

Moduły sprawdzania poprawności to składniki, które mogą weryfikować pojedynczą kontrolkę na stronie. Najprostszym sposobem zaimplementowania modułu sprawdzania poprawności jest uczynienie go podklasą klasy BaseValidator , która jest zdefiniowana w pliku nagłówkowym BaseValidator.h.

HRESULT Init(IControl *pControl, komunikat LPCTSTR)

Jeśli utworzysz moduł sprawdzania poprawności w kodzie, możesz wywołać tę metodę, aby zainicjować moduł sprawdzania poprawności. Zobacz Tabela 39.

Tabela 39. HRESULT Init

Parametr Opis
pControl Kontrolka, którą musi zweryfikować moduł sprawdzania poprawności
Komunikat Komunikat wyświetlany na stronie, jeśli kontrolka jest nieprawidłowa
HRESULT Init(IControl *pControl, IWizardPageContainer *pContainer, IStringProperties *pProperties)

Kontroler formularzy wywołuje tę metodę, aby zainicjować moduły sprawdzania poprawności tworzone na podstawie kodu XML strony. Zobacz Tabela 40.

Tabela 40. HRESULT Init, metoda

Parametr Opis
pControl Kontrolka, którą musi zweryfikować moduł sprawdzania poprawności
pContainer W przypadku, gdy moduł weryfikatora wymaga dostępu do rejestratora lub musi utworzyć inne składniki
pWłaściwości Zapewnia dostęp do właściwości (elementów setter) dla modułu walidatora
BOOL, IsValid(LPBSTR pMessage)

Ta metoda zwraca wartość TRUE, jeśli kontrolka jest prawidłowa, lub FALSE, jeśli kontrolka jest nieprawidłowa. Po powrocie plik pMessage powinien zostać wypełniony nowym ciągiem BSTR zawierającym komunikat do wyświetlenia, gdy kontrolka jest nieprawidłowa.

HRESULT SetProperty(int propertyId, LPVARIANT pValue)

Tę metodę można zaimplementować, jeśli potrzebujesz dodatkowych wartości, które nie są podane w kodzie XML.

HRESULT SetProperty(int propertyId, IUnknown *pUnknown)

Tę metodę można zaimplementować, jeśli potrzebujesz dodatkowych wartości, które nie są podane w kodzie XML.

HRESULT SetProperty)(int propertyId, LPCTSTR pValue)

Tę metodę można zaimplementować, jeśli potrzebujesz dodatkowych wartości, które nie są podane w kodzie XML.

IRegEx, interfejs

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

Ta metoda jest implementowana przez składnik ID_Regex (IRegex.h) i zapewnia obsługę przetwarzania wyrażeń regularnych.

BOOL MatchesRegex(LPCTSTR input, LPCTSTR regex)

Ta metoda uruchamia wyrażenie regularne względem tekstu wejściowego. Używa funkcji regex_match biblioteki standardowej języka C++, aby wykonać rzeczywistą pracę. Metoda zwraca wartość TRUE, jeśli były dopasowania, w przeciwnym razie wartość FALSE.

HRESULT GetMatch(indeks size_t, LPBSTR pValue)

Ta metoda umożliwia pobranie dopasowań z ostatniego wywołania MatchesRegex . Należy pamiętać, że nie ma przetwarzania błędów w tej metodzie i zwraca S_OK lub zgłasza wyjątek.

ISummaryInfo, interfejs

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

Nie należy używać tego interfejsu bezpośrednio. Zamiast tego użyj kontrolki IFormController.

ISummaryBag

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

Nie należy używać tego interfejsu bezpośrednio. Zamiast tego użyj kontrolki IFormController.

ITSVariableBag, interfejs

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

Ten interfejs zapewnia dostęp do zmiennych sekwencji zadań. Dostęp do tego interfejsu można uzyskać za pomocą metody TSVariables() strony.

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

Ta metoda odczytuje wartość zmiennej sekwencji zadań.

Uwaga

Wartości są buforowane po pierwszym odczytaniu.

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

Ta metoda ustawia wartość zmiennej sekwencji zadań. Ta wartość jest zapisywana w pamięci. Wartości sekwencji zadań są zapisywane po wybraniu pozycji Zakończ w Kreatorze UDI.

void Clear(void)

Ta metoda usuwa wszystkie wartości sekwencji zadań, które zostały zapisane w pamięci.

HRESULT Remove([in] LPCTSTR variableName)

Ta metoda usuwa określoną wartość sekwencji zadań z pamięci. Przy następnym wywołaniu polecenia GetValue o tej samej nazwie sekwencji zadań metoda próbuje pobrać ją z sekwencji zadań.

HRESULT SuppressLogValue([in] LPCTSTR variableName)

Za każdym razem, gdy są zapisywane zmienne sekwencji zadań, na przykład po wybraniu pozycji Zakończ w Kreatorze UDI, nazwy i wartości są zapisywane w pliku dziennika. Wywołaj tę metodę, aby pominąć rejestrowanie poufnych wartości, takich jak hasła lub numery PIN, dla określonej zmiennej sekwencji zadań.

void Save(void)

Ta metoda zapisuje wszystkie wartości sekwencji zadań, które zostały ustawione przy użyciu wywołań wartości SetValue.

ITSVariableRepository, interfejs

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

Ten interfejs jest używany wewnętrznie przez TSVariableBag do odczytywania i zapisywania zmiennych sekwencji zadań.

IWizardFinish, interfejs

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

Ten interfejs jest przydatny w zaawansowanych scenariuszach, w których chcesz wykonać dodatkowe przetwarzanie po wybraniu opcji Zakończ lub Anuluj w Kreatorze UDI. Kreator UDI zawiera zadanie Zakończ , które zapisuje zmienne sekwencji zadań po wybraniu pozycji Zakończ. Jeśli anulujesz kreatora, zadanie ustawia zmienną sekwencji zadań OSDSetupWizCancelled na wartość TRUE i nie zapisuje zmian w żadnych innych zmiennych sekwencji zadań.

Jeśli utworzysz własny składnik zakończenia, musisz zarejestrować go przy użyciu następującego kodu:

Register<MyFinishTaskFactory>(ID_MyFinishTask, pRegistry);

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

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

pService->Register(pFinish);

IBindableList, interfejs

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

Zaimplementuj ten interfejs, jeśli masz składnik źródła danych, który chcesz powiązać z polem kombi, wywołując jego metodę Bind .

size_t Count(void)

Ta metoda zwraca liczbę elementów na liście.

HRESULT GetCaption(indeks size_t, LPBSTR pCaption)

Ta metoda zwraca podpis elementu w określonym indeksie.

IDataNodes, interfejs

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

Ten interfejs zapewnia dostęp do danych hierarchicznych, które można zapisać na stronie. Ten interfejs można uzyskać za pośrednictwem metod w interfejsie ISettingsProperties , który jest dostępny dla twojej strony za pośrednictwem metody Ustawienia .

Dane w kodzie XML strony mogą wyglądać mniej więcej tak

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

Wywołanie polecenia Settings()->GetDataNode(L"Network", &pData) zapewnia wystąpienie IDataNodes z dwoma elementami danych (z których każdy z kolei ma dwie właściwości).

size_t Count()

Ta metoda zwraca liczbę elementów DataItem .

HRESULT SetCaptionProperty(LPCTSTR captionProperty)

Składnik, który obsługuje ten interfejs, obsługuje również funkcję IBindableList, co ułatwia wypełnienie pola kombi danymi z pliku XML strony. Ta metoda kontroluje, która właściwość (setter) w każdym elemencie DataItem będzie używana dla tego powiązania. Można na przykład wywołać tę metodę za pomocą właściwości DisplayName i użyć tej właściwości setter do powiązania danych. Pole kombi będzie zawierać elementy Public i Dev Team .

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

Ta metoda pobiera właściwość z jednego z elementów DataItem . Zobacz Tabele 41 i Tabela 42.

Tabela 41. DataItem GetProperty

Parametr Opis
Indeks Wartość indeksu (zaczynając od 0) elementu DataItem , dla której chcesz pobrać wartość właściwości
Propertyname Nazwa właściwości setter, dla której chcesz pobrać wartość
Propertyvalue Po powrocie zawiera wartość ciągu właściwości

Tabela 42. HRESULT GetProperty

HRESULT Opis
S_OK Właściwość została pobrana.
E_INVALIDARG Indeks znajduje się poza końcem tablicy.
HRESULT GetNode(indeks size_t, [out] ISettingsProperties **ppNode)

Ta metoda jest podobna do metody GetProperty, ale zamiast zwracać jedną wartość z elementu DataItem, zwraca cały element DataItem opakowany w interfejs ISettingsProperties . Zobacz Tabele 43 i Tabela 44.

Tabela 43. HRESULT GetNode

Parametr Opis
Indeks Wartość indeksu (zaczynając od 0) elementu DataItem , dla której chcesz pobrać wartość właściwości
węzeł ppNode Po zakończeniu interfejs ISettingsProperties, który otacza węzeł DataItem

Tabela 44. Hresult GetNode — wyniki

HRESULT Opis
S_OK Węzeł został pobrany.
E_INVALIDARG Indeks znajduje się poza końcem tablicy.

IFactoryRegistry, interfejs

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

Podczas tworzenia nowej strony niestandardowej należy co najmniej utworzyć fabrykę stron — klasę, która implementuje klasę IClassFactory. (Można użyć klasy ClassFactoryImpl jako klasy podstawowej dla fabryki).

void Register(typ LPCTSTR, IClassFactory *pFactory)

Ta metoda rejestruje fabrykę klas w rejestrze. Zobacz Tabela 45.

Tabela 45. IClassFactory void Register

Parametr Opis
Typ Ciąg identyfikujący zarejestrowaną fabrykę; ogólnie rzecz biorąc, ten parametr powinien mieć nazwę firmy w ciągu, aby upewnić się, że jest unikatowy
pFactory Wskaźnik do wystąpienia fabryki klas
HRESULT LoadAndRegister(LPCTSTR dllName, ILogger *pLogger)

Ta metoda służy tylko do użytku wewnętrznego.

BOOL Contains(typ LPCTSTR)

Ta metoda jest zazwyczaj do użytku wewnętrznego. Sprawdza, czy fabryka klas została zarejestrowana dla typu.

HRESULT GetFactory(typ LPCTSTR, IClassFactory **ppFactory)

Ta metoda umożliwia pobranie fabryki klas. Zazwyczaj należy wywołać metodę CreateInstance. Jeśli jednak zamierzasz utworzyć dużą liczbę tego samego składnika, bardziej wydajne jest pobranie fabryki, a następnie poproszenie jej o utworzenie wystąpień.

HRESULT CreateInstance(typ LPCTSTR, IUnknown **ppInstance)

Ta metoda tworzy nowe wystąpienie składnika, biorąc pod uwagę jego typ. Zamiast tego użyj metody szablonu CreateInstance , która umożliwia tworzenie obiektu bezpiecznego dla typu.

HRESULT SetContainer(IWizardPageContainer *pContainer)

Ta metoda służy tylko do użytku wewnętrznego.

HRESULT RegisterService(REFGUID iid, IUnknown *pService)

Usługi to pojedyncze wystąpienia składnika, którego można używać w wielu miejscach. Ta metoda umożliwia zarejestrowanie usługi na jednej stronie, a następnie pobranie tego samego wystąpienia z innej strony.

HRESULT GetService(REFGUID iid, IUnknown **ppService)

Ta metoda pobiera usługę, która została wcześniej zarejestrowana przy użyciu wywołania metody RegisterService.

HRESULT SetLanguage(LANGID languageId)

Ta metoda ustawia język Kreatora UDI na identyfikator języka podany w parametrze languageId .

LANGID GetLanguage()

Ta metoda zwraca wartość identyfikatora języka dostarczonego z / locale parametr wiersza polecenia kreatora UDI. Metoda zwraca jedną z następujących wartości:

  • Wartość identyfikatora języka dostarczonego z / locale parametr wiersza polecenia

  • 0, jeśli nie podano /locale parametr wiersza polecenia

ILogger, interfejs

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

Kreator UDI rejestruje informacje w pliku dziennika, co ułatwia rozwiązywanie problemów znalezionych w tym polu. Dobrym pomysłem jest rejestrowanie informacji na stronach. Wskaźnik do tego interfejsu można uzyskać z poziomu strony przy użyciu metody Logger(). Wiersze w pliku dziennika zawierają numer "level", który reprezentuje komunikaty o błędach, normalnych, pełnych lub debugowania.

Uwaga

Komunikaty debugowania nie są zapisywane w pliku dziennika, chyba że obsługa debugowania jest włączona. Obsługę debugowania można włączyć, dodając następujący wiersz do elementu Style w pliku .config:

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

Ta metoda służy tylko do użytku wewnętrznego.

MoveLog
HRESULT MoveLog(LPCWSTR logFilename)

Ta metoda służy tylko do użytku wewnętrznego.

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

Ta metoda służy tylko do użytku wewnętrznego.

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

Ta metoda służy tylko do użytku wewnętrznego.

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

Wywołaj tę metodę, aby zarejestrować informacje o błędzie. Zobacz Tabela 46.

Tabela 46. Błąd HRESULT

Parametr Opis
Błąd Kod błędu zwrócony przez wywołanie (Ten kod będzie wyświetlany we wpisie dziennika jako numer).
Składnik Ciąg identyfikujący źródło błędu, który jest zwykle twoją stroną lub zapisanym składnikiem
Komunikat Komunikat wyjaśniający przyczynę błędu
Błąd 2
HRESULT Error2(HRESULT error, LPCTSTR component, LPCTSTR message, LPCTSTR message2)

Ta metoda jest podobna do metody Error , ale umożliwia podanie dwuczęściowego komunikatu. Ostatni komunikat będzie zawierać komunikat "message", a następnie "message2" w pliku wyjściowym. Jest to po prostu metoda wygody.

Normalne
HRESULT Normal(LPCTSTR component, LPCTSTR message)

Ta metoda rejestruje normalny komunikat. Zobacz opis metody Error dla parametrów.

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

Ta metoda rejestruje normalny komunikat. Zobacz opis metody Error2 dla parametrów.

Pełne
HRESULT Verbose(LPCTSTR component, LPCTSTR message)

Ta metoda rejestruje pełny komunikat. Zobacz opis metody Error dla parametrów.

Pełne2
HRESULT Verbose2(LPCTSTR component, LPCTSTR message, LPCTSTR message2)

Ta metoda rejestruje pełny komunikat. Zobacz opis metody Error2 dla parametrów.

Debugowania
HRESULT Debug(LPCWSTR component, LPCWSTR message)

Ta metoda rejestruje komunikat debugowania. Zobacz opis metody Error dla parametrów. Komunikaty debugowania nie są zapisywane w pliku, chyba że są włączone. Aby uzyskać szczegółowe informacje, zobacz sekcję Przegląd.

EnableDebug
HRESULT EnableDebug(BOOL debug)

Ta metoda służy tylko do użytku wewnętrznego.

Zamknij
HRESULT Close(void)

Ta metoda służy tylko do użytku wewnętrznego.

GetLogFilename
HRESULT GetLogFilename(LPBSTR pFilename)

Ta metoda pobiera nazwę pliku dziennika.

Interfejs IOrientation

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

Ten interfejs jest przeznaczony tylko do użytku wewnętrznego.

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

Ten interfejs jest przeznaczony tylko do użytku wewnętrznego.

ISettingsProperties, interfejs

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

Ten interfejs zapewnia dostęp do danych stron. Aby przejść do najwyższego poziomu danych strony, użyj metody Settings().

HRESULT GetAttribute(LPCTSTR attributeName, LPBSTR attributeValue)

Ta metoda umożliwia pobranie wartości atrybutów w węźle głównym, który jest węzłem strony , gdy używasz metody Settings() strony.

IStringProperties * Properties()

Ta metoda zapewnia dostęp do wartości właściwości setter w węźle głównym. W przypadku strony są to właściwości najwyższego poziomu.

HRESULT SelectNodes(LPCTSTR xPath, IXMLDOMNodeList **ppList)

Wywołaj tę metodę, jeśli chcesz bezpośrednio uzyskać listę węzłów XML przy użyciu wyrażenia XPath. Lepiej jest użyć jednej z innych metod, jeśli to możliwe. Użyj tej metody tylko wtedy, gdy nie możesz uzyskać dostępu do węzłów w inny sposób.

HRESULT SelectSingleNode(LPCTSTR xPath, IXMLDOMNode **ppNode)

Wywołaj tę metodę, jeśli chcesz bezpośrednio uzyskać pojedynczy węzeł XML przy użyciu wyrażenia XPath. Lepiej jest użyć jednej z innych metod, jeśli to możliwe. Użyj tej metody tylko wtedy, gdy nie możesz przejść do węzła w inny sposób.

HRESULT GetDataNode(nazwa LPCTSTR, ISettingsProperties **ppNode)

Pobierz element Data na podstawie atrybutu Name tego elementu.

HRESULT GetDataNodes(IDataNodes **ppNodes)

Ta metoda pobiera listę elementów DataItem w bieżącym węźle. Na poziomie strony wywołaj polecenie GetDataNode , aby pobrać interfejs ISettingsProperty dla danych. Następnie w tym wystąpieniu wywołaj polecenie GetDataNodes , aby pobrać listę rekordów. Na przykład, biorąc pod uwagę następujący kod XML:

    <Page ...>
      <Data Name="Network">
        <DataItem>
          <Setter Property="DisplayName">Public</Setter>
          <Setter Property="Share">\\servername\Share</Setter>
        </DataItem>
        <DataItem>
          <Setter Property="DisplayName">Dev Team</Setter>
          <Setter Property="Share">\\servername\DevShare</Setter>
        </DataItem>
      </Data>
PSettingsProperties pData;
Settings()->GetDataNode(L"Network", &pData);
PDataNodes pNodes;
pData->GetDataNodes(&pNodes);
HRESULT GetChildDataNodes(LPCTSTR childeName, IDataNodes **ppNodes)

Ta metoda zapewnia szybki sposób uzyskiwania dostępu do zestawu węzłów DataItem w określonym węźle Danych . Korzystając z kodu XML z przykładu GetDataNodes , następujący kod wykonuje dokładnie to samo, co cztery wiersze kodu w przykładzie w obszarze GetDataNodes , ale z sprawdzaniem błędów:

ISimpleStringProperties Interface

ISimpleStringProperties, interfejs

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

Sam ten interfejs może nie być przydatny. Jest on jednak implementowany przez składnik ID_SimpleStringProperties , który implementuje również interfejs IStringProperties . Tego składnika można używać w przypadkach, gdy należy przekazać zestaw właściwości do innego składnika, takiego jak zadanie, ale chcesz programowo dodawać wartości zamiast używać wartości z kodu XML. Oto przykład użycia tego interfejsu:

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

Ten interfejs zapewnia prosty dostęp do zestawu elementów setter, które pochodzą z kodu XML. Ten interfejs jest dostępny dla właściwości strony przy użyciu polecenia Settings()->Properties().

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

Ta metoda pobiera wartość pojedynczej właściwości. Zobacz Tabele 47 i Table 48.

Tabela 47. IHRESULT Pobierz wartość właściwości

Parametr Opis
Propertyname Nazwa właściwości, którą chcesz odczytać
pPropValue Po zakończeniu zawiera wartość właściwości jako ciąg (ta wartość będzie mieć wartość nullptr , jeśli nie ma takiej właściwości).

Tabela 48. IHRESULT — uzyskiwanie wyników wartości właściwości

HRESULT Opis
S_OK Pobierana jest wartość właściwości.
E_INVALIDARG Nie ma właściwości o podanej nazwie.

ITaskManager, interfejs

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

Ten interfejs jest implementowany przez składnik TaskManager (ID_TaskManager w pliku ITaskManager.h), który jest składnikiem uruchamiającym zadania na stronie wstępnej. Możesz użyć strony wstępnej bezpośrednio, czyli tego, co robisz przez większość czasu, lub utworzyć własną stronę, umożliwiając temu składnikowi wykonanie większości pracy.

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

Należy wywołać tę metodę przed wywołaniem innej metody. Inicjuje składnik TaskManager . Zobacz Tabela 49.

Tabela 49. HRESULT Init

Parametr Opis
pPageView Zapewnia dostęp do strony, na której będą uruchamiane zadania (ta strona musi mieć określony zestaw kontrolek, które zostały opisane w kilku następnych parametrach).
idListView Identyfikator kontrolki ListView , który wyświetli listę zadań i stan tych zadań
idMessage Identyfikator kontrolki pola tekstowego, które będzie używane do wyświetlania komunikatu dla wybranego zadania
idRetryButton Identyfikator kontrolki przycisku, który można wybrać, aby ponownie uruchomić zadania
pPageInfo Otoka wokół kodu XML strony (TaskManager ładuje zestaw zadań do uruchomienia z tego kodu XML).
pCallback Może mieć wartość null (jeśli ten parametr nie ma wartości null, taskManager wywołuje metodę Started podczas uruchamiania zadania i metodę Finished dla każdego zadania, które kończy działanie).
HRESULT SetFailMessage(komunikat LPCWSTR)

Ta metoda ustawia komunikat, który będzie wyświetlany, jeśli co najmniej jedno zadanie zakończy się niepowodzeniem.

HRESULT Start(void)

Ta metoda uruchamia wszystkie zadania. Każde zadanie jest uruchamiane w osobnym wątku.

HRESULT GetTaskMessage(indeks size_t, komunikat LPBSTR)

Ta metoda służy tylko do użytku wewnętrznego. Pobiera bieżący komunikat zadania na podstawie indeksu na liście zadań.

HRESULT GetResultType)(indeks size_t, typ LPBSTR)

Ta metoda pobiera bieżący "typ" zadania. Tabela 50 przedstawia dostępne typy.

Tabela 50. HRESULT GetResultType

Type Opis
0 Reprezentuje zadanie, które zakończyło się pomyślnie
1 Reprezentuje zadania, które zwróciły ostrzeżenie
-1 Reprezentuje zadanie zakończone niepowodzeniem

Typ jest pobierany przez przyjrzenie się kodowi zakończenia lub błędu zadania i znalezieniu dopasowania w elemencie XML ExitCodes> zadania<.

HRESULT GetProperty(indeks size_t, LPCTSTR propertyName, wartość LPBSTR)

Ta metoda jest używana przez strony postępu i wstępnego w celu pobrania właściwości Setter BitmapFilename , dzięki czemu może ona wyświetlać obraz obok komunikatu dla wyróżnionego zadania. Innymi słowy, możesz dodać niestandardowego settera do kodu XML zadania, a następnie pobrać go za pomocą tej metody.

int GetSelectedIndex(void)

Ta metoda pobiera indeks aktualnie wybranego zadania, co jest przydatne, jeśli chcesz pobrać dodatkowe informacje o zadaniu (zobacz GetProperty ), aby wyświetlić dla wybranego zadania. Strony postępu i wstępnych używają tej metody do wyświetlania obrazu dla wybranego zadania.

HRESULT Wait(DWORD waitMilliseconds)

Ta metoda pomaga głównie w testach jednostkowych, dzięki czemu test może zapewnić zakończenie zadań przed zakończeniem testu jednostkowego. Ta metoda nie jest zwykle wywoływana. Zwraca wartość po zakończeniu wszystkich zadań lub upłyniętej godzinie oczekiwania.

size_t FailedCount(void)

Ta metoda zwraca liczbę zadań obecnie oznaczonych jako zakończone niepowodzeniem.

size_t WarningCount(void)

Ta metoda zwraca liczbę zadań aktualnie oznaczonych jako ostrzeżenie.

size_t SucceedCount(void)

Ta metoda zwraca liczbę zadań aktualnie oznaczonych jako zakończone powodzeniem.

size_t RunningCount(void)

Ta metoda zwraca liczbę aktualnie uruchomionych zadań.

void OnCommonControlEvent(WORD controlId, LPNMHDR pInfo)

Wywołaj tę metodę z elementu OnCommonControlEvent na stronie, aby menedżer taskmanager mógł przetwarzać wymagane zdarzenia.

void OnControlEvent(WORD eventId, WORD controlId)

Wywołaj tę metodę z elementu OnControlEvent strony, aby menedżer taskmanager mógł przetwarzać wymagane zdarzenia.

void EnableButtons(BOOL enable)

Ta metoda służy tylko do użytku wewnętrznego.

IWizardComponent, interfejs

__interface IWizardComponent : IUnknown
{
    HRESULT SetContainer(IWizardPageContainer *pContainer);
};
Omówienie

Zazwyczaj nie zaimplementujesz tego interfejsu bezpośrednio, ale zamiast tego za pośrednictwem klasy WizardComponent template. Jeśli składnik implementuje ten interfejs i zarejestrowano fabrykę klas w rejestrze, składnik otrzymuje wskaźnik do wystąpienia IWizardPageContainer podczas jego tworzenia. Pomaga to na przykład uzyskać dostęp do rejestratora lub rejestru w celu utworzenia innych składników, których składnik może potrzebować.

IWizardDialogController, interfejs

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

Ten interfejs jest przeznaczony tylko do użytku wewnętrznego.

IWizardDialogView, interfejs

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

Ten interfejs jest przeznaczony tylko do użytku wewnętrznego.

IWizardPage, interfejs

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

Ten interfejs jest implementowany przez kreatoraPageImpl, więc zazwyczaj nie trzeba implementować go samodzielnie. Kreator wywołuje wszystkie te metody w przypadku interakcji ze stronami niestandardowymi.

IWizardPageContainer, interfejs

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

Ten interfejs jest dostępny na stronie za pośrednictwem metody Kontener (zaimplementowana przez WizardPageImpl) i zapewnia dostęp do różnych usług kreatora.

ILogger * Logger(void)

Ta metoda służy do zapisywania komunikatów w pliku dziennika — na przykład:

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

Ta metoda zapewnia dostęp do zmiennych "pamięci", które są właściwościami znajdującymi się w pamięci tylko podczas działania Kreatora UDI. Te właściwości są dostępne dla innych stron w kodzie lub w formacie XML przy użyciu składni $memoryVarName$ .

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

Ta metoda umożliwia utworzenie nowego wystąpienia dowolnego zarejestrowanego składnika. Jednak lepiej jest użyć funkcji szablonu CreateInstance, ponieważ jest silnie wpisana.

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

Ta metoda umożliwia pobranie zarejestrowanej usługi. Jednak lepiej jest wywołać funkcję szablonu GetService , która jest silnie typizowana (zamiast używać funkcji IUnknown).

HRESULT ReplaceVariables(źródło LPCTSTR, [out] LPBSTR pDest)

Ta metoda obsługuje pracę ze zmiennymi wewnątrz wartości ciągu. Obsługuje ona formaty wyświetlane w tabelach 51 i 52.

Tabela 51. HRESULT ReplaceVariables

Formatowanie Opis
$Name$ Zastępuje wartość zmiennej pamięci tą nazwą (jeśli nie ma zmiennej pamięci o nazwie, "token" zostanie usunięty).
%Name% Zmienna sekwencji zadań lub zmienna środowiskowa. Kolejność jest następująca:

1. Użyj wartości zmiennej sekwencji zadań, jeśli jest obecna.
2. Użyj wartości zmiennej środowiskowej, jeśli jest obecna.
3. W przeciwnym razie usuń ten tekst z ciągu.

Tabela 52. HRESULT, parametr

Parametr Opis
Źródło Ciąg wejściowy, który może zawierać dowolną kombinację zmiennych $ i % lub w ogóle brak
pDest Po powrocie zawiera nowy ciąg, który ma wszystkie tokeny zastąpione zgodnie z tabelą 51
HRESULT GotoPage(LPCTSTR pageName)

Ta metoda nie została w pełni przetestowana. Chodzi o to, że można przełączyć się bezpośrednio do określonej strony na podstawie nazwy strony zdefiniowanej w pliku XML .config. Wywołanie tej metody pomija element OnNextSelected na stronie. Ponadto zachowanie tej metody może ulec zmianie, więc użyj jej na własne ryzyko.

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

Ta metoda wyświetla pole komunikatu z podanym tekstem i podpis. Parametr uType to dowolna wartość, którą można podać funkcji MessageBox Win32.

BOOL InPreview(void)

Ta metoda zwraca wartość TRUE, jeśli kreator został uruchomiony w trybie "wersja zapoznawcza", podając przełącznik /preview . W trybie podglądu przycisk Dalej nigdy nie jest wyłączony. Ta metoda umożliwia obejście kodu w trybie podglądu, na przykład, który może powodować problemy, gdy nie masz prawidłowych danych na stronie.

HWND GetHwnd(void)

Ta metoda zwraca wartość HWND dla głównego okna dialogowego. Użyj tej metody z ostrożnością. Ogólnie rzecz biorąc, interfejs programowania aplikacji Kreatora UDI został zaprojektowany tak, aby nigdy nie pracować bezpośrednio z uchwytami okien.

IWizardPageView, interfejs

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

Ten interfejs jest dostępny dla kodu na stronie za pośrednictwem metody View (zaimplementowanego przez WizardPageImpl).

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

Kreator UDI używa otoek, które są naprawdę fasadami do interakcji z kontrolkami na stronie. Użycie tych elewacji zamiast rzeczywistych kontrolek znacznie ułatwia pisanie testów dla strony, ponieważ można udostępniać makiety fasad z testów.

Zamiast używać tej metody bezpośrednio, lepiej jest użyć metody szablonu GetControlWrapper , która jest silnie typizowana — na przykład:

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

Ta metoda zwraca dojście okna dla strony. Ogólnie rzecz biorąc, nie należy potrzebować dostępu do tego dojścia okna.

HWND GetControl(int itemId)

Jeśli musisz, możesz wywołać tę metodę, aby uzyskać uchwyt okna dla kontrolki na stronie. (Lepiej jest wywołać funkcję szablonu GetControlWrapper ).

HRESULT Show (void)

Ta metoda służy tylko do użytku wewnętrznego.

HRESULT Hide(void)

Ta metoda służy tylko do użytku wewnętrznego.

Koncentracja uwagi HRESULT (int itemId)

Ustaw fokus wejściowy na określoną kontrolkę.

IWizardPage * Page(void)

Ta metoda służy tylko do użytku wewnętrznego.

IFormController * Form(void)

Ta metoda służy tylko do użytku wewnętrznego.

HRESULT FocusWizardButton(Przycisk Kreatora)

Ustawia fokus na jeden z przycisków kreatora. KreatorButtons ma dwie wartości: BackButton i NextButton.

HRESULT SetEnable(Przycisk Kreatora, włącz wartość BOOL)

Zażądaj włączenia lub wyłączenia jednego z przycisków kreatora. Przycisk może nie odpowiadać żądanemu stanowi. Jeśli na przykład uruchomisz Kreatora UDI z przełącznikiem /preview , przyciski będą zawsze włączone. KreatorButtons ma dwie wartości: BackButton i NextButton.

void ShowWarningMessage(komunikat LPCTSTR)

Ta metoda wyświetla komunikat ostrzegawczy w dolnej części obszaru zawartości strony. Ta wiadomość może być dowolnym tekstem.

void HideWarningMessage(void)

Ukryj wyświetlany komunikat ostrzegawczy z wywołaniem polecenia ShowWarningMessage.

IXmlDocument, interfejs

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

Ten interfejs jest implementowany przez składnik ID_IXmlDocument , który jest fasadą zaprojektowaną w celu ułatwienia pracy z dokumentami XML w języku C++.

HRESULT Load(Nazwa pliku LPCTSTR)

Ta metoda ładuje dokument XML z pliku zewnętrznego. Zwraca S_OK , jeśli plik został załadowany bez błędów lub S_FALSE w przypadku wystąpienia błędu. W przypadku wystąpienia błędu możesz uzyskać komunikat o błędzie, wywołując polecenie GetParseErrorMessage.

HRESULT LoadXml(LPCTSTR xml)

Ta metoda ładuje dokument XML z ciągu zamiast pliku zewnętrznego. Inne niż źródło odczytu kodu XML zachowanie jest takie samo jak metoda Load .

HRESULT Save(Nazwa pliku LPCWSTR)

Ta metoda zapisuje dokument XML w pamięci do pliku zewnętrznego.

HRESULT GetParseErrorMessage(LPBSTR pMessage)

Ta metoda zwraca nowy ciąg z komunikatem o błędzie podczas ładowania dokumentu XML, jeśli istnieje. Zawsze zwraca S_OK.

HRESULT SelectNodes(LPCTSTR xpath, IXMLDOMNodeList **ppNodes)

Ta metoda umożliwia użycie wyrażenia XPath w celu pobrania kolekcji węzłów z dokumentu. Zawsze zwraca S_OK.

HRESULT SelectSingleNode(LPCTSTR xpath, IXMLDOMNode **ppNode)

Ta metoda umożliwia użycie wyrażenia XPath w celu pobrania jednego węzła z dokumentu. Zawsze zwraca S_OK.

HRESULT AddSchema(Nazwa pliku LPCTSTR, LPCTSTR ns)

Ta metoda dodaje nazwę pliku schematu zewnętrznego, który będzie używany do weryfikowania schematu dokumentu XML po załadowaniu. Podana przestrzeń nazw to ciąg, którego można użyć w zapytaniach XPath, chociaż nie został on przetestowany.

HRESULT AddAttribute(IXMLDOMNode *pNode, nazwa LPCWSTR, wartość LPCWSTR)

Ta metoda dodaje nowy atrybut do istniejącego węzła w dokumencie XML. Zobacz Tabela 53.

Tabela 53. HRESULT AddAttribute

Parametr Opis
węzeł węzła Węzeł, do którego chcesz dodać atrybut
Nazwa Nazwa nowego atrybutu
Wartość Wartość nowego atrybutu
HRESULT CreateNode(typ DOMNodeType, nazwa LPCWSTR, LPCWSTR ns, IXMLDOMNode **ppNode)

Wywołaj tę metodę, aby utworzyć nowy węzeł:

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

Po utworzeniu nowego węzła możesz dodać go jako element podrzędny do innego węzła, wywołując metodę appendChild elementu nadrzędnego.

Funkcje pomocnika

CreateInstance, funkcja szablonu

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

Ta funkcja jest zdefiniowana w pliku IWizardPageContainer.h i udostępnia bezpieczną dla typu otokę za pośrednictwem metody IWizardPageContainer-CreateInstance> — na przykład:

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

Ten kod tworzy nowy składnik ID_Directory w celu pobrania interfejsu IDirectory tego składnika.

GetService, funkcja szablonu

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

Ta funkcja jest zdefiniowana w pliku IWizardPageContainer.h i udostępnia otokę bezpieczną dla typu za pośrednictwem metody IWizardPageContainer-GetService> — na przykład:

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

Ta funkcja pobiera składnik sekwencji zadań, który obsługuje interfejs ITSVariableBag . (W przypadku elementu ITSVariableBag można użyć metody TSVariables klasy WizardPageImpl ).

Kreator UDI Projektant dokumentacja schematu pliku konfiguracji

Ten plik jest używany przez Kreatora UDI Projektant. Dla każdego niestandardowego pliku .dll tworzony jest oddzielny plik, który może zawierać niestandardowe edytory stron kreatora, zadania niestandardowe lub niestandardowe moduły sprawdzania poprawności. Plik musi kończyć się .config i znajdować się w folderze installation_folder\Bin\Config (gdzie installation_folder jest folderem, w którym zainstalowano mdt).

Tabela 54 zawiera listę elementów w kreatorze UDI Projektant pliku konfiguracji i ich opisów. Element DesignerConfig jest węzłem głównym tego odwołania.

Tabela 54. Elementy w Kreatorze UDI Projektant plik konfiguracji i ich opisy

Nazwa elementu Opis
DesignerConfig Określa katalog główny dla wszystkich innych elementów
DesignerMappings Grupuje zestaw elementów strony
Strona Określa edytor stron kreatora do załadowania w Kreatorze UDI Projektant, który służy do edytowania ustawień konfiguracji strony kreatora
Param Określa parametr przekazywany do nadrzędnego elementu Task lub Validator i odpowiada elementowi Setter w pliku konfiguracji Kreatora UDI Uwaga: Atrybuty tego elementu są różne, jeśli elementem nadrzędnym jest element Task lub Validator .
Zadanie Określa zadanie w bibliotece zadań
Element zadania Określa grupę parametrów, które są przekazywane do zadania
TaskLibrary Grupuje zestaw elementów zadania
Walidatora Określa moduł sprawdzania poprawności w bibliotece modułu sprawdzania poprawności
ValidatorLibrary Grupuje zestaw elementów modułu sprawdzania poprawności

DesignerConfig

Ten element określa katalog główny dla wszystkich innych elementów.

Informacje o elemencie

Tabela 55 zawiera informacje o elemencie DesignerConfig .

Tabela 55. Informacje o elemencie DesignerConfig

Atrybut Wartość
Liczba wystąpień Jeden: ten element jest wymagany.
Elementy nadrzędne Brak
Spis treści DesignerMappings, TaskLibrary, ValidatorLibrary
Atrybuty elementów

Ten element nie ma atrybutów.

Uwagi

Brak.

Przykład
<DesignerConfig>
   + <TaskLibrary>
   + <ValidatorLibrary>
   + <DesignerMappings>
</DesignerConfig>

DesignerMappings

Ten element grupuje zestaw elementów strony .

Informacje o elemencie

Tabela 56 zawiera informacje o elemencie DesignerMappings .

Tabela 56. Informacje o elemencie DesignerMappings

Atrybut Wartość
Liczba wystąpień Zero lub jeden w elemencie DesignerConfig (ten element jest opcjonalny, jeśli w biblioteki DLL nie ma niestandardowej strony kreatora odpowiadającej temu Kreatorowi UDI Projektant pliku konfiguracji).
Elementy nadrzędne DesignerConfig
Spis treści Strona
Atrybuty elementów

Ten element nie ma atrybutów.

Uwagi

Brak.

Przykład
<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>

Strona

Ten element określa edytor stron kreatora do załadowania w Kreatorze UDI Projektant, który jest z kolei używany do edytowania ustawień konfiguracji strony kreatora.

Informacje o elemencie

Tabela 57 zawiera informacje o elemencie Page .

Tabela 57. Informacje o elemencie strony

Atrybut Wartość
Liczba wystąpień Co najmniej jedna strona kreatora zdefiniowana w elemencie DesignerMappings
Elementy nadrzędne DesignerMappings
Spis treści Dowolna dobrze sformułowana zawartość XML
Atrybuty elementów

Tabela 58 zawiera atrybuty elementu Page i opis dla każdego z nich.

Tabela 58. Atrybuty i odpowiadające im wartości elementu strony

Atrybut Opis
Opis Określa tekst zawierający informacje o parametrze, który jest wyświetlany w Kreatorze UDI Projektant
ProjektantAssembly Określa nazwę pliku .dll skojarzonego z edytorem stron kreatora (plik .dll musi istnieć w folderze installation_folder\Bin (gdzie installation_folder jest folderem, w którym zainstalowano funkcję MDT).
Typ projektanta Określa nazwę edytora stron kreatora w pliku .dll określonym w atrybucie DesignerAssembly (Jest to typ platformy Microsoft .NET dla edytora stron kreatora z w pełni kwalifikowaną przestrzenią nazw platformy Microsoft .NET).
Displayname Określa przyjazną dla użytkownika nazwę edytora stron, która jest wyświetlana w Kreatorze UDI Projektant
DLL Określa nazwę pliku .dll skojarzonego ze stroną kreatora (plik .dll musi istnieć w folderze installation_folder\Templates\Distribution\Tools\platform (gdzie installation_folder jest folderem, w którym zainstalowano mdt, a platforma to x86 dla wersji 32-bitowej lub x64 dla wersji 64-bitowej). Uwaga: Upewnij się, że architektura procesora DLL jest zgodna z zainstalowaną architekturą procesora MDT. Jeśli na przykład zainstalowano 32-bitową wersję mdt, upewnij się, że używasz 32-bitowej biblioteki DLL na stronie kreatora.
Obrazu Określa nazwę obrazu strony w formacie Portable Network Graphics (PNG) (Plik .png musi istnieć w folderze installation_folder\Bin\Images (gdzie installation_folder jest folderem, w którym zainstalowano mdt).
Type Określa edytor stron kreatora i musi odpowiadać nazwie użytej podczas rejestrowania strony niestandardowej
Uwagi

Kreator UDI Projektant używa elementu Page, takiego jak szablon, do utworzenia początkowego kodu XML dla nowego kreatora. Kreator UDI Projektant wykonuje walidację schematu, aby upewnić się, że elementy strony i elementy podrzędne mają prawidłowy format. Ten element zawiera mapowanie między typem strony Kreatora UDI a informacjami, które Kreator UDI Projektant musi edytować i tworzyć strony tego typu przy użyciu niestandardowego edytora stron.

Przykład

Brak.

Param

Ten element określa parametr przekazywany do nadrzędnego elementu Task lub Validator i odpowiada elementowi Setter w pliku konfiguracji Kreatora UDI.

Uwaga

Atrybuty tego elementu są różne, jeśli elementem nadrzędnym jest element Task lub Validator .

Informacje o elemencie

Tabela 59 zawiera informacje o elemencie Param .

Tabela 59. Informacje o elemencie param

Atrybut Wartość
Liczba wystąpień Co najmniej jeden element nadrzędny TaskItem lub Validator
Elementy nadrzędne TaskItem, Validator
Spis treści Dowolna dobrze sformułowana zawartość XML
Atrybuty elementów

Tabela 60 zawiera listę atrybutów elementu Param i zawiera opis każdego z nich.

Tabela 60. Atrybuty i odpowiednie wartości dla elementu Param

Atrybut Opis
Opis Określa tekst, który zawiera informacje o parametrze, który jest wyświetlany w Kreatorze UDI Projektant Uwaga: ten atrybut jest prawidłowy tylko dla elementu Validator.
Displayname Określa przyjazną dla użytkownika nazwę parametru validator, która jest wyświetlana dla odpowiedniej strony Kreatora UDI w Kreatorze UDI Projektant (Ta nazwa jest zwykle bardziej opisowa niż atrybut Nazwa). Uwaga: ten atrybut jest prawidłowy tylko dla elementu Validator.
Nazwa Określa nazwę parametru, który jest przekazywany do zadania lub modułu sprawdzania poprawności, w zależności od elementu nadrzędnego (Ten atrybut stanie się atrybutem właściwości w elemencie Setter w pliku konfiguracji Kreatora UDI). Uwaga: Ten parametr jest używany zarówno dla elementów nadrzędnych TaskItem , jak i Validator .
Uwagi

Brak.

Przykład

Brak.

Zadanie

Ten element określa zadanie w bibliotece zadań.

Informacje o elemencie

Tabela 61 zawiera informacje o elemencie Task .

Tabela 61. Informacje o elemencie zadania

Atrybut Wartość
Liczba wystąpień Co najmniej jeden element w elemencie TaskLibrary (ten element nie jest opcjonalny, jeśli określono element TaskLibrary ).
Elementy nadrzędne TaskLibrary
Spis treści Element zadania
Atrybuty elementów

Tabela 62 zawiera listę atrybutów elementu Task i zawiera opis każdego z nich.

Tabela 62. Atrybuty i odpowiadające im wartości dla elementu zadania

Atrybut Opis
Opis Określa tekst zawierający informacje o zadaniu, który jest wyświetlany w Kreatorze UDI Projektant
DLL Określa nazwę pliku .dll skojarzonego z zadaniem (plik .dll musi istnieć w folderze installation_folder\Templates\Distribution\Tools\platform (gdzie installation_folder jest folderem, w którym zainstalowano mdt, a platforma to x86 dla wersji 32-bitowej lub x64 dla wersji 64-bitowej).
Nazwa Określa nazwę zadania, która jest wyświetlana na odpowiedniej stronie Kreatora UDI i w Kreatorze UDI Projektant
Type Określa typ zadania, który jest zarejestrowany w rejestrze fabryki i używany do wywoływania określonego zadania w pliku .dll
Uwagi

Brak.

Przykład

Brak.

Element zadania

Ten element określa grupę parametrów, które są przekazywane do zadania.

Informacje o elemencie

Tabela 63 zawiera informacje o elemencie TaskItem .

Tabela 63. Informacje o elemencie TaskItem

Atrybut Wartość
Liczba wystąpień Co najmniej jeden element zadania
Elementy nadrzędne Zadanie
Spis treści Param
Atrybuty elementów

Tabela 64 zawiera listę atrybutów elementu TaskItem i zawiera opis każdego z nich.

Tabela 64. Atrybut i odpowiednie wartości elementu TaskItem

Atrybut Opis
Typ Określa typ elementu, który zostanie utworzony w pliku konfiguracji Kreatora UDI. Zostanie utworzony element XML odpowiadający wartości tego atrybutu. Jeśli na przykład wartość tego atrybutu to Plik, w pliku konfiguracji Kreatora UDI zostanie utworzony element Plik .

Obecnie jedynymi obsługiwanymi wartościami są:

- Plik, który wymaga dwóch elementów podrzędnych Param (jeden element podrzędny Param z atrybutem Name ustawionym na Source i innym elementem podrzędnym Param z atrybutem Nameustawionym na Dest)
- Setter, który wymaga jednego elementu podrzędnego Param
Uwagi

Brak.

Przykład

Brak.

TaskLibrary

Ten element grupuje zestaw elementów zadania .

Informacje o elemencie

Tabela 65 zawiera informacje o elemencie TaskLibrary .

Tabela 65. Informacje o elemencie TaskLibrary

Atrybut Wartość
Liczba wystąpień Zero lub jeden w elemencie DesignerConfig (ten element jest opcjonalny, jeśli w biblioteki DLL nie ma zadań niestandardowych odpowiadających temu Kreatorowi UDI Projektant pliku konfiguracji).
Elementy nadrzędne DesignerConfig
Spis treści Zadanie
Atrybuty elementów

Ten element nie ma atrybutów.

Uwagi

Brak.

Przykład
<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>

Walidatora

Ten element określa moduł sprawdzania poprawności w bibliotece modułu sprawdzania poprawności.

Informacje o elemencie

Tabela 66 zawiera informacje o elemencie Validator .

Tabela 66. Informacje o elemencie modułu sprawdzania poprawności

Atrybut Wartość
Liczba wystąpień Zero lub więcej w elemencie ValidatorLibrary (ten element jest opcjonalny).
Elementy nadrzędne ValidatorLibrary
Spis treści Param
Atrybuty elementów

Tabela 67 zawiera listę atrybutów elementu Validator i zawiera opis każdego z nich.

Tabela 67. Atrybuty i odpowiednie wartości dla elementu validator

Atrybut Opis
Opis Określa tekst zawierający informacje o walidatorze, który jest wyświetlany w Kreatorze UDI Projektant
Displayname Określa przyjazną dla użytkownika nazwę modułu sprawdzania poprawności wyświetlaną w Kreatorze UDI Projektant (Ta nazwa jest zwykle bardziej opisowa niż atrybut Nazwa).
DLL Określa nazwę pliku .dll skojarzonego z modułem sprawdzania poprawności (plik .dll musi istnieć w folderze installation_folder\Templates\Distribution\Tools\platform (gdzie installation_folder jest folderem, w którym zainstalowano mdt, a platforma to x86 dla wersji 32-bitowej lub x64 dla wersji 64-bitowej).
Nazwa Określa nazwę modułu sprawdzania poprawności, która jest wyświetlana na odpowiedniej stronie Kreatora UDI i w Kreatorze UDI Projektant
Type Określa typ modułu sprawdzania poprawności, który jest zarejestrowany za pomocą współczynnika rejestru i używany do wywoływania określonego modułu sprawdzania poprawności w pliku .dll
Uwagi

Brak.

Przykład

Brak.

ValidatorLibrary

Ten element grupuje zestaw elementów modułu sprawdzania poprawności .

Informacje o elemencie

Tabela 68 zawiera informacje o elemencie ValidatorLibrary .

Tabela 68. ValidatorLibrary, informacje o elemencie

Atrybut Wartość
Liczba wystąpień Zero lub jeden w elemencie DesignerConfig (ten element jest opcjonalny, jeśli w biblioteki DLL nie ma niestandardowych modułów sprawdzania poprawności odpowiadających temu Kreatorowi UDI Projektant pliku konfiguracji).
Elementy nadrzędne DesignerConfig
Spis treści Walidatora
Atrybuty elementów

Ten element nie ma atrybutów.

Uwagi

Brak.

Przykład

<DesignerConfig> + <TaskLibrary> — <ValidatorLibrary> +<Validator DLL="" Description="Requires text in a field" Type="Microsoft.Wizard.Validation.NonEmpty" Name="NonEmpty"> +<Validator DLL="" Description="Doesn nie zezwalaj, aby niektóre znaki były w polu" Type="Microsoft.Wizard.Validation.InvalidChars" Name="InvalidChars"> +<Validator DLL="" Description="Must follow a pre-defined pattern" Type="Microsoft.Wizard.Validation.RegEx" Name=" NamedPattern"> +<Validator DLL="" Description="Require the contents match a regular expression" Type="Microsoft.Wizard.Validation.RegEx" Name="RegEx"></ValidatorLibrary> + <DesignerMappings></DesignerConfig>

Dokumentacja Projektant Kreatora UDI

Formantów

Kontrolki używane do tworzenia niestandardowych edytorów stron kreatora do użycia w Kreatorze UDI Projektant to wystąpienia WPF UserControl. Tabela 69 zawiera listę kontrolek, których można użyć do tworzenia niestandardowych edytorów stron kreatora.

Tabela 69. Kontrolki, których można użyć do tworzenia niestandardowych edytorów stron kreatora

Kontroli Opis
CollectionTControl Ta kontrolka służy do edytowania danych przechowywanych w elemencie Dane w elemencie Page .
FieldElementControl Ta kontrolka służy do edytowania pola, które jest zwykle połączone z kontrolką TextBox na stronie xaml.
SetterControl Ta kontrolka służy do modyfikowania wartości elementu setter w pliku konfiguracji Kreatora UDI.

CollectionTControl

Ta kontrolka zapewnia wiele możliwości edycji danych. Najlepszym sposobem, aby dowiedzieć się, jak używać tej kontrolki, jest przyjrzenie się przykładowi, w którym pokazano, jak edytować dane w elemencie Dane strony. W szczególności w przykładzie pokazano, jak dodawać, usuwać i edytować elementy w tej kontrolce.

FieldElementControl

Ta kontrolka służy do edytowania pola, które jest zwykle połączone z kontrolką TextBox na stronie xaml.

Przykład

Poniższy fragment pliku xaml ilustruje użycie kontrolki FieldElementControl do skonfigurowania wartości domyślnej pola na stronie kreatora przy użyciu podrzędnej kontrolki TextBox :

<Controls:FieldElementControl
Width="450"
Margin="0,5"
FieldData="{Binding DataContext.Location, ElementName=ControlRoot}"
HeaderText="Location Combo Box"
InstructionText="Here you can configure the behavior of the location combo box."
HideValidationTab="True">

<TextBox Text="{Binding FieldData.DefaultValue,
 UpdateSourceTrigger=PropertyChanged,
 Mode=TwoWay}"/>
</Controls:FieldElementControl>
Właściwości
FieldData

Ta właściwość ciągu zawiera informacje dotyczące łączenia pola FieldElementControl z bazowym kodem XML pola. Połączenie jest nawiązywane z właściwością interfejsu edytora stron. Poniższy fragment pliku xaml ilustruje użycie właściwości FieldData :

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

W tym fragmencie interfejs edytora stron nosi nazwę ControlRoot i jest określony w parametrze ElementName . Powiązanie jest wykonywane z właściwością DataContext.Location interfejsu edytora stron ControlRoot . DataContext to model widoku, który wskazuje element Page w pliku konfiguracji Kreatora UDI. Lokalizacja to właściwość widoku, która zwraca listę możliwych lokalizacji i jest definiowana przez element Data w pliku konfiguracji Kreatora UDI. Każda lokalizacja jest definiowana przez element DataItem w pliku konfiguracji Kreatora UDI.

Headertext

Ta właściwość ciągu umożliwia określenie nagłówka kontrolki FieldElementControl . Nagłówek działa jako tytuł kontrolki i jest sformatowany jako pogrubiony, pomarańczowy tekst wyświetlany bezpośrednio nad kontrolką.

Instructiontext

Ta właściwość ciągu umożliwia określenie tekstu informacyjnego kontrolki FieldElementControl . Zazwyczaj tekst służy do podania krótkiego opisu pola i wyjaśnienia, w jaki sposób konfigurowanie pola wpływa na odpowiednią stronę kreatora.

HideEnableButton

Ta właściwość logiczna umożliwia kontrolowanie widoczności przycisku, który zmienia stan między odblokowanym i zablokowanym (włączonym lub wyłączonym). Jeśli ustawiono wartość na:

  • Prawda, przycisk nie jest widoczny

  • False, przycisk jest widoczny (jest to wartość domyślna).

HideDefaultTab

Ta właściwość logiczna umożliwia kontrolowanie widoczności sekcji zawierającej kontrolkę używaną do ustawiania wartości domyślnej. Mimo że właściwość odwołuje się do karty, w kontrolce FieldElementControl nie ma karty, ale sekcja może być ukryta. Jeśli ustawiono wartość na:

  • Prawda, że sekcja nie jest widoczna

  • False, sekcja jest widoczna (jest to wartość domyślna).

HideBorder

Ta właściwość logiczna umożliwia kontrolowanie widoczności obramowania wokół kontrolki pola. Jeśli ustawiono wartość na:

  • Prawda, obramowanie nie jest widoczne

  • Fałsz, obramowanie jest widoczne (jest to wartość domyślna).

HideImage

Ta właściwość logiczna umożliwia kontrolowanie widoczności obrazu skonfigurowanego przez właściwość FieldImageSource . Jeśli ustawiono wartość na:

  • To prawda, że obraz nie jest widoczny

  • False, obraz jest widoczny (jest to wartość domyślna).

HideValidationTab

Ta właściwość logiczna umożliwia kontrolowanie widoczności sekcji, w której zarządzana jest lista walidatorów. Mimo że właściwość odwołuje się do karty, w kontrolce FieldElementControl nie ma karty, ale sekcja może być ukryta. Jeśli ustawiono wartość na:

  • Prawda, że sekcja nie jest widoczna

  • False, sekcja jest widoczna (jest to wartość domyślna).

HideSummaryTab

Ta właściwość logiczna umożliwia kontrolowanie widoczności sekcji, w której skonfigurowano podsumowanie pola podpis. Podpis i odpowiadająca jej wartość z pola są wyświetlane na stronie kreatora SummaryPage w przepływie etapów. Mimo że właściwość odwołuje się do karty, w kontrolce FieldElementControl nie ma karty, ale sekcja może być ukryta. Jeśli ustawiono wartość na:

  • Prawda, że sekcja nie jest widoczna

  • False, sekcja jest widoczna (jest to wartość domyślna).

HideTaskSequenceTab

Ta właściwość logiczna umożliwia kontrolowanie widoczności sekcji, w której skonfigurowano zmienną sekwencji zadań odpowiadającą polu. Mimo że właściwość odwołuje się do karty, w kontrolce FieldElementControl nie ma karty, ale sekcja może być ukryta. Jeśli ustawiono wartość na:

  • Prawda, że sekcja nie jest widoczna

  • False, sekcja jest widoczna (jest to wartość domyślna).

SetterControl

Ta kontrolka służy do modyfikowania wartości elementu Setter w pliku konfiguracji Kreatora UDI. Ta kontrolka zawiera kontrolkę podrzędną używaną do modyfikowania wartości elementu setter .

Przykład

Poniższy fragment pliku xaml ilustruje użycie kontrolki SetterControl do zmodyfikowania elementu Setter o nazwie KeyLocationSetter przy użyciu podrzędnej kontrolki TextBox .

<Controls:SetterControl Margin="5"
        Width="450"
        HeaderText="Title text"
        SetterData="{Binding KeyLocationSetter}"
        InstructionText="What this means..."
        HorizontalAlignment="Left">

    <TextBox
                   Margin="0,3"
                   Text="{Binding SetterData.SetterValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
    />

</Controls:SetterControl>
Właściwości
SetterData

Należy powiązać ją z właściwością widoku lub modelu widoku, która łączy się z ustawiaczem. Jest to podobne do sposobu powiązania z polem, zgodnie z opisem dla kontrolki FieldElementControl.

Headertext

Ta właściwość umożliwia ustawienie tekstu, który będzie wyświetlany w nagłówku kontrolki. Tę właściwość należy traktować jako tytuł kontrolki; Domyślnie jest wyświetlany jako pogrubiony, pomarańczowy tekst.

Instructiontext

Ustaw tę właściwość na tekst, który ma być wyświetlany poniżej nagłówka — zazwyczaj tekst instrukcji informujący użytkownika edytora niestandardowego o tym, kiedy i dlaczego chce zmodyfikować zachowanie pola.

Interfejsów

Tabela 70 zawiera listę interfejsów, których można użyć do tworzenia niestandardowych edytorów stron kreatora.

Tabela 70. Interfejsy, których można użyć do tworzenia niestandardowych edytorów stron kreatora

Interfejs Opis
IDataService Ten interfejs służy do łączenia pól z elementami danych w pliku konfiguracji Kreatora UDI.
IMessageBoxService Ten interfejs zapewnia dostęp do metod, których można użyć do wyświetlania pól komunikatów.

IDataService

Ten interfejs zawiera kilka właściwości i metod, ale istnieje tylko jedna właściwość, której potrzebujesz. Ta właściwość jest jedyną właściwością udokumentowaną tutaj.

Możesz użyć wstrzykiwania zależności, aby uzyskać wskaźnik do tego interfejsu przy użyciu kodu takiego jak ten w klasie:

[Dependency]
public IDataService DataService { get; set; }
Właściwości

Tabela 71 zawiera listę właściwości interfejsu IDataService .

Tabela 71. Właściwości interfejsu IDataService

Interfejs Opis
Currentpage Ta właściwość zapewnia dostęp do elementów XML, atrybutów i wartości poniżej kontekstu bieżącej strony edytowanej w pliku konfiguracji Kreatora UDI
Currentpage
XElement CurrentPage { get; set; }

Ta właściwość zapewnia dostęp do kodu XML dla bieżącej strony. Nigdy nie należy ustawiać tej właściwości, ale możesz modyfikować kod XML dla strony. Przykładowy edytor stron przedstawia przykłady modyfikowania kodu XML. Ta właściwość jest używana głównie wtedy, gdy masz dane niestandardowe. W przypadku pól i właściwości (ustawień) można użyć wstępnie utworzonych kontrolek, które zajmują się wszystkimi szczegółami.

IMessageBoxService

Ten interfejs zapewnia dostęp do metod, których można użyć do wyświetlania pól komunikatów. Być może zastanawiasz się, dlaczego potrzebujesz interfejsu do wyświetlenia pola komunikatu. W rzeczywistości nie: firma Microsoft używa tego interfejsu w kodzie, ponieważ ułatwia pisanie testów automatycznych dla stron projektanta.

Jednak użycie tych metod zapewnia jedną przydatną korzyść: w oknach dialogowych zawsze ustawiono "właściciela" na Kreatora UDI, co gwarantuje, że okno dialogowe jest poprawnie pogrupowane z oknem głównym.

Możesz użyć wstrzykiwania zależności, aby uzyskać wskaźnik do tego interfejsu przy użyciu kodu takiego jak ten w klasie:

[Dependency]
public IMessageBoxService MessageBoxes { get; set; }
Metody

Tabela 72 zawiera listę metod interfejsu IMessageBoxService .

Tabela 72. Metody interfejsu IMessageBoxService

Metoda Opis
Showmessagebox Ta przeciążona metoda służy do wyświetlania pola komunikatu z następującymi elementami członkowskimi:

- ShowMessageBox(komunikat ciągu, podpis ciągów, ikona MessageBoxImage)
- ShowMessageBox(komunikat ciągu, ciąg podpis, przycisk MessageBoxButton, ikona MessageBoxImage)
- ShowMessageBox(wyjątek wyjątku)
ShowDialogWindow Użyj tej metody, aby utworzyć nowe okno dialogowe.
ShowWizardWindow Ta metoda służy do wyświetlania edytora niestandardowego wewnątrz okna dialogowego zawierającego przyciski Dalej i Wstecz na potrzeby nawigacji.
Showmessagebox

Ta metoda wyświetla pole komunikatu, które jest elementem podrzędnym edytora stron kreatora niestandardowego. Ten element członkowski jest przeciążony: Tabela 73 zawiera listę elementów członkowskich i krótki opis każdego z nich. Aby uzyskać pełne informacje o poszczególnych elementach członkowskich (w tym o składni, użyciu i przykładach), zobacz sekcję, która odpowiada poszczególnym elementom członkowskim.

Tabela 73. Przeciążone elementy członkowskie dla metody ShowMessagBox

Członkowskich Opis
ShowMessageBox(komunikat ciągu, podpis ciągów, ikona MessageBoxImage) Wyświetla okno komunikatu z ikoną i przyciskiem OK
ShowMessageBox(komunikat ciągu, ciąg podpis, przycisk MessageBoxButton, ikona MessageBoxImage) Wyświetla okno komunikatu z ikoną i różnymi możliwymi kombinacjami przycisków
ShowMessageBox(wyjątek wyjątku) Wyświetla okno komunikatu, które zawiera informacje o wyjątku i ma przycisk OK
ShowMessageBox(komunikat ciągu, podpis ciągów, ikona MessageBoxImage)
void ShowMessageBox(String message, String caption, MessageBoxImage icon);

Ta metoda wyświetla okno komunikatu z przyciskiem OK . Zobacz Tabela 74.

Tabela 74. Parametry metody ShowMessageBox(komunikat ciągu, podpis ciągu, ikona MessageBoxImage)

Parametr Opis
Komunikat Komunikat do wyświetlenia w obszarze zawartości pola komunikatu
podpis Tekst wyświetlany na pasku tytułu okna dialogowego
Ikonę Typ ikony do pokazania w polu komunikatu
ShowMessageBox(komunikat ciągu, ciąg podpis, przycisk MessageBoxButton, ikona MessageBoxImage)
MessageBoxResult ShowMessageBox(string message, string caption, MessageBoxButton button, MessageBoxImage icon);

Ta metoda wyświetla pole komunikatu z zestawem przycisków, które chcesz pokazać, i raportuje wybrany przycisk. Zobacz Tabela 75.

Tabela 75. Parametry metody ShowMessageBox(komunikat ciągu, ciąg podpis, przycisk MessageBoxButton, ikona MessageBoxImage)

Parametr Opis
Komunikat Komunikat do wyświetlenia w obszarze zawartości pola komunikatu
podpis Tekst wyświetlany na pasku tytułu okna dialogowego
Przycisk Które przyciski mają być wyświetlane
Ikonę Typ ikony do pokazania w polu komunikatu
ShowMessageBox(wyjątek wyjątku)
void ShowMessageBox(Exception exception);

Ta metoda wyświetla pole komunikatu, które zgłasza informacje o wyjątku. To pole komunikatu zawiera jeden przycisk OK . Zobacz Tabela 76.

Tabela 76. Parametry metody ShowMessageBox(wyjątek wyjątku)

Parametr Opis
Wyjątek Wyjątek, który chcesz zgłosić (w oknie dialogowym jest używany wyjątek. Komunikat jako zawartość).
ShowDialogWindow
void ShowDialogWindow(Type viewType, DialogInteraction dialogPayload);

Ta metoda tworzy nowe okno dialogowe, którego zawartość jest tekstem dostarczanym w parametrze viewType . Projektant UDI tworzy nowe wystąpienie tego typu i zawija je w oknie dialogowym z przyciskami OK i Anuluj.

Dane są przekazywane do kontrolki przy użyciu parametru dialogPayload. Rozwiązanie SampleEditor w katalogu zestawu SDK zawiera przykład użycia tej funkcji.

ShowWizardWindow
void ShowWizardWindow(Type viewType, DialogInteraction dialogPayload);

Ta metoda umożliwia wyświetlenie edytora niestandardowego wewnątrz okna dialogowego zawierającego przyciski Dalej i Wstecz na potrzeby nawigacji. Firma Microsoft nie dostarczyła przykładu dotyczącego sposobu korzystania z tej metody.

Dokumentacja schematu pliku konfiguracji Kreatora UDI

Ten plik jest używany przez Kreatora UDI i konfigurowany przez Kreatora UDI Projektant. Ten plik służy do konfigurowania następujących elementów:

  • Strony kreatora wyświetlane w Kreatorze UDI

  • Sekwencja stron kreatora w Kreatorze UDI

  • Ustawienia pól na każdej stronie kreatora

  • Dostępne grupy etapów w Kreatorze UDI Projektant

  • Dostępne etapy w każdym kreatorze wdrażania w Kreatorze UDI Projektant

    77 zawiera listę elementów w pliku konfiguracji Kreatora UDI oraz ich opisy. Element Kreator jest węzłem głównym tego odwołania.

Tabela 77. Elementy w pliku konfiguracji Kreatora UDI i ich opisy

Nazwa elementu Opis
Data (Dane) Grupuje poszczególne elementy DataItem w elemencie Page i nosi nazwę atrybutu Name .
Dataitem Grupuje poszczególne elementy settera w elemencie Page . Dane hierarchiczne można tworzyć, dołączając co najmniej jeden element danych w elemencie DataItem . Każdy element DataItem reprezentuje pojedynczy element. Na przykład lista dostępnych dysków może mieć element DataItem dla nazwy wyświetlanej i inny element DataItem dla odpowiedniej litery dysku.
Domyślne Określa wartość domyślną pola określonego w elemencie pole nadrzędne lub RadioGroup . Wartość domyślna jest ustawiona na wartość ujętą w nawiasach kwadratowych tego elementu.
DLL Określa bibliotekę DLL, która ma być ładowana i odwoływana przez Kreatora UDI i Kreatora UDI Projektant.
Biblioteki dll Grupuje poszczególne elementy biblioteki DLL .
Błąd Określa możliwy kod błędu, który może zwrócić zadanie. Wartość kodu błędu jest zwracana przez hresult zadania i jest uwięziona przez ten element w celu podania bardziej szczegółowych informacji o błędzie.
Exitcode Określa możliwy kod zakończenia zadania. Kody zakończenia to kody powrotne oczekiwane przez zadanie. Utwórz element ExitCode dla każdego możliwego kodu zakończenia. W przeciwnym razie możesz określić gwiazdkę (*) w atrybucie Value , aby obsługiwać kody powrotne, które nie są wymienione w innych elementach ExitCode .
ExitCodes Grupuje zestaw elementów ExitCode i Error dla elementu Task lub Error .
Pole Określa wystąpienie kontrolki w elemencie Page , które jest używane do dostosowywania za pomocą kodu XML. Nie wszystkie kontrolki zezwalają na dostosowywanie przy użyciu kodu XML — tylko kontrolki korzystające z elementu Field .
Pola Grupuje poszczególne elementy pola w elemencie Page .
Plik Określa źródło i miejsce docelowe operacji kopiowania plików przy użyciu typu zadania Microsoft.Wizard.CopyFilesTask . Możesz dołączyć oddzielny element Plik , aby skopiować więcej niż jeden plik w jednym zadaniu.
Strona Określa wystąpienie strony i zawiera wszystkie ustawienia konfiguracji strony.
Pageref Określa odwołanie do wystąpienia strony w ramach etapu w grupie StageGroup.
Stron Grupuje poszczególne elementy strony .
RadioGroup Określa grupę przycisków radiowych w elemencie Field .
StageGroup Określa grupę co najmniej jednego etapu.
StageGroups Grupuje zestaw grup etapów w pliku konfiguracji Kreatora UDI.
Setter Określa ustawienie właściwości wartości właściwości o nazwie we właściwości Property .
Etapie Określa etap w grupie StageGroup i zawiera co najmniej jeden element PageRef .
Styl Grupuje poszczególne elementy settera , które konfigurują wygląd i działanie Kreatora UDI, w tym tytuł wyświetlany w górnej części kreatora i obraz banera wyświetlany w Kreatorze UDI.
Zadanie Określa zadanie, które ma zostać uruchomione na stronie określonej w elemencie strony nadrzędnej.
Zadania Grupuje zestaw zadań dla elementu Page .
Walidatora Określa moduł sprawdzania poprawności kontrolki pola określony w elemencie pola nadrzędnego.
Kreatora Określa katalog główny dla wszystkich innych elementów.

Danych

Ten element grupuje poszczególne elementy DataItem w elemenciePage i nosi nazwę atrybutu Name .

Informacje o elemencie

Tabela 78 zawiera informacje o elemencie Dane .

Tabela 78. Informacje o elemencie danych

Atrybut Wartość
Liczba wystąpień Zero lub więcej w każdym elemencie Strony (ten element jest opcjonalny).
Elementy nadrzędne Strona, DataItem
Spis treści DataItem, Setter
Atrybuty elementów

Tabela 79 zawiera listę atrybutów elementu Data i zawiera opis każdego z nich.

Tabela 79. Atrybuty i odpowiadające im wartości dla elementu danych

Atrybut Opis
Nazwa Określa nazwę elementu Data
Uwagi

Atrybut Name umożliwia kodowi pobranie określonego zestawu danych.

Przykład

Brak.

Dataitem

Ten element grupuje poszczególne elementy settera w elemencie Page . Dane hierarchiczne można tworzyć, dołączając co najmniej jeden element danych w elemencie DataItem . Każdy element DataItem reprezentuje pojedynczy element. Na przykład lista dostępnych dysków może mieć element DataItem dla nazwy wyświetlanej i inny element DataItem dla odpowiedniej litery dysku.

Informacje o elemencie

Tabela 80 zawiera informacje o elemencie DataItem .

Tabela 80. DataItem— informacje o elemencie

Atrybut Wartość
Liczba wystąpień Zero lub więcej w każdym elemencie Danych (ten element jest opcjonalny).
Elementy nadrzędne Data (Dane)
Spis treści Dane, Setter
Atrybuty elementów

Ten element nie ma atrybutów.

Uwagi

Brak.

Przykład

Brak.

Domyślne

Ten element określa wartość domyślną pola określonego w elemencie pole nadrzędne lub RadioGroup . Wartość domyślna jest ustawiona na wartość, którą ten element nawiasy.

Informacje o elemencie

Tabela 81 zawiera informacje o elemencie Default .

Tabela 81. Informacje o elemencie domyślnym

Atrybut Wartość
Liczba wystąpień Zero lub więcej w elemencie Field lub RadioGroup (ten element jest opcjonalny).
Elementy nadrzędne Pole, RadioGroup
Spis treści Może to być dowolna dobrze sformułowana zawartość XML, ale zazwyczaj jest to tekst standardowy
Atrybuty elementów

Ten element nie ma atrybutów.

Uwagi

Brak.

Przykład

W poniższym przykładzie wartość domyślna pola TimeZone ma wartość "Pacific Standard Time":

<Field Name="TimeZone" Enabled="true" VarName="OSDTimeZone" Summary="Time Zone:">
  <Default>Pacific Standard Time</Default>

DLL

Ten element określa bibliotekę DLL kreatora UDI i Kreatora UDI Projektant do załadowania i odwołania.

Informacje o elemencie

Tabela 82 zawiera informacje o elemencie DLL .

Tabela 82. Informacje o elemencie biblioteki DLL

Atrybut Wartość
Liczba wystąpień Co najmniej jeden element biblioteki DLL
Element nadrzędny Biblioteki dll
Spis treści Brak dozwolonej zawartości dla tego elementu
Atrybuty elementów

Tabela 83 zawiera listę atrybutów elementu DLL i zawiera opis każdego z nich.

Tabela 83. Atrybuty i odpowiadające im wartości dla elementu DLL

Atrybut Opis
Name (Nazwa) Określa nazwę biblioteki DLL kreatora UDI i Kreatora UDI Projektant odwołania
Uwagi

Brak.

Przykład
<DLLs>
  <DLL Name="OSDRefreshWizard.dll" />
  <DLL Name="SharedPages.dll" />
</DLLs>

Biblioteki dll

Ten element grupuje poszczególne elementy biblioteki DLL .

Informacje o elemencie

Tabela 84 zawiera informacje o elemencie bibliotek DLL .

Tabela 84. Informacje o elemencie bibliotek DLL

Atrybut Wartość
Liczba wystąpień Jeden
Elementy nadrzędne Kreatora
Spis treści DLL
Atrybuty elementów

Ten element nie ma atrybutów.

Uwagi

Brak.

Przykład
<DLLs>
   <DLL Name="OSDRefreshWizard.dll" />
   <DLL Name="SharedPages.dll" />
</DLLs>

Error

Ten element określa możliwy kod błędu, który może zwrócić zadanie. Wartość kodu błędu jest zwracana i uwięziona przez hresult zadania w celu podania bardziej szczegółowych informacji o błędzie.

Informacje o elemencie

Tabela 85 zawiera informacje o elemencie Error .

Tabela 85. Informacje o elemencie błędu

Atrybut Wartość
Liczba wystąpień Zero lub więcej w każdym elemencie ExitCode (ten element jest opcjonalny).
Elementy nadrzędne ExitCodes
Spis treści Dowolna dobrze sformułowana zawartość XML
Atrybuty elementów

Tabela 86 zawiera listę atrybutów elementu Error i zawiera opis każdego z nich.

Tabela 86. Informacje o elemencie błędu

Atrybut Opis
Stan Określa stan powrotu zadania, które napotkało błąd. Zazwyczaj wartość tego atrybutu jest ustawiona na Błąd. Ta wartość jest wyświetlana w kolumnie State (Stan ) na stronie kreatora w Kreatorze UDI.
Text (Tekst) Określa opisowy tekst dotyczący warunku błędu, który napotkał zadanie.
Type Określa, czy ten element reprezentuje błąd, ostrzeżenie czy powodzenie. Wartość określona wpolu Typ musi być unikatowa w elemencie ExitCodes . Poniżej przedstawiono prawidłowe wartości dla tego elementu:

- **0.**Element reprezentuje powodzenie.
- 1. Element reprezentuje ostrzeżenie.
- -1. Element reprezentuje błąd.
Wartość Określa wartość kodu zwróconego przez zadanie jako wartość liczbową. Określenie wartości gwiazdki (*) wskazuje element domyślny dla kodów powrotnych, które nie są wymienione w innych elementach błędu .
Uwagi

Brak.

Przykład

Brak.

Exitcode

Ten element określa możliwy kod zakończenia zadania. Kody zakończenia to kody powrotne oczekiwane przez zadanie. Utwórz element ExitCode dla każdego możliwego kodu zakończenia. W przeciwnym razie możesz określić gwiazdkę (*) w atrybucie Value , aby obsługiwać kody powrotne, które nie są wymienione w innych elementach ExitCode .

Informacje o elemencie

Tabela 87 zawiera informacje o elemencie ExitCode .

Tabela 87. Informacje o elemencie ExitCode

Atrybut Wartość
Liczba wystąpień Zero lub więcej w każdym elemencie ExitCodes (ten element jest opcjonalny).
Elementy nadrzędne ExitCodes
Spis treści Co najmniej jeden element ExitCode i zero lub więcej elementów błędu
Atrybuty elementów

Tabela 88 zawiera listę atrybutów elementu ExitCode i zawiera opis każdego z nich.

Tabela 88. Atrybuty i odpowiednie wartości dla elementu ExitCode

Atrybut Opis
Stan Określa stan zwracany zadania. Wartość tego atrybutu jest wyświetlana w kolumnie State (Stan ) na odpowiedniej stronie kreatora w Kreatorze UDI. Dla tego atrybutu można użyć dowolnych wartości, które mają znaczenie dla danego zadania. Poniżej przedstawiono typowe wartości używane dla tego atrybutu:

-Sukces
-Ostrzeżenie
-Błąd
Text (Tekst) Określa opisowy tekst o istnieniu kodu zadania.
Type Określa, czy ten element reprezentuje błąd, ostrzeżenie czy powodzenie. Wartość określona w typie musi być unikatowa w elemencie ExitCodes . Poniżej przedstawiono prawidłowe wartości dla tego elementu:

- 0. Element reprezentuje sukces.
- 1. Element reprezentuje ostrzeżenie.
- -1. Element reprezentuje błąd.
Wartość Określa wartość kodu zwróconego przez zadanie jako wartość liczbową. Określenie wartości gwiazdki (*) wskazuje element domyślny dla kodów powrotnych, które nie są wymienione w innych elementach ExitCode .
Uwagi

Brak.

Przykład

Brak.

ExitCodes

Ten element grupuje zestaw elementów ExitCode i Error dla elementu Zadanie lub Błąd .

Informacje o elemencie

Tabela 89 zawiera informacje o elemencie ExitCodes .

Tabela 89. Informacje o elemencie ExitCodes

Atrybut Wartość
Liczba wystąpień Po jednym w każdym elemencie zadania
Elementy nadrzędne Zadanie
Spis treści Błąd, ExitCode
Atrybuty elementów

Ten element nie ma atrybutów.

Uwagi

Brak.

Przykład

Brak.

Pole

Ten element określa wystąpienie kontrolki w elemencie Page używanym do dostosowywania przy użyciu kodu XML. Nie wszystkie kontrolki zezwalają na dostosowywanie przy użyciu kodu XML — tylko kontrolki korzystające z elementu Field .

Informacje o elemencie

Tabela 90 zawiera informacje o elemencie Field .

Tabela 90. Informacje o elemencie pola

Atrybut Wartość
Liczba wystąpień Zero lub więcej w każdym elemencie Field (ten element jest opcjonalny).
Elementy nadrzędne Pola
Spis treści Domyślne, walidator
Atrybuty elementów

Tabela 91 zawiera listę atrybutów elementu Field i zawiera opis każdego z nich.

Tabela 91. Atrybuty i odpowiadające im wartości dla elementu pola

Atrybut Opis
Włączone Określa, czy pole jest włączone dla danych wejściowych użytkownika (atrybut można ustawić na wartość Prawda czy Fałsz).
Nazwa Określa nazwę pola
Podsumowanie Określa tekst opisowy wyświetlany na stronie kreatora podsumowania dla wartości ustawionej przez to pole
Varname Określa nazwę zmiennej sekwencji zadań odczytaną lub skonfigurowaną przy użyciu pola w elemencie pola nadrzędnego
Uwagi

Ten element może zawierać zero lub więcej elementów domyślnych i zero lub więcej elementów modułu weryfikatora .

Przykład

Brak.

Pola

Ten element grupuje poszczególne elementy pola w elemencie Page .

Informacje o elemencie

Tabela 92 zawiera informacje o elemencie Pola .

Tabela 92. Pola — informacje o elemencie

Atrybut Wartość
Liczba wystąpień Zero lub więcej w każdym elemencie Strony (ten element jest opcjonalny).
Elementy nadrzędne Strona
Spis treści Pole, RadioGroup
Atrybuty elementów

Ten element nie ma atrybutów.

Uwagi

Brak.

Przykład

Brak.

Plik

Ten element określa źródło i miejsce docelowe operacji kopiowania plików przy użyciu typu zadania Microsoft.Wizard.CopyFilesTask . Możesz dołączyć oddzielny element Plik , aby skopiować więcej niż jeden plik w jednym zadaniu.

Informacje o elemencie

Tabela 93 zawiera informacje o elemencie Plik .

Tabela 93. Informacje o elemencie pliku

Atrybut Wartość
Liczba wystąpień Co najmniej jedno zadanie, które ma typ zadania Microsoft.Wizard.CopyFilesTask
Elementy nadrzędne Zadanie
Spis treści Brak
Atrybuty elementów

Tabela 94 zawiera listę atrybutów elementu File i zawiera opis każdego z nich.

Tabela 94. Atrybuty i odpowiednie wartości dla elementu pliku

Atrybut Opis
Dest Określa w pełni kwalifikowaną lub względną ścieżkę do folderu docelowego dla pliku określonego w atrybucie Source . Zmienne środowiskowe są dozwolone jako część ścieżki.
Źródło Określa w pełni kwalifikowaną lub względną ścieżkę do pliku źródłowego kopii typu zadania Microsoft.Wizard.CopyFilesTask . Ten atrybut obsługuje symbole wieloznaczne, dzięki czemu można skopiować wiele plików przy użyciu pojedynczego elementu Plik . Zmienne środowiskowe są dozwolone jako część ścieżki.
Uwagi

Brak.

Przykład

Brak.

Strona

Ten element określa wystąpienie strony i zawiera wszystkie ustawienia konfiguracji strony.

Informacje o elemencie

Tabela 95 zawiera informacje o elemencie Page .

Tabela 95. Informacje o elemencie strony

Atrybut Wartość
Liczba wystąpień Co najmniej jeden element strony
Elementy nadrzędne Stron
Spis treści Dane, pola, seter, zadania
Atrybuty elementów

Tabela 96 zawiera listę atrybutów elementu Page i zawiera opis każdego z nich.

Tabela 96. Atrybuty i odpowiadające im wartości elementu strony

Atrybut Opis
Displayname Określa przyjazną dla użytkownika nazwę strony kreatora wyświetlaną w Kreatorze UDI Projektant. Ta nazwa jest zwykle bardziej opisowa niż atrybut Name .
Nazwa Określa nazwę strony kreatora wyświetlanej w Kreatorze UDI Projektant.
Type Określa typ strony kreatora, który bezpośrednio odnosi się do określonej strony kreatora w ramach biblioteki DLL.
Uwagi

Brak.

Przykład

Brak.

Pageref

Ten element określa odwołanie do wystąpienia strony w ramach etapu w grupie Etap.

Informacje o elemencie

Tabela 97 zawiera informacje o elemencie PageRef .

Tabela 97. PageRef, informacje o elemencie

Atrybut Wartość
Liczba wystąpień Co najmniej jeden element w elemencie Stage
Elementy nadrzędne Etapie
Spis treści Brak
Atrybuty elementów

Tabela 98 zawiera atrybut elementu PageRef i zawiera jego opis.

Tabela 98. Atrybuty i odpowiadające im wartości elementu PageRef

Atrybut Opis
Strona Określa wystąpienie strony w ramach etapu w grupie StageGroup. Ustaw tę wartość na atrybut Nazwa elementu Page .
Uwagi

Brak.

Przykład

Brak.

Stron

Ten element grupuje poszczególne elementy strony .

Informacje o elemencie

Tabela 99 zawiera informacje o elemencie Pages .

Tabela 99. Informacje o elemencie pages

Atrybut Wartość
Liczba wystąpień Jeden
Elementy nadrzędne Kreatora
Spis treści Strona
Atrybuty elementów

Ten element nie ma atrybutów.

Uwagi

Brak.

Przykład
<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

Ten element określa grupę przycisków radiowych w elemencie Field .

Informacje o elemencie

Tabela 100 zawiera informacje o elemencie RadioGroup .

Tabela 100. Informacje o elemencie RadioGroup

Atrybut Wartość
Liczba wystąpień Zero lub więcej w elemencie Fields (ten element jest opcjonalny).
Elementy nadrzędne Pola
Spis treści Domyślne
Atrybuty elementów

Tabela 101 zawiera listę atrybutów elementu RadioGroup i zawiera opis każdego z nich.

Tabela 101. Atrybuty i odpowiadające im wartości dla elementu RadioGroup

Atrybut Opis
Zablokowane Określa, czy grupa przycisków radiowych jest włączona dla danych wejściowych użytkownika. Atrybut można ustawić na:

- Prawda. Określa, że przyciski radiowe są wyłączone, a użytkownicy nie mogą wybrać przycisku radiowego w grupie.
- Fałsz. Określa, że przyciski radiowe są włączone, a użytkownicy mogą wybrać przycisk radiowy w grupie.
Nazwa Określa nazwę grupy opcji radiowych.
Uwagi

Brak.

Przykład

Brak.

StageGroup

Ten element określa grupę etapów wdrażania.

Informacje o elemencie

Tabela 102 zawiera informacje o elemencie StageGroup .

Tabela 102. Informacje o elemencie StageGroup

Atrybut Wartość
Liczba wystąpień Co najmniej jeden element w elemencie StageGroups
Elementy nadrzędne StageGroups
Spis treści Etapie
Atrybuty elementów

Tabela 103 zawiera listę atrybutów elementu StageGroup i opis atrybutu.

Tabela 103. Atrybuty i odpowiadające im wartości dla elementu StageGroup

Atrybut Opis
Displayname Określa przyjazną dla użytkownika nazwę grupy etapów wyświetlaną w Kreatorze UDI Projektant. Ta nazwa jest zwykle bardziej opisowa niż atrybut Name .
Uwagi

Brak.

Przykład

Brak.

StageGroups

Ten element grupuje zestaw grup etapów w pliku konfiguracji Kreatora UDI.

Informacje o elemencie

Tabela 104 zawiera informacje o elemencie StageGroups .

Tabela 104. Informacje o elemencie StageGroups

Atrybut Wartość
Liczba wystąpień Zero lub jeden w elemencie Kreatora
Elementy nadrzędne Kreatora
Spis treści StageGroup
Atrybuty elementów

Ten element nie ma atrybutów.

Uwagi

Brak.

Przykład

Brak.

Setter

Ten element określa ustawienie właściwości dla wartości właściwości o nazwie we właściwości Property .

Informacje o elemencie

Tabela 105 zawiera informacje o elemencie Setter .

Tabela 105. Informacje o elemencie setter

Atrybut Wartość
Liczba wystąpień Zero lub więcej w każdym elemencie nadrzędnym (ten element jest opcjonalny).
Elementy nadrzędne Dane, DataItem, Page, Style, Task, Validator
Spis treści Zawiera wartość ciągu w atrybucie Właściwości
Atrybuty elementów

Tabela 106 zawiera atrybut elementu Setter i zawiera jego opis.

Tabela 106. Atrybuty i odpowiadające im wartości dla elementu Setter

Atrybut Opis
Właściwość Określa ustawioną nazwę właściwości. Nazwa właściwości jest ustawiona na wartość, która jest ustawiana w nawiasach kwadratowych tego atrybutu.
Uwagi

Brak.

Przykład

Brak.

Etapie

Ten element określa etap w grupie StageGroup i zawiera co najmniej jeden element PageRef .

Informacje o elemencie

Tabela 107 zawiera informacje o elemencie Stage .

Tabela 107. Informacje o elemencie stage

Atrybut Wartość
Liczba wystąpień Co najmniej jeden element w elemencie StageGroup
Elementy nadrzędne StageGroup
Spis treści Pageref
Atrybuty elementów

Tabela 108 zawiera listę atrybutów elementu Stage i zawiera opis każdego z nich.

Tabela 108. Atrybuty i odpowiadające im wartości dla elementu stage

Atrybut Opis
Displayname Określa przyjazną dla użytkownika nazwę strony kreatora wyświetlaną w Kreatorze UDI Projektant. Ta nazwa jest zwykle bardziej opisowa niż atrybut Name .
Nazwa Określa nazwę etapu. Wartość tego elementu jest używana podczas uruchamiania Kreatora UDI z /stage: nazwa parametru wiersza polecenia.
Uwagi

Brak.

Przykład

Brak.

Styl

Ten element grupuje poszczególne elementy settera , które konfigurują wygląd i działanie Kreatora UDI, w tym tytuł wyświetlany w górnej części kreatora oraz obraz baneru wyświetlany w Kreatorze UDI.

Informacje o elemencie

Tabela 109 zawiera informacje o elemencie Style.

Tabela 109. Informacje o elemencie stylu

Atrybut Wartość
Liczba wystąpień Jeden
Elementy nadrzędne Kreatora
Spis treści Setter
Atrybuty elementów

Ten element nie ma atrybutów.

Uwagi

Brak.

Przykład
<Style>
  <Setter Property="bannerFilename">UDI_Wizard_Banner.bmp</Setter>
  <Setter Property="title">Operating System Deployment (OSD) Refresh Wizard</Setter>
</Style>

Zadanie

Ten element określa zadanie, które ma zostać uruchomione na stronie określonej w elemencie strony nadrzędnej.

Informacje o elemencie

Tabela 110 zawiera informacje o elemencie Task .

Tabela 110. Informacje o elemencie zadania

Atrybut Wartość
Liczba wystąpień Co najmniej jeden element zadania
Elementy nadrzędne Zadania
Spis treści ExitCodes, File, Setter
Atrybuty elementów

Tabela 111 zawiera listę atrybutów elementu Task i zawiera opis każdego z nich.

Tabela 111. Atrybuty i odpowiadające im wartości dla elementu zadania

Atrybut Opis
Dependson Określa, czy zadanie jest zależne od innego zadania. Wartość tego atrybutu jest ustawiona na atrybut Nazwa innego elementu Zadania . Uwaga: Nie można skonfigurować tego atrybutu przy użyciu kreatora UDI Projektant. Można jednak ręcznie dodać ten atrybut do elementu Task , bezpośrednio modyfikując plik .xml.
Displayname Określa przyjazną dla użytkownika nazwę zadania wyświetlaną w Kreatorze UDI Projektant. Ta nazwa jest zwykle bardziej opisowa niż atrybut Name .
Nazwa Określa nazwę zadania. Ta nazwa musi być unikatowa.
Wpisać Określa typ zadania do uruchomienia, który jest zdefiniowany w bibliotekę DLL zawierającą zadanie.
Uwagi

Brak.

Przykład

Brak.

Zadania

Ten element grupuje zestaw zadań dla elementu Page .

Informacje o elemencie

Tabela 112 zawiera informacje o elemencie Zadania .

Tabela 112. Informacje o elemencie Zadania

Atrybut Wartość
Liczba wystąpień Zero lub jeden w każdym elemencie Page (ten element jest opcjonalny).
Elementy nadrzędne Strona
Spis treści Zadanie
Atrybuty elementów

Tabela 113 zawiera listę atrybutów elementu Zadania i zawiera opis każdego z nich.

Tabela 113. Atrybuty i odpowiadające im wartości dla elementu Tasks

Atrybut Opis
NameTitle Określa podpis, który jest wyświetlany w górnej części kolumny, który zawiera nazwę zadań na odpowiedniej stronie kreatora.
StatusTitle Określa podpis wyświetlany w górnej części kolumny, który zawiera stan zadań na odpowiedniej stronie kreatora.
Uwagi

Brak.

Przykład

Brak.

Walidatora

Ten element określa moduł sprawdzania poprawności kontrolki pola określony w elemencie pola nadrzędnego.

Informacje o elemencie

Tabela 114 zawiera informacje o elemencie Validator .

Tabela 114. Informacje o elemencie modułu sprawdzania poprawności

Atrybut Wartość
Liczba wystąpień Zero lub jeden w elemencie Field
Elementy nadrzędne Pole
Spis treści Setter
Atrybuty elementów

Tabela 115 zawiera atrybut elementu Validator i zawiera jego opis.

Tabela 115. Atrybuty i odpowiednie wartości dla elementu validator

Atrybut Opis
Wpisać Określa typ modułu sprawdzania poprawności, który jest zdefiniowany w bibliotekę DLL zawierającą moduł sprawdzania poprawności
Uwagi

Brak.

Przykład

Brak.

Kreatora

Ten element określa katalog główny dla wszystkich innych elementów.

Informacje o elemencie

Tabela 116 zawiera informacje o elemencie Kreator .

Tabela 116. Informacje o elemencie Kreatora

Atrybut Wartość
Liczba wystąpień Jeden
Elementy nadrzędne Brak
Spis treści Biblioteki DLL, Strony, StageGroups, Styl
Atrybuty elementów

Ten element nie ma atrybutów.

Uwagi

Brak.

Przykład
<Wizard>
   + <DLLs>
   + <Style>
   + <Pages>
   + <StageGroups>
</Wizard>