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

Instalacja sterowana przez użytkownika (UDI) pomaga uprościć wdrażanie klienckich systemów operacyjnych Windows®, takich jak Windows 8.1, na komputerach za pomocą funkcji wdrażania systemu operacyjnego (OSD) w programie Microsoft® System Center 2012 R2 Configuration Manager. UDI jest częścią zestawu narzędzi firmy Microsoft do wdrażania (MDT, Deployment Toolkit).

Wprowadzenie

Zazwyczaj podczas wdrażania systemów operacyjnych za pomocą 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 rozpoczęciem wdrażania należy podać wszystkie ustawienia konfiguracyjne.

UDI udostępnia interfejs oparty na kreatorze, który umożliwia podanie informacji o konfiguracji bezpośrednio przed wykonaniem wdrożenia. Takie zachowanie pozwala na tworzenie ogólnych sekwencji zadań OSD, a następnie dostarczanie informacji specyficznych dla komputera w czasie wdrażania, co zapewnia większą elastyczność w procesie wdrażania.

Grupa docelowa

Ten przewodnik jest przeznaczony dla deweloperów, którzy tworzą niestandardowe strony kreatora dla Kreatora UDI i niestandardowe edytory stron kreatorów dla Kreatora UDI Wizard Designer. W tym przewodniku założono, że znasz tworzenie aplikacji systemu Windows przy użyciu:

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

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

  • Platforma Windows Presentation Foundation (WPF), która 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

O tym przewodniku

Ten przewodnik zawiera niezbędne informacje referencyjne, które ułatwiają dostosowanie UTI do potrzeb Twojej organizacji. W tym przewodniku nie omówiono zagadnień administracyjnych ani operacyjnych, takich jak instalowanie zestawu MDT (obejmującego kod UDI), konfigurowanie kodu UDI do wdrażania systemów operacyjnych i aplikacji ani wykonywanie wdrożeń przy użyciu Kreatora kodów UDI. Aby uzyskać więcej informacji na ten temat, zobacz tematy dotyczące identyfikatorów UDI w temacie Korzystanie z zestawu narzędzi firmy Microsoft do wdrażania, który jest dołączony do zestawu MDT.

Przegląd rozwoju UDI

Rozwój UDI pozwala rozszerzyć funkcje, które zapewnia UDI. Zazwyczaj opracowywanie kodu UDI jest wymagane, jeśli chcesz zebrać dodatkowe informacje, które są używane przez proces wdrażania kodu UDI. Te dodatkowe informacje są zwykle zapisywane jako zmienne sekwencji zadań, które kroki sekwencji zadań w sekwencji zadań UDI odczytu w programie Configuration Manager.

Architektura UDI

Nadrzędnym celem opracowywania kodu UDI jest tworzenie niestandardowych stron kreatora, które mogą być wyświetlane w Kreatorze kodu UDI. Tworząc niestandardowe strony kreatora, można rozszerzyć istniejące funkcje UDI, aby spełnić wymagania biznesowe i techniczne Twojej organizacji. Na niestandardowej stronie kreatora są zbierane informacje dodatkowe lub zamiast stron kreatora udostępnianych przez interfejs UDI.

Rysunek 1 przedstawia relacje między narzędziami UDI Wizard Designer i UDI Wizard.

Rysunek 1. Relacja między Kreatorem UDI a Kreatorem UDI Designer Rysunek 1. Relacja między Kreatorem UDI a Kreatorem UDI Designer

Rysunek 1. Relacja między Kreatorem UDI a Kreatorem UDI Designer

Na poziomie koncepcyjnym rozwój UDI obejmuje tworzenie:

  • Niestandardowe strony kreatora. W Kreatorze UDI są wyświetlane strony kreatora, na których są zbierane informacje wymagane do ukończenia procesu wdrażania. Strony kreatora tworzy się przy użyciu języka C++ w programie Microsoft Visual Studio®. Niestandardowe strony kreatora są implementowane jako biblioteki DLL odczytywane przez Kreatora kodu UDI. Zestaw UDI Software Development Kit (SDK) zawiera przykład tworzenia niestandardowych stron kreatora.

  • Niestandardowe edytory stron kreatora. Zachowanie niestandardowej strony kreatora można skonfigurować za pomocą edytorów stron kreatora. Edytory stron kreatora niestandardowego są implementowane jako biblioteki DLL odczytywane przez narzędzie UDI Wizard Designer. Edytory stron kreatora tworzy się przy użyciu:

    • WPF w wersji 4.0

    • Microsoft Prism w wersji 4.0

    • Microsoft Unity Application Block (Unity) w wersji 2.1

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

    Ponadto UDI Wizard Designer korzysta z pomocniczych plików konfiguracyjnych edytora stron kreatora. Pliki konfiguracyjne edytora stron kreatora są tworzone w ramach procesu tworzenia niestandardowych stron i edytorów stron kreatora. Kreator UDI tworzy Designer niezbędne informacje XML w pliku konfiguracyjnym Kreatora UDI i odpowiednim pliku .app.

Przygotowywanie środowiska programistycznego UDI

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

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

  2. Skonfiguruj środowisko programistyczne UDI zgodnie z opisem w sekcji Konfigurowanie środowiska programistycznego UDI.

  3. Sprawdź, czy środowisko projektowe UDI jest poprawnie skonfigurowane zgodnie z opisem w temacie Sprawdzanie środowiska programistycznego UDI.

Przygotowywanie wymagań wstępnych środowiska programistycznego UDI

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

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

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

Przygotowywanie wymagań wstępnych dotyczących sprzętu środowiska programistycznego UDI

Wymagania sprzętowe środowiska deweloperskiego UDI to takie same wymagania sprzętowe dla 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 programistycznego UDI

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

  • Dowolny system operacyjny Windows obsługiwany przez program Visual Studio 2010 (zalecany jest Windows 7 lub Windows Server ® 2008 R2).

    Będziesz potrzebować systemu operacyjnego Windows obsługującego architekturę procesora, dla której chcesz tworzyć programy. Przy użyciu 64-bitowego systemu operacyjnego można opracowywać 32-bitowe i 64-bitowe formaty UDI. Programowanie 32-bitowych plików UDI odbywa się tylko w 32-bitowych systemach operacyjnych. Z tego powodu należy używać 64-bitowego systemu operacyjnego.

    Uwaga

    Wersje IntelItanium (IA-64) systemu operacyjnego Windows nie są obsługiwane w środowiskach programistycznych 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 w wersji 4.0 (wymagany przez 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 edytorów stron UDI Wizard Designer

    Uwaga

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

Konfigurowanie środowiska programistycznego UDI

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

  1. Zainstaluj program Visual Studio 2010.

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

    Uwaga

    Przykładowy kod źródłowy stron edytora UDI Wizard Designer 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 o instalowaniu programu Visual Studio 2010, zobacz Instalowanie programu Visual Studio.

  2. Zainstaluj zestaw MDT.

    Aby uzyskać więcej informacji na temat instalowania zestawu MDT, zobacz sekcję "Instalowanie lub uaktualnianie do zestawu MDT" w dokumentacji zestawu MDT Korzystanie z zestawu narzędzi firmy Microsoft do wdrażania.

  3. W Eksploratorze Windows utwórz local_folder (gdzie local_folder dowolny folder znajdujący się na dysku lokalnym na komputerze dewelopera).

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

    Należy skopiować folder SDK do innej lokalizacji, ponieważ zestaw MDT jest zainstalowany w folderze Program Files, w którym nie można dokonać zapisu bez podwyższonych uprawnień. Skopiowanie folderu zestawu SDK do innej lokalizacji umożliwia modyfikowanie plików w folderze zestawu SDK bez wymagania podwyższonego poziomu uprawnień.

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

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

    Po zakończeniu struktura folderów pod local_folder powinna wyglądać podobnie do struktury folderów pokazanej na rysunku 2 (gdzie local_folder jest folderem utworzonym wcześniej w tym procesie , a na rysunku jest pokazany jako UDIDevelopment ).

    Rysunek 2. Struktura folderów dla rozwoju UDI Rysunek 2. Struktura folderów dla rozwoju UDI

    Rysunek 2. Struktura folderów dla rozwoju UDI

Weryfikowanie środowiska programistycznego UDI

Po skonfigurowaniu środowiska deweloperskiego UDI sprawdź, czy środowisko deweloperskie UDI jest poprawnie skonfigurowane, upewniając się, że przykładowe projekty są poprawnie kompilowane w programie Visual Studio 2010.

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

Sprawdzanie, czy projekt SamplePage został poprawnie skompilowany

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

Aby sprawdzić, czy projekt SamplePage został 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 Właściwości.

    Zostanie wyświetlone okno dialogowe Strony właściwości strony przykładu .

  4. W oknie dialogowym Strony właściwości przykładowej strony 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 Właściwości konfiguracji/Zdarzenia kompilacji/Zdarzenie po kompilacji.

  9. We właściwościach zdarzenia po skompilowaniu w obszarze wiersza 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 Strony właściwości strony przykładowej wybierz przycisk OK.

  11. Zapisz projekt.

  12. Z menu Debugowanie wybierz pozycję Rozpocznij debugowanie.

    Zostanie wyświetlone okno dialogowe Microsoft Visual Studioz informacją, że źródło jest nieaktualne, i z pytaniem, czy chcesz skompilować projekt.

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

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

  14. W oknie dialogowym Bez informacji o debugowaniu wybierz pozycję Tak.

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

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

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

    Zostanie wyświetlone okno dialogowe Kreatora anulowania .

  17. W oknie dialogowym Kreator anulowania wybierz przycisk Tak.

  18. Zamknij program Visual Studio 2010.

Sprawdzanie, czy projekt SampleEditor jest poprawnie kompilowany

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

Aby sprawdzić, czy projekt SampleEditor jest kompilowany poprawnie

  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 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 lokalizacji 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 zaznaczyć wiele plików na karcie Przeglądanie , przytrzymując naciśnięty klawisz CTRL podczas zaznaczania plików.

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

  8. Sprawdź, czy żadne z odwołań nie zawiera ostrzeżeń ani błędów.

  9. In Eksplorator rozwiązań, right-click the SampleEditor project, and then select Properties.

    Zostanie wyświetlone okno dialogowe Przykładowe strony właściwości .

  10. W oknie dialogowym Przykładowe strony właściwości wybierz kartę Debugowanie .

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

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

    Porada

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

  13. Z menu Plik wybierz polecenie 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, a installation_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 Wizard Designer.

  16. W UDI Wizard Designer, na Wstążce wybierz pozycję Otwórz.

    Zostanie wyświetlone okno dialogowe Otwieranie .

  17. W oknie dialogowym Otwieranie otwórz plik local_folder\SDK\SamplePage\SamplePage\Config.xml (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 w polu Lokalizacja , w tym następujące:

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

    • Pole Wartość domyślna, w którym wprowadza się wartość domyślną, która ma być wyświetlana w polu Lokalizacja

    • Przyjazna nazwa wyświetlana widoczna na stronie podsumowania, w której należy wprowadzić podpis dla informacji wyświetlanych na stronie podsumowania

    • Pole listy Lokalizacja zawierające listę możliwych lokalizacji

  20. Zamknij narzędzie UDI Wizard Designer.

  21. Zamknij program Visual Studio 2010.

Przegląd przykładów zestawu UDI SDK

Przed rozpoczęciem programowania zapoznaj się z przykładami podanymi w zestawie SDK UDI. Skorzystaj z informacji w tym przewodniku i kodu źródłowego w przykładach, aby łatwiej utworzyć własne niestandardowe strony kreatora UDI i edytory stron kreatora.

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

Przejrzyj zawartość folderu SDK

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

Tabela 1. Foldery w zestawie SDK UDI

Folder Ten folder zawiera
Wliczone w cenę Pliki nagłówkowe języka C++ niezbędne do tworzenia niestandardowych stron kreatora dla Kreatora UDI
Biblioteki Libs Pliki biblioteki języka C++, które zostaną połączone ze stroną niestandardową; Istnieją 32-bitowe i 64-bitowe wersje bibliotek dołączanych statycznie. Uwaga: Wersje włoskie bibliotek (IA-64) nie są dostępne.
Przykładowy edytor Projekt programu Visual Studio służący do tworzenia edytora niestandardowego używanego do edycji strony SamplePage w UDI Wizard Designer, który jest napisany w języku C#
Przykładowa strona Projekt programu Visual Studio do tworzenia niestandardowej strony kreatora UDI, która jest napisana w Visual C++

Zapoznaj się z rozwiązaniem SamplePage dla programu Visual Studio

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

Przeglądanie cyklu życia strony kreatora

Strona kreatora UDI zawiera metody odpowiadające poszczególnym etapom (fazom) cyklu życia strony. W ramach tworzenia niestandardowej strony kreatora musisz zastąpić te metody kodem. Tabela 2 zawiera listę metod, które trzeba zastąpić, i krótki opis każdej metody, w tym informacje o tym, kiedy należy jej używać 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 który należy wykonać tylko raz. Tej metody należy na przykład użyć do inicjalizacji pól lub odczytania informacji o konfiguracji z elementów Setter w pliku konfiguracyjnym Kreatora UDI.
OnWindowShown Ta metoda jest wywoływana za każdym razem, gdy strona jest wyświetlana (pokazywana) w Kreatorze UDI. Jest ona nazywana pierwszym wyświetleniem strony i za każdym razem, gdy przejdziesz do tej 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 aktualizowanie strony na podstawie wszelkich zmian tych zmiennych.
OnCommonControlEvent Metodę tę można wywołać zawsze, gdy strona kreatora jest wyświetlana i odbiera komunikat WM_NOTIFY od elementu podrzędnego (zazwyczaj typowe kontrolki).

W przypadku tej metody napisz kod, który obsługuje WM_NOTIFY na podstawie wiadomości z powiadomieniem. Może na przykład być wymagane reagowanie na zdarzenia z poziomu kontrolki ogólnej, na przykład odpowiadanie na zdarzenia wyboru lub dwukrotnego kliknięcia kontrolki TreeView .
OnUnhandledEvent Ta metoda jest wywoływana za każdym razem, gdy na stronie kreatora pojawia się komunikat o nieobsłużonym oknie. Ta metoda umożliwia przechwycenie i obsługę tych nieobsługiwanych komunikatów okna.

W przypadku tej metody napisz kod obsługujący komunikaty okien związane ze stroną kreatora. Zazwyczaj nie trzeba zastępować tej metody.
OnNextSelected Ta metoda jest wywoływana po wybraniu pozycji Dalej w kreatorze.

W przypadku tej metody napisz kod, który wykona wszystkie niezbędne akcje przed przejściem do następnej strony kreatora — na przykład sprawdzenie poprawności, która może zająć dużo czasu. Jeśli sprawdzanie poprawności zakończy się niepowodzeniem, możesz anulować następne żądanie i wyświetlić komunikat.
OnWindowHidden Ta metoda jest wywoływana za każdym razem, gdy strona jest ukryta, gdy jest pokazana poprzednia lub następna strona kreatora.

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

Zapoznaj się z przykładowym SamplePage

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

  1. Kreator UDI OSDSetupWizard.exe odczytuje informacje o konfiguracji z pliku konfiguracyjnego 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 konfiguracyjnym Kreatora UDI, zgodnie z opisem w kroku 2: Kreator UDI ładuje bibliotekę DLL dla niestandardowej strony kreatora.

  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, wykonaj wszelkie niezbędne zadania przed wybraniem przycisku Dalej , aby przejść do następnego kreatora zgodnie z opisem w kroku 4: Przycisk Dalej jest zaznaczony na stronie Kreator niestandardowy.

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

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

Uwaga

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

Możesz zastąpić domyślny plik konfiguracji używany przez Kreatora UDI, 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 to:

  • Element bibliotek DLL

  • Element stylu

  • Element Strony

  • Element StageGroups

    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 bibliotek DLL w poszukiwaniu plików .dll do załadowania. W tym przykładzie są wymienione dwa pliki .dll: SamplePage.dll i SharedPages.dll. Te pliki .dll muszą znajdować się w tym samym folderze co OSDSetupWizard.exe — w folderze Narzędzia\platforma (gdzie platforma to x86 dla wersji 32-bitowej lub x64 dla wersji 64-bitowej).

    Kreator UDI skanuje element Strony w poszukiwaniu zdefiniowanych stron. W tym przykładzie zdefiniowano dwie strony: Niestandardowa i Strona podsumowania. Atrybut Type 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 mogą zostać utworzone w przyszłości:

  • Nazwa organizacji zamiast nazwy Microsoft.

  • Nazwa projektu w miejsce SamplePage.

  • Nazwa niestandardowej strony kreatora zamiast nazwy LocationPage.

Krok 2. Kreator UDI ładuje bibliotekę DLL dla niestandardowej strony kreatora

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

Funkcja RegisterFactories służy do rejestrowania klasy fabryki na stronie kreatora w rejestrze fabryki klas dla Kreatora UDI. Fabryki klas to klasy, które mogą tworzyć instancje innych klas. Funkcja RegisterFactories tworzy nowe wystąpienie klasy fabryki i przekazuje tę klasę do rejestru fabryki klas dla Kreatora UDI, który udostępnia tę klasę fabryki kreatorowi. Kreator UDI wyszukuje klasę fabryki zarejestrowaną z identyfikatorem zgodnym z atrybutem Type elementu Page dla niestandardowej strony kreatora.

W tym przykładzie identyfikator jest zdefiniowany jako ID_Location w pliku PageClassIds.h jako Microsoft.SamplePage.LocationPage, co jest zgodne z atrybutem Type elementu Page w pliku Config.xml. ID_Location jest przekazywany jako parametr w funkcji RegisterFactories zaimplementowanej w pliku dllmain.ccp.

Możesz utworzyć funkcję przy użyciu szablonu funkcji Register_name , aby uprościć tworzenie nowej instancji fabrycznej i zarejestrować nowo utworzoną instancję. Wartość nazwy dostarczana za pomocą szablonu funkcji Register musi implementować interfejs iClassFactory . Klasa ClassFactoryImpl obsługuje większość szczegółów dotyczących implementowania fabryki klas.

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

Uwaga

Przykład zawiera i rejestruje tylko jedną stronę kreatora niestandardowego. Przykład nie zawiera niestandardowych zadań ani walidatorów, a więc nie rejestruje żadnych niestandardowych zadań ani walidatorów.

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

Niestandardowa strona kreatora w przykładzie jest zdefiniowana w pliku LocationPage.cpp. Strony kreatora są pochodnymi klas szablonów, które udostępniają wiele funkcji stron. Wszystkie strony kreatora powinny pochodzić z klasy szablonu WizardPageImpl, która implementuje interfejs IWizardPage. Na każdej stronie kreatora można 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ą pomóc w pisaniu niestandardowych stron kreatora. Zaimplementuj klasę szablonu WizardPageImpl jako klasę bazową dla niestandardowej strony kreatora.

Aby uzyskać listę dostępnych:

  • Klasy szablonów dla stron kreatora, zobacz Klasy pomocnika strony kreatora

  • Interfejsy klas szablonów stron kreatora, zobacz Interfejsy stron kreatora

    Niestandardowa strona kreatora w przykładzie pochodzi z klasy szablonu WizardPageImpl i implementuje interfejs IWizardPage. Ponadto na niestandardowej stronie kreatora implementuje się interfejs wywołania zwrotnego pola JE. 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:

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

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

      Uwaga

      Przed wywołaniem metody InitFields należy wywołać metodę AddField, AddRadioGroup lub AddToGroup.

    • Pola początkowe. Ta metoda służy do inicjowania pól (kontrolek) dodanych do formularza. Wskaźnik strony jest parametrem. W tym przykładzie przekazywany jest ten wskaźnik, który odwołuje się do bieżącej strony.

      Uwaga

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

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

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

  • Lokalizacje początkowe. Ta metoda wypełnia pole kombi na podstawie listy lokalizacji w pliku Config.xml. Element Data i podrzędne elementy elementu DataItem z pliku Confg.xml zawierają listę możliwych wartości.

  • NaNastępnyWybrane. Ta metoda służy do wykonywania następujących zadań:

    • 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. Przycisk Dalej jest zaznaczony na stronie kreatora niestandardowego

Gdy użytkownik uzupełni pola na stronie kreatora niestandardowego, wybierze przycisk Dalej, co spowoduje wywołanie metody OnNextSelected . Metoda OnNextSelected wykonuje wszystkie niezbędne zadania przed przejściem do następnej strony kreatora, takie jak rejestrowanie wszelkich zmian konfiguracji wprowadzonych na niestandardowej stronie kreatora.

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

  1. Sekcja inicjowania. Ta metoda inicjuje nagłówek (podpis etykiety) danych podsumowania wyświetlanych na stronie Podsumowanie. Zazwyczaj tę wartość można ustawić za pomocą funkcji DisplayName(). Dane skojarzone z tym podpisem 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 dla programu Visual Studio

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

Przejrzyj architekturę UDI Wizard Designer

UDI Wizard Designer został opracowany przy użyciu WPF, Prism i Unity. Designer UDI służy do edycji pliku konfiguracyjnego Kreatora UDI (UDIWizard_Config.xml), który Kreator UDI (OSDSetupWizard.exe) odczytuje w czasie wykonywania. Element Pages w pliku konfiguracyjnym Kreatora UDI zawiera listę stron, która zawiera oddzielny element Page dla każdej strony kreatora.

Podczas edytowania ustawień konfiguracji strony kreatora narzędzie UDI Wizard Designer ładuje niestandardowy edytor stron odpowiadający typowi strony kreatora. Edytory stron kreatora niestandardowego są opracowywane jako kontrolki użytkownika WPF. Strony edytora stron kreatora niestandardowego używają wzorca projektowego Model-View-ViewModel (MVVM) dla WPF.

Wzorzec projektowy MVVM pomaga oddzielić interfejs użytkownika (UI; prezentacja) od prezentowanych danych. Dane są fasadą nad elementem Page w pliku konfiguracyjnym Kreatora UDI (pliku Config.xml w przykładzie), do którego dostęp uzyskuje się za pomocą właściwości CurrentPage interfejsu IDataService .

Kreator UDI Designer używa 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 interjectionu zależności w środowisku Unity, zobacz Inject some life into your Applications — Getting to About the Unity Application Block (Wstrzyknięcie życia do aplikacji — poznaj blok aplikacji aparatu Unity).

Przegląd konfigurowalnych składników strony kreatora UDI

Podczas tworzenia niestandardowej strony kreatora niektóre ustawienia konfiguracyjne mogą zostać skonfigurowane w kodzie i nie będzie można ich zmienić po skompilowaniu strony. Jednak w przypadku innych ustawień konfiguracji należy zezwolić na zmianę tych ustawień za pomocą narzędzia UDI Wizard Designer.

Zazwyczaj ustawienia konfiguracyjne, które mają zostać skonfigurowane za pomocą Designer Kreatora UDI, są zapisywane w pliku konfiguracyjnym Kreatora UDI (pliku Config.xml w przykładzie). W razie potrzeby możesz jednak również utworzyć własny oddzielny plik konfiguracyjny. Jednym z przykładów użycia oddzielnego pliku konfiguracji jest plik UDIWizard_Config.xml.app, z którego korzysta zadanie odnajdywania aplikacji i typ strony kreatora ApplicationPage .

Poniżej przedstawiono listę typowych ustawień konfiguracji, którymi można zarządzać przy użyciu narzędzia UDI Wizard Designer:

  • Pole. Pola umożliwiają użytkownikom wprowadzanie danych wejściowych. Pola są wyświetlane jako elementy pól w pliku konfiguracyjnym Kreatora UDI (UDIWizard_Config.xml), który zawiera ustawienia konfiguracyjne dla każdego pola. Odpowiedni edytor strony kreatora musi zapewnić metodę edycji ustawień konfiguracji pola dla pola za pomocą kontrolki FieldElementControl.

  • Właściwości. Ustawianie pomaga tworzyć właściwości elementów na stronie, takich jak strony w elemencie Page , pola w elemencie Field lub dane w elementach Data lub DataItem . Właściwości konfiguruje się w elementach Setter . Dodaj osobny element Setter dla każdej właściwości, którą chcesz zdefiniować. Właściwości można edytować za pomocą kontrolki ustawiającej i konfigurować inne elementy ustawiające za pomocą innych kontrolek.

  • Dane. Dane służą do przechowywania informacji, które mogą być używane przez stronę kreatora i inne składniki. Dane dla stron lub pól można definiować przy użyciu elementów Data lub DataItem . Dane mogą być zdefiniowane w strukturze płaskiej lub hierarchicznej poprzez odpowiednie użycie elementów Data lub DataItem . W Config.xml w przykładzie w zestawie SDK pokazano, jak zbudować płaskie struktury danych.

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

Zapoznaj się z przykładem EditorPage

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

  • Interfejs użytkownika umożliwiający skonfigurowanie ustawień pola kombi Lokalizacja

  • interfejsu użytkownika umożliwiającego dodanie lub edytowanie lokalizacji na liście możliwych lokalizacji, które są wyświetlane w polu kombi Lokalizacja

  • Ustawienia konfiguracji wczytane z pliku konfiguracyjnego Kreatora UDI i zapisane w nim

  • Kod pomocniczy dla innych składników

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

  1. Sprawdź, jak edytor stron kreatora SampleEditor jest ładowany i inicjowany w UDI Wizard Designer, zgodnie z opisem w sekcji Ładowanie i inicjowanie edytora stron Kreatora recenzji.

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

  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 sekcji 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 sekcji Przeglądanie kodu używanego do zarządzania informacjami o konfiguracji.

Ładowanie i inicjowanie edytora stron w Kreatorze recenzji

Edytory stron kreatora niestandardowego są ładowane zgodnie z wymaganiami narzędzia UDI Wizard Designer. Pliki konfiguracyjne UDI Wizard Designer są ładowane po uruchomieniu UDI Wizard Designer. Kreator UDI Designer skanuje folder install_folder\Bin\Config (gdzie install_folder jest nazwą folderu, w którym zainstalowano zestaw MDT) w poszukiwaniu plików mających .config rozszerzenie pliku.

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

Kreator UDI Designer 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. Ten plik DLL należy umieścić w tym samym folderze co plik UDIDesigner.exe, czyli w folderze install_folder\Bin (gdzie install_folder jest nazwą folderu , w którym zainstalowano zestaw MDT).

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

  • Wpisz. Ten atrybut służy do konfigurowania typu strony kreatora niestandardowego, która jest ładowana przez Kreatora UDI. Kreator UDI Wizard Designer używa tego atrybutu do lokalizowania odpowiedniego elementu Page w pliku konfiguracyjnym UDI Wizard.

  • Biblioteka DLL. Ten atrybut służy do konfigurowania elementu DLL w pliku konfiguracyjnym UDI Wizard, który tworzy UDI Wizard Designer.

  • opis. Ten atrybut służy do dostarczania informacji o edytorze stron kreatora. Wartość tego atrybutu jest wyświetlana w oknie dialogowym Dodawanie nowej strony w narzędziu UDI Wizard Designer, które służy do dodawania strony kreatora do folderu "Biblioteka stron".

  • DisplayName (Nazwa wyświetlana). Ten atrybut powinien zawierać nazwę strony kreatora niestandardowego wyświetlanej w narzędziu UDI Wizard Designer. Wartość tego atrybutu jest wyświetlana w oknie dialogowym Dodawanie nowej strony w narzędziu UDI Wizard Designer, które służy do dodawania strony kreatora do folderu "Biblioteka stron".

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

Przejrzyj interfejs użytkownika używany do konfigurowania pola kombi Lokalizacja

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

Przeglądając interfejs użytkownika na karcie Projektowanie i kod na karcie XAML , można zobaczyć relacje 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ę on 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 przykładowym edytorze stron z informacjami zawartymi w pliku konfiguracyjnym kreatora UDI. Na przykład poniższy kod wiąże pole tekstowe Wartość domyślna z elementem Default w pliku konfiguracyjnym kreatora UDI (Config.xml w przykładzie):

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

Aby uzyskać więcej informacji, zobacz Porady: 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 danych o nazwie Location w pliku konfiguracyjnym UDI.

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

Interfejs użytkownika umożliwiający modyfikowanie listy możliwych lokalizacji składa się z następujących elementów:

Przegląd menu kontekstowego i przycisków wstążki służących do modyfikowania listy lokalizacji

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

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

  • Akcja dodania elementu. Ta akcja jest wykonywana, gdy użytkownik wybierze opcję Dodaj element z menu kontekstowego lub odpowiadających jej przycisków na Wstążce. Istnieje powiązanie danych z właściwością w modelu widoku, która zwraca obiekt AddLocationAction . Ten obiekt to metoda AddLocationCallback , znajdująca się w pliku LocationPageEditorViewModel.cs i wyświetlająca 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óra zwraca obiekt EditLocationAction . Ten obiekt to metoda EditLocationCallback , znajdująca się w pliku LocationPageEditorViewModel.cs i wyświetlająca okno dialogowe w pliku AddEditLocationView.xaml.

  • UsuńAkcję. 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óra zwraca obiekt RemoveAction . Ten obiekt to metoda EditLocationCallback znajdująca się w pliku LocationPageEditorViewModel.cs i wyświetlająca komunikat potwierdzający usunięcie lokalizacji.

Przejrzyj okno dialogowe umożliwiające dodanie lub edytowanie lokalizacji

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

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

  • Ramkę okna dialogowego o nazwie Ramka dialogowa, która zawiera następujące elementy:

    • Tytuł, który konfiguruje się za pomocą atrybutu DialogTitle ramki okna dialogowego

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

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

  • Element WPF zawierający następujące elementy:

    • Etykieta, którą konfiguruje się za pomocą atrybutu Content

    • Pole tekstowe, które jest powiązane z elementem Dane o nazwie Lokalizacja w pliku konfiguracyjnym UDI (pliku Config.xml w przykładzie)

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

Informacje o konfiguracji dla niestandardowej strony kreatora są przechowywane w pliku konfiguracyjnym Kreatora UDI, który jest:

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

  • UDIWizard_Config.xml plik dostarczony z zestawem MDT, przechowywany w folderze installation_folder\Templates\Distribution\Scripts (gdzie installation_folder jest folderem , w którym zainstalowano MDT); Ten plik zawiera ustawienia konfiguracyjne dla wszystkich wbudowanych stron i etapów kreatora

    W przykładzie SampleEditor procedura Locations pomaga zarządzać informacjami o konfiguracji i znajduje się w pliku LocationPageEditorViewModel.cs. Procedura Lokalizacje zwraca listę lokalizacji z pliku konfiguracyjnego Kreatora UDI. W szczególności zwrócona lista zawiera element dla każdego elementu DataItem w pliku konfiguracji Kreatora UDI.

Tworzenie niestandardowych stron kreatora UDI

Ogólny proces tworzenia niestandardowych stron kreatora UDI jest następujący:

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

  2. Umieść odpowiednie 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. Zainicjuj formularz.

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

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

    1. Włącz lub wyłącz kontrolki na podstawie informacji odczytanych podczas ładowania strony w kroku 3.

    2. Aktualizowanie kontrolek na podstawie informacji przeczytanych po załadowaniu strony w kroku 3, na przykład populacji 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ę Next w Kreatorze UDI (zastępuje OnNextSelected metodę), w tym następujące kroki:

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

    2. Aktualizowanie informacji na stronie podsumowania (jeśli nie są wykonywane przez pola na stronie).

  7. Skompiluj rozwiązanie.

    Upewnij się, że wersja tworzonej biblioteki DLL jest tej samej platformy procesora, co instalacja zestawu MDT, a konkretnie platformy procesora dla środowiska preinstalacyjnego 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 uruchomić w 32-bitowych lub 64-bitowych systemach operacyjnych Windows. Jednak w 64-bitowych systemach operacyjnych Windows można uruchomić tylko 64-bitowe wersje strony kreatora.

    • Środowisko Windows PE na komputerze docelowym. Środowisko Windows PE nie obsługuje uruchamiania aplikacji 32-bitowych w 64-bitowej wersji środowiska Windows PE. Dlatego musisz mieć wersję strony kreatora dla każdej architektury procesora w środowisku Windows PE, której zamierzasz używać.

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

  9. Wykonaj kroki tworzenia niestandardowego edytora stron.

Tworzenie niestandardowych edytorów stron kreatora

Wysokopoziomowy proces 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 strony głównej w pliku .xaml.

  3. Dodaj wystąpienia kontrolki FieldElementControl zgodnie z wymaganiami strony kreatora, która ma zostać skonfigurowana (jeśli jest to wymagane).

  4. Dodaj wystąpienia kontrolki SetterControl zgodnie z wymaganiami strony kreatora, która ma zostać skonfigurowana (jeśli jest to wymagane).

  5. Dodaj wystąpienia kontrolki CollectionTControl zgodnie z wymaganiami na stronie kreatora, która ma zostać skonfigurowana (jeśli jest to wymagane).

  6. Dodaj interfejs usługi IDataService .

  7. Napisz odpowiedni kod, aby zaktualizować plik konfiguracyjny Kreatora UDI na podstawie ustawień konfiguracyjnych, które mają zostać skonfigurowane za pomocą niestandardowego edytora stron kreatora.

  8. Utwórz podrzędne okna dialogowe w pliku .xaml i wywołaj je z edytora strony podstawowej przy użyciu interfejsu IMessageBoxService zgodnie z wymaganiami strony kreatora, która ma zostać skonfigurowana.

  9. Dodaj odpowiednie interfejsy do wstążki UDI Wizard Designer zgodnie z wymaganiami strony kreatora, która ma zostać skonfigurowana.

  10. Skompiluj rozwiązanie.

    Uwaga

    Upewnij się, że wersja tworzonej biblioteki DLL jest tej samej platformy procesora, co instalacja zestawu MDT. Jeśli na przykład zainstalujesz 64-bitową wersję zestawu MDT, skompiluj 64-bitową wersję niestandardowego edytora stron.

  11. Utwórz plik konfiguracyjny Kreatora UDI Designer, aby załadować niezbędne biblioteki DLL i zamapować edytor stron kreatora z odpowiednią stroną kreatora (plikiem SamplePage.dll.config w przykładzie).

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

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

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

Tworzenie niestandardowych zadań UDI

Zadania UDI to biblioteki DLL napisane w języku C++, które implementują interfejs ITask. Aby zarejestrować bibliotekę DLL w Kreatorze UDI Designer bibliotece zadań, należy utworzyć plik konfiguracyjny Kreatora UDI Designer (plik .config) i umieścić go w folderze installation_folder\Bin\Config (gdzie installation_folder jest folderem, w którym zainstalowano zestaw MDT).

Uwaga

Możesz utworzyć bibliotekę DLL zawierającą strony kreatora, zadania i walidatory w tym samym pliku .dll. Możesz również utworzyć pojedynczy plik konfiguracyjny Kreatora UDI Designer (.config), który zawiera ustawienia konfiguracyjne dla stron kreatora, zadań i walidatorów w bibliotece DLL.

Aby utworzyć niestandardowe zadania UDI

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

    • Inicjowanie. Ta metoda służy do inicjowania zadania.

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

  2. Napisz kod, który rejestruje fabrykę niestandardowych klas zadań w rejestrze fabrycznym.

  3. Utwórz rozwiązanie dla zadania niestandardowego.

    Uwaga

    Upewnij się, że wersja tworzonej biblioteki DLL jest tej samej platformy procesora, co instalacja zestawu MDT. Jeśli na przykład zainstalujesz 64-bitową wersję zestawu MDT, skompiluj 64-bitową wersję niestandardowego zadania UDI.

  4. Utwórz element Task w elemencie TaskLibrary w pliku konfiguracyjnym UDI Wizard Designer podobny 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 Task powinny zawierać parametr BitmapFilename . Określ wszystkie pozostałe parametry zgodnie z wymaganiami zadania. Na przykład w poprzednim fragmencie parametr log służy do określenia parametru lokalizacji pliku dziennika.

  5. Skopiuj plik konfiguracji Kreatora UDI Designer utworzony w poprzednim kroku do folderu installation_folder\Bin\Config (gdzie installation_folder jest folderem, w którym zainstalowano zestaw MDT).

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

Tworzenie niestandardowych walidatorów UDI

Walidatory UDI to biblioteki DLL napisane w języku C++, które implementują interfejs IValidatora . Bibliotekę DLL rejestruje się w bibliotece Kreatora UDI Designer weryfikatora, tworząc plik konfiguracyjny Kreatora UDI Designer (plik .config) i umieszczając go w folderze installation_folder\Bin\Config (gdzie installation_folder jest folderem, w którym zainstalowano zestaw MDT).

Tworzenie niestandardowych walidatorów kodów UDI

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

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

    • IsValid (Jestprawidłowy). Kontroler formularza wywołuje tę metodę, aby sprawdzić, czy kontrolka zawiera prawidłowy tekst. Poniżej przedstawiono przykład metody IsValid dla walidatora, 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, LPCTSTR message). Kontroler formularza wywołuje ten element dla każdego naciśnięcia klawisza i innych zdarzeń, tak aby moduł sprawdzania poprawności mógł sprawdzić poprawność zawartości kontrolki i zaktualizowanych komunikatów u dołu strony kreatora (lub je wyczyścić).

      Zazwyczaj są to jedyne metody, które należy zastąpić. Jednakże, w zależności od walidatora, może być konieczne nadpisanie innych metod w podklasie klasy BaseValidator , którą utworzysz. Aby uzyskać więcej informacji na temat tych innych metod, zobacz klasę BaseValidator .

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

  3. Utwórz rozwiązanie dla zadania niestandardowego.

    Uwaga

    Upewnij się, że wersja tworzonej biblioteki DLL jest tej samej platformy procesora, co instalacja zestawu MDT. Jeśli na przykład zainstalujesz 64-bitową wersję zestawu MDT, skompiluj 64-bitową wersję niestandardowego zadania UDI.

  4. Utwórz element Validator pod elementem ValidatorLibrary w pliku konfiguracyjnym UDI Wizard Designer 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 walidatora powinny zawierać parametr Message . Określ wszystkie inne parametry zgodnie z wymaganiami walidatora. Na przykład w poprzednim fragmencie parametr NamedPattern służy do określania parametru nazwy wstępnie zdefiniowanego wzorca wyrażenia regularnego.

  5. Skopiuj plik konfiguracji Kreatora UDI Designer utworzony w poprzednim kroku do folderu installation_folder\Bin\Config (gdzie installation_folder jest folderem, w którym zainstalowano zestaw MDT).

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

Dokumentacja kreatora UDI

Składniki strony kreatora

Do utworzenia stron niestandardowych możesz użyć dowolnego z kilku gotowych składników.

Tworzenie instancji komponentów

Kreator kodu UDI tworzy nowe wystąpienia obiektów przy użyciu fabryk klas. Fabryki te są rejestrowane w rejestrze fabrycznym, przy użyciu ciągu znaków 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łówkowym IWmiRepository jako ID_WmiRepository.

Zakładając, że zapisałeś swoją stronę jako podklasę WizardPageImpl, możesz utworzyć nową instancję WmiRepoistory w następujący sposób:

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

Funkcja CreateInstance to bezpieczna dla typu funkcja szablonu do tworzenia nowych wystąpień składników. PWmiRepository jest inteligentnym wskaźnikiem, więc obsługuje zliczanie odwołań za Ciebie.

Komponenty, które można tworzyć

Istnieje zestaw składników, które można zarejestrować w rejestrze. Pierwszy zestaw składników jest zawsze rejestrowany, ponieważ zapewnia 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 bibliotek DLL pliku .config XML. Twój kod nie musi wiedzieć, który plik wykonywalny zawiera określony składnik.

Lista identyfikatorów komponentów komponentów (nazwa komponentu jest taka sama jak identyfikator, ale bez początkowego ID_) zarejestrowanych w rejestrze fabrycznym (zdefiniowanym w OSDSetupWizard) jest przedstawiona w tabeli 3.

Tabela 3. Identyfikatory składników

Identyfikator Opis
ID_ACPowerTask (ITask, IWizardComponent) Zadanie inspekcji wstępnej, które gwarantuje, że komputer nie będzie działał tylko na baterii
ID_AppDiscoveryTask (ITask, IWizardComponent) Wyspecjalizowane zadanie polegające na wykrywaniu elementów oprogramowania zainstalowanych na komputerze
ID_BackgroundTask (IBackgroundTask, IWizardComponent) Może być użyty do uruchomienia zadania w innym wątku
ID_CopyFilesTask (ITask, IWizardComponent) Zadanie polegające na skopiowaniu jednego lub większej liczby plików
ID_FormController (Kontroler IFormController) Najchętniej nie będziesz musiał sam tworzyć instancji, ponieważ Twoja strona otrzymuje własną instancję
ID_InvalidCharactersValidator (IValidator) Zapewnia, że żadne pole tekstowe nie zawiera znaków z listy dostarczonej walidatorowi
ID_Logger (ILogger) Najchętniej nie będziesz musiał samodzielnie tworzyć instancji, ponieważ Twoja strona otrzyma wskaźnik do udostępnionej instancji
ID_NonEmptyValidator (IValidator) Sprawdzanie poprawności, które zapewnia, że żadne pole nie jest puste
ID_PasswordValidator (IValidator) Sprawdzacz poprawności, który gwarantuje, że żadne dwa pola tekstowe nie mają tej samej zawartości
ID_Regex (IRegEx) Oblicza wyrażenia regularne, szukając dopasowań
ID_RegExValidator (IValidator) Walidator, 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 języka XML.
ID_ShellExecuteTask (ITask, IWizardComponent) Uruchamianie programu zewnętrznego
ID_SummaryBag (ISummaryBag) Dostępne pośrednio ze strony za pośrednictwem metody Form
ID_TaskManager (ITaskManager, IBackgroundCallback, IWizardComponent) Zarządzanie uruchamianiem zestawu zadań i interfejsem użytkownika
ID_WmiRepository (IWmiRepository, IWizardComponent) Umożliwia uruchamianie zapytań usługi Instrumentacja zarządzania Windows (WMI)
ID_IXmlDocument (IXmlDocument) Zapewnia fasadę do czytania i zapisywania dokumentów XML

Zdefiniowane OSDRefreshWizard.dll, strony udostępnione i inne elementy kontrolne przedstawiono w tabelach 4 i 5.

Tabela 4. Kontrolki katalogu

Identyfikator Opis
ID_Directory (IDirectory) Fasada do uzyskiwania informacji o katalogach z systemu plików

Tabela 5. Zdefiniowane SharedPages.dll

Identyfikator Opis
ID_ADHelper (IADHelper) Stanowi fasadę dla ograniczonego zestawu funkcji w usługach Active Directory® Domain Services (AD DS)
ID_CpuInfo (ICpuInfo) Określa, czy procesor jest 32- czy 64-bitowy
ID_DomainJoinValidator (IDomainJoinValidator) Przedstawiono w nim metody sprawdzania, czy zestaw poświadczeń może dołączyć do domeny
ID_DriveList (IDriveList, IBindableList, IWizardComponent) Używa usługi WMI w celu uzyskania listy dysków w komputerze
ID_WiredNetworkTask (ITask) Zadanie sprawdzające, czy użytkownik jest połączony z siecią za pomocą karty sieciowej podłączonej na stałe (zamiast bezprzewodowej)

Elementy sterujące

Interakcja z kontrolkami na stronie odbywa się za pośrednictwem 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 okna dialogowego Opis
CONTROL_CHECK_BOX (ICheckBox) Fasada do pracy z kontrolkami pól wyboru
CONTROL_COMBO_BOX (IComboBox) Fasada dla kontrolek pola kombi
CONTROL_GENERIC (IControl) Umożliwia pracę z większością typów kontrolek w celu kontrolowania stanu włączenia 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 umożliwiająca pracę z kontrolkami przycisków radiowych
CONTROL_STATIC_TEXT (IStaticText) Fasada z uprawnieniami do odczytu/zapisu tekstu formantu, takiego jak etykieta lub pole tekstowe
CONTROL_TREE_VIEW (Widok drzewa) Fasada do pracy z kontrolką widoku drzewa

Składnik listy obrazów

Ten składnik stanowi fasadę kontrolki ImageList na stronie. Listę obrazów tworzy się za pomocą interfejsu IListView lub ITreeView .

Składnik FormController

Kreator utworzy ten składnik i przekaże go na stronę. Dostęp do niego można uzyskać ze strony za pomocą metody Form implementowanej przez klasę bazową WizardPageImpl .

Składnik InvalidCharacterValidator

Jest to rodzaj walidatora, który można umieścić na stronie. Identyfikator to ID_InvalidCharactersValidator (zdefiniowany w pliku IValidator.h), który ma wartość tekstową "Microsoft.Wizard.Validation.InvalidChars".

Ten walidator 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 jakiekolwiek znaki z tej listy, składnik zgłasza błąd.

Składnik NonEmptyValidator

Jest to rodzaj walidatora, który można umieścić na stronie. Identyfikator to 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 jakakolwiek inna kontrolka obsługująca funkcję IStaticText) zawiera pusty ciąg.

Składnik PasswordValidator

Jest to rodzaj walidatora, który można umieścić na stronie. Identyfikator to ID_PasswordValidator (zdefiniowany w pliku IValidator.h), który ma wartość tekstową "Microsoft.Wizard.Validation.Password".

Ten walidator działa z dwiema różnymi kontrolkami tekstowymi (kontrolkami obsługującymi IStaticText) i zgłasza błąd, jeśli nie zawierają tych samych wartości. Innymi słowy, zakończy się niepowodzeniem, jeśli pola tekstowe Hasło i Potwierdź hasło nie są zgodne.

Ponieważ ten walidator wymaga dwóch kontrolek, wymaga więcej konfiguracji niż inne walidatory. 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 element podrzędny kontrolki hasła . W ten sposób, jeśli kontroler formularza wyłączy kontrolę hasła , wyłączy również kontrolkę Potwierdź hasło . Następnie dodaj weryfikator hasła do formularza. Na koniec udostępnij weryfikatorowi haseł interfejs do kontrolki Potwierdź hasło .

Ze względu na wymóg dwóch kontrolek, musisz użyć kodu, aby skonfigurować ten walidator, a nie .config plik XML.

Składnik RegExValidator

Jest to rodzaj walidatora, który można umieścić na stronie. Identyfikator to ID_RegExValidator (zdefiniowany w pliku IValidator.h), który ma wartość tekstową "Microsoft.Wizard.Validation.RegEx".

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

Alternatywnie możesz użyć tego walidatora z predefiniowanym nazwanym wzorcem. Aby użyć wyrażenia regularnego, kod XML musi zawierać właściwość ustawiającą o nazwie Wzorzec. Jeśli zamiast tego chcesz użyć nazwanego wzorca, użyj ustawienia o nazwie NamedPattern ustawionego na jedną z wartości w tabeli 7.

Tabela 7. Nazwane ustawiacze wzorów

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

Składnik FactoryRegistry

Ten komponent śledzi wszystkie fabryki klas i usługi. Implementuje interfejs IFactoryRegistry i jest dostępny pośrednio za pośrednictwem metody kontenera strony. Ponadto rejestr ładuje rozszerzenia bibliotek DLL. Po załadowaniu biblioteki DLL rejestr szuka wyeksportowanej funkcji o nazwie RegisterFactories. Musisz zaimplementować tę funkcję i w niej zarejestrować fabryki klas dla swoich stron, zadań i walidatorów (oraz wszelkie inne fabryki 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 komponent jest dostępny dla Twojej strony za pośrednictwem metody Logger (zaimplementowanej przez WizardPageImpl). Ta metoda służy do zapisywania wpisów w pliku dziennika. Zawartość pliku dziennika jest przydatna w diagnozowaniu problemów, które użytkownicy mogą napotkać podczas uruchamiania Kreatora identyfikatorów UDI.

Składnik PropertyBag

Torba właściwości jest kontenerem zmiennych pamięci. Jest ona dostępna na stronie za pomocą polecenia Container()->Properties(). Zmienne pamięci są przydatne przy przekazywaniu danych tymczasowych między różnymi stronami.

Komponenty TSVariableBag i TSRepository

Składnik TSVariableBag umożliwia odczytywanie i zapisywanie zmiennych sekwencji zadań. Wartości są przechowywane w pamięci do momentu wybrania przez użytkownika opcji Zakończ (domyślnie). Dostęp do torby TSVariable można uzyskać za pośrednictwem metody TSVariables strony (zaimplementowanej przez klasę bazową WizardPageImpl ). Te składniki rejestrują wszystkie odczyty i zapisy zmiennych sekwencji zadań.

Składnik WmiRepository

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

Klasy pomocnika strony kreatora

Niestandardowe strony kreatora UDI można tworzyć przy użyciu wbudowanych klas pomocników dostarczanych z zestawem SDK UDI. W tabeli 8 wymieniono klasy pomocników, których można użyć do tworzenia niestandardowych stron kreatora.

Tabela 8. Klasy pomocników

Klasa pomocnika Opis
Klasa ClassFactoryImpl Jest to przydatna klasa bazowa do tworzenia fabryki klas, którą można następnie zarejestrować w rejestrze fabryki.
Klasa szablonu interfejsu Użyj tej klasy szablonu, jeśli chcesz zbudować składnik, który implementuje 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 referencyjne do zarządzania okresem istnienia w składnikach COM. Ważne jest, aby zwolnić interfejsy po ich zakończeniu. 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 szablonu wskaźnika.
Klasa pomocnika StringUtil Ta klasa dostarcza metod pomocniczych, które ułatwiają pracę z ciągami.
Klasa szablonu interfejsu podrzędnego Ta klasa bazowa ułatwia zaimplementowanie składnika obsługującego interfejs, który dziedziczy po innym interfejsie.
Klasa szablonu UnknownImpl Ta klasa obsługuje większość szczegółów tworzenia składnika COM.
Klasa szablonu WizardComponent Ta klasa bazowa służy do tworzenia składników wymagających dostępu do usług kreatora, takich jak tworzenie składników i rejestrowanie.
Klasa szablonu WizardPageImpl Ta klasa bazowa powinna być używana jako klasa bazowa dla wszystkich niestandardowych stron kreatora

Klasa ClassFactoryImpl

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

Poniżej znajduje się 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ższy fragment jest fragmentem pliku LocationPage.cpp na przykładowej stronie kreatora użytego do zdefiniowania fabryki klas dla tej strony.

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

Klasa szablonu interfejsu

Użyj tej klasy szablonu, gdy chcesz zbudować 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 WizardPageImpl (którymi jest 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 pliku .dll z uchwytem wystąpienia podanym dla tej metody:

static inline std::wstring GetModuleFilename(HINSTANCE hModule)

Klasa zwraca pełną ścieżkę i nazwę pliku .exe oraz pliku .dll z uchwytem 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ę z nazwą 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 referencji do zarządzania okresem istnienia, ważne jest, aby zawsze zwalniać interfejsy po zakończeniu ich pracy. Firma Microsoft udostępnia klasę szablonu, która automatycznie obsługuje okres istnienia. Jeśli na przykład chcesz ustawić inteligentny wskaźnik dla interfejsu XML, możesz napisać coś takiego:

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

Pierwsza linia definiuje wskaźnik inteligentny. Drugi wiersz przedstawia pobieranie inteligentnego wskaźnika za pośrednictwem innego wywołania. Operator & zawsze zwalnia istniejący interfejs, jeśli taki zawiera, i zwraca adres wskaźnika wewnętrznego. Po pobraniu takiego wskaźnika instancja wskaźnika wywołuje metodę Release , 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 Pointer wywołuje klasę QueryInterface , aby pobrać inne interfejsy. Na przykład, gdy rejestr fabryczny tworzy nową instancję komponentu, ma kod taki jak:

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

Pierwszy wiersz wywołuje 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 szablonu wskaźnika .

Klasa pomocnika StringUtil

Ta klasa jest zdefiniowana w Utilities.h i zapewnia 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, ignorując wielkość liter (patrz Tabela 9).

Tabela 9. Klasa pomocnika StringUtil

Zwroty 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ą trochę podobne do metod Microsoft .NET Format w tym sensie, że parametry mają postać {0}. Nie są jednak wykonywane żadne formatowanie danych wejściowych, a jedynie podstawianie:

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)

Są to otoki wokół StringCchPrintf , które zwracają wstring , dzięki czemu nie trzeba samodzielnie przydzielać pamięci na ciągi lub bufory.

Klasa szablonu interfejsu podrzędnego

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

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

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

Klasa szablonu UnknownImpl

Ta klasa jest zdefiniowana w UnknownImpl.h i obsługuje większość szczegółów tworzenia składnika COM. Oto przykład, w jaki sposób można użyć tej klasy bazowej:

classDirectory :public UnknownImpl<IDirectory>

Ten kod definiuje klasę obsługującą interfejs IDirectory .

Klasa szablonu WizardComponent

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

Na przykład składnik CopyFilesTask jest zdefiniowany w następujący sposób:

classCopyFilesTask :public WizardComponent<ITask>
{
    ...

Parametrem dla tej klasy szablonu jest "główny" interfejs, którego chcesz użyć dla swojego komponentu, którym w przypadku zadań jest ITask. Użycie WizardComponent oznacza, że składnik obsługuje zarówno podany interfejs (ITask w tym przykładzie), jak i IWizardComponent.

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

Klasa szablonu WizardPageImpl

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

class LocationPage :public WizardPageImpl<IDD_LOCATION_PAGE>

Parametr jest identyfikatorem zasobu szablonu okna dialogowego.

Interfejsy stron kreatora

Kreator kodu UDI używa interfejsów w celu uzyskania dostępu do różnych kontrolek na stronie. Na stronie używasz funkcji GetControlWrapper do pobierania otoki kontrolki. Oto przykład:

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

W tym przypadku PStaticText jest inteligentnym wskaźnikiem do interfejsu IStaticText . Inteligentne wskaźniki automatycznie wywołują metodę COM Release(), gdy wyjdą poza zakres lub przekażesz adres zmiennej (np. &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 umożliwia sprawdzenie, 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(nazwa użytkownika LPCTSTR, hasło LPCTSTR, domena LPCTSTR, nazwa komputera_LPCTSTR, domena konta LPCTSTR)

Ta metoda umożliwia sprawdzenie, czy zestaw poświadczeń ma prawa 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.

Interfejs zadania IBackgroundTask

__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

Na stronie postępu ta klasa jest używana do uruchamiania zadań w osobnym wątku. Możesz również użyć tej klasy, gdy chcesz wykonać operacje na oddzielnym wątku. Zadania to dowolna klasa, która obsługuje interfejs ITask .

Interfejs ten 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 klasy zawierającej kod, który ma zostać uruchomiony w innym wątku
Identyfikator Liczba, której można użyć w metodzie Finished wywołania zwrotnego, aby stwierdzić, które zadanie zostało uruchomione; Przydatne w przypadku uruchamiania kilku zadań za pomocą tej samej metody wywołania zwrotnego
pWywołanie zwrotne 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 odbywać się w wątku w tle, a nie w wątku interfejsu użytkownika
void start(void)

Ta metoda rozpoczyna zadanie od wątku w tle i zwraca elementy pokazane w tabeli 13.

Tabela 13. Zwróć wątek tła

Zwroty Opis
E_INVALIDARG Zadanie jest już uruchomione, więc nie możesz go uruchomić w tej chwili.
E_FAIL Wystąpił problem podczas uruchamiania wątku.
S_OK Wątek został rozpoczęty.
BOOL Running()

Ta metoda zwraca wartość TRUE, jeśli zadanie w tle jest obecnie uruchomione, lub 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 Tabela 14 i Tabela 15). Po zwróceniu wyników tej metody ukończenie tego procesu może zająć trochę czasu.

Tabela 14. HRESULT Zakończ kod wyjścia

Parametr Opis
Kod zakończenia Kod zakończenia, który zostanie wysłany do metody wywołania zwrotnego Finished, która będzie również dostępna z metody GetExitCode .

Tabela 15. Kody wypowiedzenia

Zwroty Opis
E_FAIL Wywołanie zakończenia nie powiodło się.
S_OK Żądanie zakończenia wątku powiodło się.
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
Kod pCode Wskaźnik do wartości DWORD , która zostanie ustawiona przy zwrocie lub nullptr , jeśli wartość zwracana nie jest potrzebna. Po zakończeniu ten parametr jest ustawiany na STILL_ACTIVE , jeśli wątek jest uruchomiony, kod zwrócony przez metodę Execute zadania lub wartość przekazaną do metody Zakończ, jeśli wywołano tę metodę.
Wynik pH Wskaźnik do HRESULT , który zostanie ustawiony przy return lub nullptr , jeśli nie potrzebujesz wartości HRESULT .
HRESULT Close(void)

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

Interfejs ICheckBox

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

Ustaw stan zaznaczenia pola wyboru. Gdy metoda ma wartość PRAWDA, pole wyboru jest zaznaczone; jeśli metoda ma wartość FAŁSZ, pole wyboru jest wyczyszczone.

BOOL IsButtonChecked()

Ta metoda raportuje bieżący stan pola wyboru.

Interfejs IComboBox

__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 można pobrać za pomocą funkcji pomocnika GetControlWrapper z typem CONTROL_COMBO_BOX.

HRESULT Bind([in] IBindableList *pList)

Użyj tej metody, gdy masz źródło danych, które implementuje interfejs IBindableList . Pole listy inicjuje zawartość podpisami z tej listy.

HRESULT Select(int index)

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)

Pobiera ciąg aktualnie wybranego elementu w polu kombi.

void clear()

Usuń wszystkie elementy z pola kombi.

Interfejs IControl

__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 można pobrać za pomocą funkcji pomocnika GetControlWrapper z typem CONTROL_GENERIC.

HRESULT SetEnable(BOOL enable)

Włączanie lub wyłączanie formantu.

BOOL IsEnabled(void)

Zwraca wartość PRAWDA, jeśli kontrolka jest włączona, lub FAŁSZ, jeśli nie jest.

HRESULT SetVisible(BOOL visible)

Pokaż lub ukryj kontrolkę.

Interfejs ICpuInfo

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

Ten interfejs można uzyskać, tworząc nowy składnik ID_CpuInfo . Pojedyncza metoda raportuje, czy procesor jest 32-, czy 64-bitowy. Należy pamiętać, że w przypadku 32-bitowego systemu operacyjnego na komputerze 64-bitowym ta metoda zwraca wartość PRAWDA, ponieważ raportuje tylko szerokość procesora (nie systemu operacyjnego).

Interfejs IDirectory
__interface IDirectory : IUnknown
{
    BOOL FileExists(LPCWSTR name);
    BOOL FindFirst([in] LPCWSTR name);
    HRESULT FoundName([out, retval] LPBSTR name);
    DWORD FoundAttributes(void);
    BOOL FindNext(void);
    void FinishFind(void);
};
Omówienie

Składnik Directory , który tworzy się za pomocą ID_Directory, zapewnia fasadę do pracy z katalogami w systemie plików.

BOOL FileExists(nazwa LPCWSTR)

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

BOOL FindFirst([in] Nazwa LPCWSTR)

Ta metoda znajduje pierwsze dopasowanie dla podanej nazwy. Obsługuje symbole wieloznaczne i zwraca nazwy plików i katalogów. Metoda zwraca wartość PRAWDA, jeśli znaleziono dopasowanie, lub FAŁSZ w przeciwnym razie.

HRESULT FoundName([out, retval] LPBSTR name)

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

DWORD FoundAttributes(void)

Ta metoda zwraca atrybut dla ostatniego znalezionego pliku lub katalogu. Możesz użyć następującego kodu, aby sprawdzić, czy jest to katalog:

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

Znajdź następny. Ta metoda zwraca wartość PRAWDA, jeśli znaleziono inne dopasowanie, lub wartość FAŁSZ w przeciwnym razie.

void FinishFind(void)

Ta metoda zwalnia zasoby używane na potrzeby operacji znajdowania.

IDomainJoinValidator Interface

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

Wystąpienie tego interfejsu można uzyskać przy użyciu wartości ID_DomainJoinValidator funkcji szablonu CreateInstance .

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

Zainicjuj wystąpienie, jak pokazano w tabeli 17.

Tabela 17. HRESULT init — inicjowanie instancji

Parametr Opis
pLogger Instancja rejestratora, która jest dostępna dla Twojej strony za pośrednictwem metody Rejestrator strony
pContainer Przekazuje wyniki z metody kontenera strony
pNazwa użytkownika Pole tekstowe zawierające nazwę użytkownika, którego poprawność ma zostać sprawdzona
pPassword (Hasło domyślne) Pole tekstowe zawierające hasło do sprawdzenia poprawności
PComputerName (Nazwa komputera) Pole tekstowe zawierające nazwę komputera, który docelowo zostanie przyłączony do domeny
HRESULT IsUsernameValid(LPCWSTR nazwa_domeny)

Ta metoda używa metody IADHelper-ValidLogon> do wykonania pracy. Szczegółowe informacje można znaleźć w tej metodzie.

BOOL CanModifyComputerAdEntry(LPCWSTR domainName)

Sprawdź, czy użytkownik ma prawa modyfikowania wpisu na komputerze. Większość pracy jest wykonywana przez IADHelper-HasAccess>. Jeśli ta metoda zwraca wartość FALSE, sprawdź szczegóły w pliku dziennika.

Interfejs IDriveList

__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ć nowe 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 w poniższym wierszu zostaną zwrócone tylko dyski USB:

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

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(ENUM_DISK_QUERY_SECTION section, LPCTSTR propName, LPCTSTR propNameReturned)

Ta metoda powoduje dodanie nazw dodatkowych właściwości, które mają być dostępne w wynikach zapytania. Wywołaj tę metodę przed wywołaniem Update. Tabela 18 przedstawia trzy przydatne właściwości.

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

Sekcja Właściwość Opis
DISKQUERY_LOGICALDISK Rozmiar Rozmiar w bajtach przedstawiony w postaci ciągu
DISKQUERY_DISKPARTITION Indeks programu DiskIndex Numer dysku wyrażony jako liczba całkowita, zaczynając od 0
DISKQUERY_LOGICALDISK VolumeName (Nazwa woluminu) Etykieta woluminu
size_t Count(void)

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

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

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

Tabela 19. HRESULT GetProperty

Parametr Opis
Index (Indeks) Indeks od zera do rekordu wyniku
propName (Nazwa właściwości) Nazwa właściwości, na przykład "Rozmiar"
Wartość Po zwróceniu parametr ten zawiera wartość wariantu właściwości
HRESULT GetCaption(size_t index, LPBSTR pCaption)

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

Interfejs IImageList

__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 komponent ImageList . Wystąpienie tego składnika można pobrać z interfejsu IListView .

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

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 uchwyt dla listy obrazów w przypadku, gdy musisz wykonać inne operacje 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. Interfejs HRESULT IImageList

Parametr Opis
hInstance Dojście wystąpienia modułu zawierającego zasób mapy bitowej
resourceId (identyfikator zasobu) Identyfikator zasobu do załadowania do listy obrazów

Interfejs IListView

__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 można pobrać za pomocą funkcji pomocnika GetControlWrapper z typem CONTROL_LIST_VIEW.

int AddItem([in] LPCTSTR text)

Dodawanie nowego wiersza do pola listy. Metoda zwraca indeks właśnie dodanego elementu.

int AddColumn(całkowita szerokość, [in] tekst LPCTSTR)

Dodawanie nowej kolumny do widoku listy.

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

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 ma zostać zmodyfikowany
kolumna Indeks kolumny, którą chcesz zaktualizować; pierwsza kolumna jest ustawiana za pomocą AddItem, kolumny druga i następne są ustawiane za pomocą tej metody
text (tekst) Ciąg wyświetlany w kolumnie
int GetWidth(void)

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

void SetExtendedStyle(DWORD style)

Ta metoda pozwala ustawić style rozszerzone w polu listy — na przykład:

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

Ta metoda zwraca indeks aktualnie zaznaczonego elementu widoku listy.

HRESULT SelectItem(int index)

Ustaw ten indeks dla elementu zaznaczonego na liście.

BOOL IsItemChecked(int index)

Ta metoda zwraca wartość PRAWDA, jeśli jest zaznaczony 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(int width, int height, UINT flags)

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 w widoku listy. Najpierw należy wywołać metodę CreateImageList.

HRESULT SetImage(int index, int imageIndex)

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

HRESULT Clear(void)

Usuwanie wszystkich elementów z widoku listy.

Interfejs IProgressBar

__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 można pobrać za pomocą funkcji pomocnika GetControlWrapper z typem CONTROL_PROGRESS_BAR.

HRESULT SetPercentage(int position)

Ustaw pozycję paska postępu, używając liczby z przedziału od 0 do 100. Domyślnie nowe paski postępu w systemie Win32® mają maksymalny zakres 100.

int GetPercentage(void)

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

Interfejs IRadioButton

__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 można pobrać za pomocą funkcji pomocnika GetControlWrapper z typem CONTROL_RADIO_BUTTON.

void SetGroup(int firstId, int lastId)

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

void CheckRadio(int id)

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

BOOL IsButtonChecked(int id)

Ta metoda zwraca wartość PRAWDA, jeśli przycisk radiowy jest obecnie zaznaczony; w przeciwnym razie zwraca wartość FAŁSZ.

void EnableRadio(int id, BOOL enable)

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

IStaticText Interface

__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 można pobrać za pomocą funkcji pomocnika GetControlWrapper z typem CONTROL_STATIC_TEXT.

HRESULT SetText([in] LPCTSTR pText)

Ustaw tekst kontrolki.

HRESULT GetText([out, retval] LPBSTR pText)

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

Interfejs ITask

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

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

Oto komponenty, które implementują 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"

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

Jeśli piszesz zadanie na stronę inspekcji wstępnej, wywołaj tę metodę, aby zainicjować zadanie. Plik .config zawiera kod XML i może on 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 ustawiających, natomiast parametr pTaskSettings zapewnia dostęp do elementu Task i elementów podrzędnych. Większość zadań wymaga jedynie odczytu danych z parametru pProperties .

Wykonywanie
HRESULT Execute(LPDWORD pReturnCode)

Tutaj piszesz kod wykonujący zadanie. Ta metoda powinna zwrócić S_OK , jeśli nie wystąpiły żadne błędy, i może zwrócić inną wartość HRESULT , jeśli wystąpił błąd podczas wykonywania zadania. W przypadku korzystania ze strony inspekcji wstępnej wartości inne niż S_OK zwracane przez tę metodę są dopasowywane do <elementów Error> w <sekcji ExitCodes> .

Parametr pReturnCode musi zostać zaktualizowany liczbą, która raportuje stan zadania. Wartości te są dopasowywane przez stronę preflights do <elementów ExitCode> .

Interfejs ITreeView

__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 można pobrać za pomocą funkcji pomocnika GetControlWrapper z typem CONTROL_TREE_VIEW.

void EnableCheckboxes(void)

Ta metoda włącza pola wyboru w formancie widoku drzewa przez ustawienie stylu TVS_CHECKBOXES .

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

Dodawanie nowej listy obrazów do kontrolki widoku drzewa. Parametr flags jest przekazywany w wywołaniu funkcji ImageList_Create Win32.

int AddImage(HINSTANCE hInstance, int resourceId)

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

HTREEITEM AddItem(LPCTSTR text, HTREEITEM hParent = NULL)

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

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

Ustaw obraz, który ma być używany dla elementu widoku drzewa. Możesz ustawić zarówno normalny, jak i rozszerzony obraz.

void Wyczyść(void)

Usuwanie wszystkich elementów z widoku drzewa.

BOOL SetFirstVisible(element HTREEITEM)

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

BOOL SelectItem(element HTREEITEM)

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

void CheckItem(HTREEITEM item, UINT checkState)

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

Tabela 22.void CheckItem Image List Default

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

Ta metoda zwraca uchwyt aktualnie zaznaczonego elementu widoku drzewa.

int SetItemHeight(SHORT height)

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

HRESULT EnableItem(element HTREEITEM, BOOL enable)

Ta metoda włącza lub wyłącza pojedynczy element w drzewie. Wyłączenie elementu z dziećmi nie spowoduje ich wyłączenia.

void Expand(HTREEITEM, hItem, BOOL expand)

Ta metoda rozwija 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 obiektu nadrzędnego dla węzła w widoku drzewa lub wartość NULL, jeśli węzeł znajduje się na najwyższym poziomie.

HTREEITEM GetNextItem(HTREEITEM hPrevious)

Tę metodę można wywołać za pomocą dojścia, które GetChild wraca, aby iterować po wszystkich elementach podrzędnych węzła. Ta metoda zwraca następny element równorzędny w drzewie, który ma tego samego rodzica.

UINT IsChecked(element HTREEITEM)

Ta metoda zwraca wartość 0 , jeśli węzeł widok drzewa nie jest wybrany, lub 1 , jeśli jest.

BOOL IsEnabled(element HTREEITEM)

Ta metoda zwraca wartość PRAWDA, jeśli węzeł widoku drzewa jest włączony, lub wartość FAŁSZ w przeciwnym razie.

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

Ta metoda jest przeznaczona tylko do użytku wewnętrznego.

HRESULT SetEventHandler(ITreeViewEvent *pEventHandler)

Wywołaj tę metodę, jeśli chcesz otrzymywać powiadomienie po zmianie zaznaczonego elementu lub zmianie stanu sprawdzania elementu widoku drzewa przez użytkownika. Należy zaimplementować zdarzenie ITreeViewEvent w składniku, aby odbierać te wywołania zwrotne.

void SetSelectedBackColor(COLORREF color)

Ustawianie koloru tła używanego dla wybranego elementu.

Interfejs IWmiIteration

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

Ten interfejs, wraz z IWmiRepository, jest zazwyczaj używany podczas pracy z wywołaniami WMI. Interfejs IWmiIteration umożliwia iterację wartości zwracanych przez zapytanie.

HRESULT Next(void)

Przejście do następnego elementu w wynikach zapytania pokazanego w tabeli 23.

Tabela 23. HRESULT Next(void) zwraca zapytanie

Wynik HR Opis
S_OK Przeniesiono do następnego wyniku; możesz użyć funkcji GetProperty , aby pobrać właściwości tego wyniku.
S_FALSE Nie ma więcej elementów na liście.
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 wyniku, jak pokazano w tabeli 24 i tabeli 25.

Tabela 24. HRESULT GetProperty

Parametr Opis
propertyName (nazwa właściwości) Nazwa właściwości, którą chcesz pobrać
pValue (Wartość docelowa) Wskazuje strukturę typu WARIANT, która przy zwrocie zawiera wartość właściwości.

Tabela 25. HRESULT GetProperty Result

HRESULT Opis
S_OK Wartość właściwości została pobrana.
WBEM_E_NOT_FOUND W nazwie nie ma żadnej właściwości.
E_NOT_VALID_STATE Brak bieżącego rekordu.

Uwaga

Metoda GetProperty może zwracać inne kody błędów usługi WMI niż wymienione w tabeli 25. Wymienione wartości to typowe zwracane wyniki.

Interfejs IWmiRepository

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

Interfejs ten jest implementowany przez komponent WmiRepository (ID_WmiRepository).

HRESULT SetNamespace(LPCWSTR namespaceName)

Ta metoda określa przestrzeń nazw usługi WMI, która zostanie użyta dla zapytania. Wywołaj tę metodę przed wywołaniem funkcji ExecQuery. Jeśli ta metoda nie zostanie wywołana, przestrzenią nazw będzie katalog główny\cimv2. Ta metoda zawsze zwraca S_OK.

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

Wykonaj zapytanie względem zestawu przestrzeni nazw WMI za pomocą wywołania SetNamespace, jak pokazano w Tabelach 26 i 27.

Tabela 26. HRESULT ExecQuery

Parametr Opis
Zapytanie Ciąg zapytania usługi WMI, które ma zostać wykonane
ppIterator Przekazywanie wskaźnika do wskaźnika interfejsu, który po powrocie zostanie wypełniony interfejsem, umożliwiając dostęp do wyników zapytania

Tabela 27. Wynik zapytania HRESULT

HRESULT Opis
S_OK Zapytanie powiodło się
Inne Jeśli kwerenda nie powiodła się, zwraca wartość HRESULT usługi WMI

Interfejs kontrolera IFormController

__interface IFormController : IUnknown
{
    Init(IWizardPageView *pView, IWizardPageContainer *pContainer);
    SetPageInfo(ISettingsProperties *pPageInfo);

    Validate(void);

    AddToGroup(int groupControlId, int controlId);
    UpdateCheckGroup(int groupControlId);
    AddValidator(int controlId, IValidator *pValidator, IControl *pCOntrol = 0);

    AddValidator(int controlId, LPCWSTR validatorId, LPCWSTR message, IValidator **ppValidator = nullptr);
    DisableValidation(int controlId, BOOL disable);

    AddField(LPCWSTR fieldName, int controlId, BOOL suppressLog, DialogControlTypes type);
    AddRadioGroup(LPCWSTR groupName, int radioControlId);
    EnableRadioGroup(LPCWSTR groupName, BOOL enable);
    InitFields(IFieldCallback *pFieldCallback = nullptr);
    SaveFields(IFieldCallback *pFieldCallback = nullptr);
    BOOL IsFieldDisabled(int controlId);

    InitSection(LPCWSTR key, LPCWSTR sectionCaption);
    AddSummaryItem(LPCWSTR first, LPCWSTR second);
    SuppressLogValue(LPCWSTR tsVariableName);
    SaveText(int controlId, LPCWSTR tsVariableName, LPCWSTR summaryCaption);
    LoadText(int controlId, LPCWSTR tsVariableName);

    void ControlEvent(WORD eventId, WORD controlId);
    BOOL IsValid(void);
 };
Omówienie

Każda strona w Kreatorze UDI ma własny kontroler formularza, który implementuje ten interfejs. Za pomocą tego kontrolera można połączyć dane pól z pliku .config XML z kontrolkami na stronie. Kontroler formularza obsługuje wiele szczegółów za Ciebie.

Konfigurowanie formularza

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

Tabela 28. Metoda OnWindowCreated

Metoda Opis
Inicjowanie Inicjuje kontroler formularzy
Pole dodania Zapewnia połączenie między polem w pliku .config XML, które jest nazwą ciągu, a kontrolką w oknie dialogowym strony, która jest identyfikatorem
AddRadioGroup (Grupa DodajRadia) Umożliwia połączenie przycisku radiowego zarówno z grupą, jak i z kontrolką w oknie dialogowym.
AddToGroup Zezwala na "podrzędne" kontrolki, które są włączane lub wyłączane wraz z ich rodzicem lub w zależności od tego, który przycisk radiowy jest zaznaczony
Pola wejściowe Wywołaj po wywołaniu wszystkich metod Add w celu skonfigurowania formularza
Sprawdź poprawność Przeprowadza wstępną weryfikację
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 mógł przetwarzać zdarzenia związane z formularzem.

Zapisywanie danych formularza

W metodzie OnNextSelected wywołuje metody formularzy przedstawione w tabeli 29.

Tabela 29. OnNextSelected Method

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

Tę metodę zwykle wywołuje się na początku metody OnWindowCreated strony. Polecenie powinno wyglądać mniej więcej tak:

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

Ta metoda jest wywoływana wewnętrznie i nie należy jej wywoływać samodzielnie. Dostarcza kod XML strony do kontrolera formularza.

Sprawdź poprawność
HRESULT Validate(void)

Metoda ta wykonuje wszystkie walidatory dołączone do kontrolek. Jeśli walidator nie przejdzie pomyślnie, kontroler formularza wyświetla komunikat ostrzegawczy i wyłącza przycisk Dalej , a następnie zatrzymuje przetwarzanie walidatorów. Zazwyczaj należy wywołać tę metodę tylko na końcu OnWindowCreated metody; Zawsze zwraca S_OK.

AddToGroup
AddToGroup(int groupControlId, int controlId)

Ta metoda powoduje dodanie kontrolki jako elementów podrzędnych pola wyboru lub przycisku radiowego, jak pokazano w tabeli 30. Wszystkie takie kontrolki podrzędne zostaną wyłączone, jeśli kontrolka nadrzędna nie jest zaznaczona. Ta metoda zawsze zwraca S_OK.

Tabela 30. AddToGroup

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

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

AddValidator (SprawdźSprawdzanie poprawności)
HRESULT AddValidator(int controlId, IValidator *pValidator, IControl *pControl = 0)

Wywołaj tę metodę tylko wtedy, gdy masz walidator, który chcesz utworzyć w kodzie, a nie za pomocą kodu XML. Ta metoda zawsze zwraca S_OK.

AddValidator (SprawdźSprawdzanie poprawności)
HRESULT AddValidator(int controlId, LPCWSTR validatorId, LPCWSTR message, IValidator **ppValidator = nullptr)

Wywołaj tę metodę tylko wtedy, gdy masz walidator, który chcesz utworzyć w kodzie, a nie za pomocą kodu XML.

DisableValidation (Weryfikacja wyłączenia)
HRESULT DisableValidation(int controlId, BOOL disable)

Wywołaj tę metodę, aby jawnie wyłączyć walidator dla kontrolki lub przywrócić normalną walidację, jak pokazano w Tabeli 31. Ta metoda jest przydatna na przykład przy włączaniu i wyłączaniu reguł dla kontrolek, które nie są objęte sprawdzaniem poprawności formularza i gdy trzeba wyłączyć sprawdzanie poprawności kontrolki. Innymi słowy, normalnie nie wywołałbyś tej metody. Ta metoda zawsze zwraca S_OK.

Tabela 31. HRESULT DisableValidation

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

Dodaj mapowanie kontrolki między nazwą w elemencie Pole pliku .config XML a identyfikatorem kontrolki w oknie dialogowym strony, jak pokazano w tabeli 32. Tę metodę należy wywołać przed wywołaniem metody InitFields, ponieważ funkcja InitFields używa tych informacji. Ta metoda zawsze zwraca S_OK.

Tabela 32. HRESULT AddField

Parametr Opis
fieldname (Nazwa pola) Nazwa pola wyświetlana w pliku XML strony
controlId (identyfikator kontrolki) Identyfikator kontrolki w szablonie okna dialogowego strony
suppressLog Ustaw wartość na TRUE, jeśli nie chcesz, aby wartości z tego pola były zapisywane w pliku dziennika; zawsze ustawiaj 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 (Grupa DodajRadia)
HRESULT AddRadioGroup(LPCWSTR groupName, int radioControlId)

Ta metoda powoduje dodanie kontrolki do nazwanej grupy przycisków radiowych, jak pokazano w tabeli 33. Należy wywołać to przed metodą InitFields , ponieważ metoda ta używa atrybutów elementu RadioGroup do sterowania ustawieniami wszystkich kontrolek przycisków radiowych w grupie. Grupy opcji można na przykład zablokować, aby wszystkie przyciski radiowe były wyłączone, a kontrolki podrzędne były włączane lub wyłączane tylko w zależności od tego, który przycisk radiowy jest zaznaczony. Ta metoda zawsze zwraca S_OK.

Tabela 33. HRESULT AddRadioGroup

Parametr Opis
groupName (Nazwa grupy) Ciąg definiujący grupę przycisków radiowych na tej stronie
radioControlId Identyfikator pojedynczego przycisku radiowego, który ma zostać dodany do tej grupy
EnableRadioGroup
HRESULT EnableRadioGroup(LPCWSTR groupName, BOOL enable)

Ta metoda umożliwia włączenie lub wyłączenie całej grupy przycisków opcji. Wyłączenie grupy opcji powoduje wyłączenie wszystkich kontrolek przycisków radiowych w grupie, jak również wszystkich elementów podrzędnych tych przycisków radiowych, które zostały dodane za pomocą polecenia DodajDoGrupa. Patrz tabela 34 i tabela 35.

Tabela 34. EnableRadioGroup

Parametr Opis
groupName (Nazwa grupy) Nazwa grupy przycisków opcji, która została już zdefiniowana za pomocą wywołania funkcji DodajGrupęRadiową
Umożliwianie Ustaw wartość TRUE, aby włączyć grupę przycisków opcji, lub wartość FALSE, aby wyłączyć grupę

Tabela 35. HRESULT EnableRadioGroup

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

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

Parametr pFieldCallback jest opcjonalny. Jeśli zostanie podany, kontroler formularza wywołuje funkcję SetFieldDefault dla kontrolek, które nie są CONTROL_STATIC_TEXT ani CONTROL_CHECK_BOX. Takie zachowanie pozwala na pobranie wartości domyślnej z pliku XML i ustawienie jej samodzielnie w formancie.

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 pFieldCallback umożliwia obsługę zapisywania wartości dla kontrolek, które nie obsługują CONTROL_STATIC_TEXT.

IsFieldDisabled
BOOL IsFieldDisabled(int controlId)

Ta metoda pozwala ustalić, czy pole zostało wyłączone w pliku XML.

Sekcja początkowa
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 metody SaveFields. Ta metoda zawsze zwraca S_OK.

Tabela 36. HRESULT InitSection

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

Ta metoda umożliwia dodawanie na stronie podsumowania elementów wykraczających poza elementy ustawiane za pomocą kodu XML. Patrz tabela 37.

Tabela 37. HRESULT AddSummaryItem

Parametr Opis
Po pierwsze Podpis elementu podsumowania wyświetlany po lewej stronie
Sekunda Wartość, która zostanie wyświetlona 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, kody PIN lub inne poufne wartości, które może wprowadzić użytkownik.

SaveText (ZapiszTekst)
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 samodzielnie wywoływać tej metody, ponieważ kontroler formularza robi to dla wszystkich pól. Patrz tabela 38.

Tabela 38. HRESULT SaveText

Parametr Opis
controlId (identyfikator kontrolki) Identyfikator pola tekstowego zawierającego wartość, którą chcesz zapisać (lub inną kontrolkę mogącą zwracać tekst)
tsVariableName (Nazwa zmiennej ts) Nazwa zmiennej sekwencji zadań, którą chcesz zmodyfikować
summaryCaption Podpis tej wartości na stronie Podsumowanie
Załaduj tekst
HRESULT LoadText(int controlId, LPCWSTR tsVariableName)

Ta metoda odczytuje wartość zmiennej sekwencji zadań i ustawia tę wartość w polu tekstowym.

ControlEvent (Zdarzenie kontrolki)
void ControlEvent(WORD eventId, WORD controlId)

Wywołaj tę metodę w metodzie OnControlEvent , aby upewnić się, że kontroler formularza może przetwarzać zdarzenia kontrolki, co jest niezbędne do poprawnego działania. Wartości przekazywane do tej metody są takie same jak wartości przekazywane do metody OnControlEvent .

IsValid (Jestprawidłowy)
BOOL IsValid(void)

Ta metoda zwraca stan ostatniej weryfikacji formularza. Jeśli którykolwiek z weryfikatorów kontrolek zgłosił błąd, ta metoda zwraca wartość FALSE. Innymi słowy, zwraca wartość PRAWDA tylko wtedy, gdy wszystkie kontrolki na stronie są prawidłowe.

Interfejs IValidator

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

Weryfikatory to składniki, które mogą sprawdzać poprawność pojedynczej kontrolki na stronie. Najprostszym sposobem zaimplementowania walidatora jest uczynienie z niego podklasy klasy BaseValidator , która jest zdefiniowana w pliku nagłówkowym BaseValidator.h.

HRESULT Init(IControl *pControl, LPCTSTR message)

Jeśli tworzysz walidatora w kodzie, możesz wywołać tę metodę, aby zainicjować walidator. Patrz tabela 39.

Tabela 39. HRESULT Init

Parametr Opis
pControl Kontrolka, którą musi sprawdzić weryfikator
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ę w celu zainicjowania walidatorów, które tworzy na podstawie XML strony. Patrz tabela 40.

Tabela 40. Metoda init HRESULT

Parametr Opis
pControl Kontrolka, którą musi sprawdzić weryfikator
pContainer W przypadku, gdy walidator potrzebuje dostępu do rejestratora lub musi stworzyć inne komponenty
pProperties Zapewnia dostęp do właściwości (elementów ustawiających) walidatora
BOOL, IsValid(LPBSTR pMessage)

Ta metoda zwraca wartość PRAWDA, jeśli kontrolka jest prawidłowa, lub FAŁSZ, jeśli kontrolka jest nieprawidłowa. Po zwróceniu, pMessage powinien zostać wypełniony nowym BSTR zawierającym komunikat do wyświetlenia, gdy kontrolka jest nieprawidłowa.

HRESULT SetProperty(int propertyId, LPVARIANT pValue)

Tę metodę można wdrożyć, jeśli potrzebne są dodatkowe wartości, które nie są zawarte w pliku XML.

HRESULT SetProperty(int propertyId, IUnknown *pUnknown)

Tę metodę można wdrożyć, jeśli potrzebne są dodatkowe wartości, które nie są zawarte w pliku XML.

HRESULT SetProperty)(int propertyId, LPCTSTR pValue)

Tę metodę można wdrożyć, jeśli potrzebne są dodatkowe wartości, które nie są zawarte w pliku XML.

Interfejs IRegEx

__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(dane wejściowe LPCTSTR, wyrażenie regularne LPCTSTR)

Ta metoda uruchamia wyrażenie regularne względem tekstu wejściowego. Do wykonywania rzeczywistej pracy używa funkcji regex_match standardowej biblioteki języka C++. Metoda zwraca wartość PRAWDA, jeśli istnieją dopasowania, lub wartość FAŁSZ w przeciwnym razie.

HRESULT GetMatch(size_t indeks, LPBSTR pValue)

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

Interfejs ISummaryInfo

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

Nie musisz używać tego interfejsu bezpośrednio. Zamiast tego użyj 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 musisz używać tego interfejsu bezpośrednio. Zamiast tego użyj IFormController.

Interfejs ITSVariableBag

__interface ITSVariableBag : IUnknown
{
    void GetValue([in] LPCTSTR variableName, [out] LPBSTR pValue);
    void SetValue([in] LPCTSTR variableName, [in] LPCTSTR pValue);
    void Clear(void);
    HRESULT Remove([in] LPCTSTR variableName);
    HRESULT SuppressLogValue([in] LPCTSTR variableName);
    void Save(void);
};

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

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

Ta metoda odczytuje wartość zmiennej sekwencji zadań.

Uwaga

Wartości są buforowane po pierwszym odczycie.

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 Wyczyść(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 z pamięci określoną wartość sekwencji zadań. Następnym razem, gdy wywołasz funkcję GetValue z tą samą nazwą sekwencji zadań, metoda podejmie próbę pobrania jej z sekwencji zadań.

HRESULT SuppressLogValue([in] LPCTSTR variableName)

Za każdym razem, gdy zapisywane są 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 kody PIN, dla określonej zmiennej sekwencji zadań.

void Save(void)

Ta metoda zapisuje wszystkie wartości sekwencji zadań, które zostały ustawione za pomocą wywołań metody SetValue.

Interfejs ITSVariableRepository

__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 przeznaczony do użytku wewnętrznego przez TSVariableBag do odczytywania i zapisywania zmiennych sekwencji zadań.

Interfejs IWizardFinish

__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 pozycji Zakończ lub Anuluj w Kreatorze kodu UDI. Kreator UDI zawiera zadanie zakończenia , które zapisuje zmienne sekwencji zadań po wybraniu pozycji Zakończenie. W przypadku anulowania kreatora zadanie ustawia tylko zmienną sekwencji zadań OSDSetupWizCancelled na wartość TRUE i nie zapisuje zmian w żadnych innych zmiennych sekwencji zadań.

Jeśli tworzysz własny składnik wykończenia, musisz go zarejestrować za pomocą takiego kodu:

Register<MyFinishTaskFactory>(ID_MyFinishTask, pRegistry);

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

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

pService->Register(pFinish);

Interfejs IBindableList

__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 listy.

HRESULT GetCaption(size_t index, LPBSTR pCaption)

Ta metoda zwraca podpis elementu o określonym indeksie.

Interfejs IDataNodes

__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 pomocą metod w interfejsie ISettingsProperties , który jest dostępny dla strony za pośrednictwem metody Settings .

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 Settings()->GetDataNode(L"Network", &pData) daje 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 elementu DataItem .

HRESULT SetCaptionProperty(LPCTSTR captionProperty)

Składnik obsługujący ten interfejs obsługuje również element IBindableList, który ułatwia wypełnienie pola kombi danymi z pliku XML strony. Ta metoda określa, która właściwość (ustawiająca) w każdym elemencie DataItem będzie używana dla tego powiązania. Na przykład można wywołać tę metodę za pomocą DisplayName i użyje ona tej właściwości ustawiającej do powiązania danych. Pole kombi będzie wtedy zawierać elementy Publiczny i Zespół deweloperów .

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

Ta metoda pobiera właściwość z jednego z elementów DataItem . Patrz tabela 41 i tabela 42.

Tabela 41. DataItem GetProperty

Parametr Opis
Index (Indeks) Wartość indeksu (rozpoczynająca się od 0) elementu danych, dla którego chcesz pobrać wartość właściwości
propertyName (nazwa właściwości) Nazwa właściwości ustawiającej, dla której chcesz pobrać wartość
propertyValue (Wartość właściwości Wartość zwracana przez właściwość.

Tabela 42. HRESULT GetProperty

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

Ta metoda jest podobna do metody GetProperty, ale zamiast zwracać jedną wartość z elementu DataItem, zwraca cały element danych zapakowany w interfejs ISettingsProperties . Patrz tabela 43 i tabela 44.

Tabela 43. HRESULT GetNode

Parametr Opis
Indeks Wartość indeksu (rozpoczynająca się od 0) elementu danych, dla którego chcesz pobrać wartość właściwości
węzeł ppNode Przy wyjściu, ISettingsProperties interfejs, który otacza węzeł DataItem

Tabela 44. Wyniki HRESULT GetNode

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

Interfejs IFactoryRegistry

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

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

void Register (typ LPCTSTR, IClassFactory *pFactory)

Ta metoda rejestruje fabrykę klas w rejestrze. Patrz tabela 45.

Tabela 45. IClassFactory void Register

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

Ta metoda jest przeznaczona tylko do użytku wewnętrznego.

BOOL zawiera (typ LPCTSTR)

Ta metoda jest zazwyczaj przeznaczona 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 komponentu, bardziej wydajne jest odzyskanie fabryki, a następnie poproszenie jej o utworzenie instancji za Ciebie.

HRESULT CreateInstance(LPCTSTR type, IUnknown **ppInstance)

Ta metoda tworzy nową instancję składnika, biorąc pod uwagę jego typ. Zamiast tego użyj metody szablonu CreateInstance , która umożliwia tworzenie obiektów bezpiecznych dla typu.

HRESULT SetContainer(IWizardPageContainer *pContainer)

Ta metoda jest przeznaczona tylko do użytku wewnętrznego.

HRESULT RegisterService(REFGUID iid, IUnknown *pService)

Usługi to pojedyncze wystąpienia składnika, które mogą być używane w wielu miejscach. Za pomocą tej metody można zarejestrować usługę na jednej stronie, a następnie pobrać to samo wystąpienie 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 podanego w wierszu polecenia parametru /locale Kreatora UDI. Metoda zwraca jedną z następujących wartości:

  • Wartość identyfikatora języka podanego w parametrze wiersza polecenia /locale

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

Interfejs ILogger

__interface ILogger : IUnknown
{
    HRESULT Init(LPCWSTR logFilename);
    HRESULT MoveLog(LPCWSTR logFilename);
    HRESULT LogBase(EMessageType messageType, LPCTSTR component, SYSTEMTIME eventTime, LPCTSTR message);
    HRESULT Log(EMessageType messageType, LPCTSTR component, LPCTSTR message);
    HRESULT Error(HRESULT error, LPCTSTR component, LPCTSTR message);
    HRESULT Error2(HRESULT error, LPCTSTR component, LPCTSTR message, LPCTSTR message2);
    HRESULT Normal(LPCTSTR component, LPCTSTR message);
    HRESULT Normal2(LPCTSTR component, LPCTSTR message, LPCTSTR message2);
    HRESULT Verbose(LPCTSTR component, LPCTSTR message);
    HRESULT Verbose2(LPCTSTR component, LPCTSTR message, LPCTSTR message2);
    HRESULT Debug(LPCWSTR component, LPCWSTR message);
    HRESULT EnableDebug(BOOL debug);
    HRESULT Close(void);
    HRESULT GetLogFilename(LPBSTR pFilename);
};
Omówienie

Kreator kodów UDI rejestruje informacje w pliku dziennika, co ułatwia rozwiązywanie problemów znalezionych w polu. Warto zapisywać informacje w dzienniku na stronach. Możesz uzyskać wskaźnik do tego interfejsu z poziomu strony za pomocą metody Logger() strony. Wiersze w pliku dziennika zawierają numer "poziomu", który reprezentuje komunikaty o błędach, normalne, pełne informacje lub komunikaty debugowania.

Uwaga

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

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

Ta metoda jest przeznaczona tylko do użytku wewnętrznego.

Dziennik przenoszenia
HRESULT MoveLog(LPCWSTR logFilename)

Ta metoda jest przeznaczona tylko do użytku wewnętrznego.

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

Ta metoda jest przeznaczona tylko do użytku wewnętrznego.

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

Ta metoda jest przeznaczona 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. Patrz 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 liczba).
Składnik Ciąg, który identyfikuje źródło błędu, którym zazwyczaj jest Twoja strona lub napisany składnik
Komunikat Komunikat wyjaśniający, co spowodowało błąd
Błąd2
HRESULT Error2(HRESULT error, LPCTSTR component, LPCTSTR message, LPCTSTR message2)

Ta metoda jest podobna do metody Błąd , ale umożliwia dostarczenie dwuczęściowego komunikatu. Ostateczny komunikat będzie zawierał w pliku wyjściowym ciąg "message", a następnie ciąg "message2". Jest to po prostu wygodna metoda.

Normalny
HRESULT Normal(LPCTSTR component, LPCTSTR message)

Ta metoda powoduje zarejestrowanie zwykłego komunikatu. Aby zapoznać się z parametrami, zobacz opis metody błędu .

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

Ta metoda powoduje zarejestrowanie zwykłego komunikatu. Aby zapoznać się z parametrami, zobacz opis metody Error2 .

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

Ta metoda rejestruje pełny komunikat. Aby zapoznać się z parametrami, zobacz opis metody błędu .

Verbose2 (Pełne słowo2)
HRESULT Verbose2(LPCTSTR component, LPCTSTR message, LPCTSTR message2)

Ta metoda rejestruje pełny komunikat. Aby zapoznać się z parametrami, zobacz opis metody Error2 .

Debugowanie
HRESULT Debug(LPCWSTR component, LPCWSTR message)

Ta metoda rejestruje komunikat debugowania. Aby zapoznać się z parametrami, zobacz opis metody błędu . Komunikaty debugowania nie są zapisywane w pliku, chyba że są włączone. Aby uzyskać szczegółowe informacje, zobacz sekcję Omówienie.

Włączanie debugowania
HRESULT EnableDebug(BOOL debug)

Ta metoda jest przeznaczona tylko do użytku wewnętrznego.

Zamknij
HRESULT Close(void)

Ta metoda jest przeznaczona tylko do użytku wewnętrznego.

GetLogFilename (Nazwa plikuDziennika)
HRESULT GetLogFilename(LPBSTR pFilename)

Ta metoda pobiera nazwę pliku dziennika.

IOrientation Interface

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

ISettings Interface

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

__interface ISettingsProperties : IUnknown
{
    HRESULT GetAttribute(LPCTSTR attributeName, __out LPBSTR attributeValue);
    IStringProperties * Properties();
    HRESULT SelectNodes(LPCTSTR xPath, __out IXMLDOMNodeList **ppList);
    HRESULT SelectSingleNode(LPCTSTR xPath, __out IXMLDOMNode **ppNode);
    HRESULT GetDataNode(LPCTSTR name, __out ISettingsProperties **ppNode);
    HRESULT GetDataNodes(__out IDataNodes **ppNodes);
    HRESULT GetChildDataNodes(LPCTSTR childeName, __out IDataNodes **ppNodes);
};
Omówienie

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

HRESULT GetAttribute(LPCTSTR attributeName, LPBSTR attributeValue)

Metoda ta pozwala na pobieranie wartości atrybutów w węźle głównym, który jest węzłem Strona w przypadku korzystania z metody Settings() strony.

IStringProperties * Properties()

Ta metoda zapewnia dostęp do wartości właściwości ustawiających 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 za pomocą wyrażenia XPath. Jeśli możesz, lepiej skorzystać z jednej z pozostałych metod. Tej metody należy używać tylko wtedy, gdy nie można dotrzeć do węzłów w inny sposób.

HRESULT SelectSingleNode(LPCTSTR xPath, IXMLDOMNode **ppNode)

Wywołaj tę metodę, jeśli chcesz bezpośrednio pobrać pojedynczy węzeł XML za pomocą wyrażenia XPath. Jeśli możesz, lepiej skorzystać z jednej z pozostałych metod. Tej metody należy używać tylko wtedy, gdy nie można dotrzeć do węzła w inny sposób.

HRESULT GetDataNode(Nazwa LPCTSTR, ISettingsProperties **ppNode)

Pobierz element danych na podstawie atrybutu Name tego elementu.

HRESULT GetDataNodes(IDataNodes **ppNodes)

Ta metoda pobiera listę elementów elementu danych w bieżącym węźle. Z poziomu strony wywołaj węzeł GetDataNode , aby pobrać interfejs ISettingsProperty dla danych. Następnie w tym wystąpieniu wywołaj metodę 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 na uzyskanie dostępu do zestawu węzłów elementu DataItem w określonym węźle danych . Używając języka XML z przykładu GetDataNodes , poniższy kod wykonuje dokładnie to samo, co cztery wiersze kodu w przykładzie w obszarze GetDataNodes , ale ze sprawdzaniem błędów:

ISimpleStringProperties Interface

ISimpleStringProperties Interface

__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 sytuacjach, gdy musisz przekazać zestaw właściwości do innego składnika, takiego jak zadanie, ale chcesz dodać wartości programowo, zamiast używać wartości z języka XML. Oto przykład, w jaki sposób można użyć 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 ustawiających pochodzących z języka XML. Ten interfejs jest dostępny dla właściwości strony za pomocą Settings()->Properties().

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

Ta metoda pobiera pojedynczą wartość właściwości. Patrz tabela 47 i tabela 48.

Tabela 47. IHRESULT Get Property Value

Parametr Opis
propertyName (nazwa właściwości) Nazwa właściwości, która ma zostać odczytana
pPropValue Przy wyjściu zawiera wartość właściwości w postaci ciągu znaków (ta wartość będzie miała 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 Wartość właściwości jest pobierana.
E_INVALIDARG Nie ma żadnej właściwości o podanej nazwie.

Interfejs ITaskManager

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

    HRESULT Start(void);

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

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

Interfejs ten jest implementowany przez składnik TaskManager (ID_TaskManager w pliku ITaskManager.h), który jest składnikiem, który uruchamia zadania na stronie inspekcji wstępnej. Możesz albo korzystać ze strony inspekcji wstępnej bezpośrednio, co jest najczęściej wykonywane, lub zbudować własną stronę, pozwalając temu komponentowi wykonać większość pracy.

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

Tę metodę należy wywołać przed wywołaniem jakiejkolwiek innej metody. Inicjuje składnik TaskManager . Patrz tabela 49.

Tabela 49. HRESULT Init

Parametr Opis
pPageView Umożliwia uzyskanie dostępu do strony, na której będą wykonywane zadania (Ta strona musi zawierać określony zestaw kontrolek opisanych w kilku następnych parametrach).
idListView (Widok listy identyfikatorów) Identyfikator kontrolki ListView , która służy do wyświetlania listy zadań i stanu tych zadań
idMessage (Wiadomość identyfikatora) Identyfikator kontrolki pola tekstowego, która będzie używana do wyświetlania komunikatu dotyczącego wybranego zadania
Przycisk idRetryButton Identyfikator kontrolki przycisku, który można wybrać w celu ponownego uruchomienia zadań
pPageInfo Otoka wokół kodu XML strony (Menedżer zadań ładuje zestaw zadań do uruchamiania z tego kodu XML).
pWywołanie zwrotne 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 zakończy działanie).
HRESULT SetFailMessage(LPCWSTR message)

Ta metoda określa komunikat wyświetlany w przypadku niepowodzenia co najmniej jednego zadania.

HRESULT Start(void)

Ta metoda rozpoczyna wszystkie zadania. Każde zadanie rozpoczyna się w osobnym wątku.

HRESULT GetTaskMessage(size_t index, LPBSTR message)

Ta metoda jest przeznaczona tylko do użytku wewnętrznego. Pobiera bieżącą wiadomość dla zadania na podstawie jego indeksu na liście zadań.

HRESULT GetResultType)(indeks size_t, typ LPBSTR)

Ta metoda pobiera bieżący "typ" dla zadania. W tabeli 50 przedstawiono dostępne typy.

Tabela 50. HRESULT GetResultType

Type Opis
0 Reprezentuje zadanie, które zakończyło się powodzeniem
1 Reprezentuje zadanie, które zwróciło ostrzeżenie
-1 Oznacza zadanie zakończone niepowodzeniem

Typ jest pobierany przez sprawdzenie kodu zakończenia lub błędu zadania i znalezienie dopasowania w elemencie XML ExitCodes> zadania<.

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

Ta metoda jest używana przez strony postępu i inspekcji wstępnej do pobierania właściwości ustawiającej BitmapFilename, aby mogła wyświetlić obraz obok komunikatu o zaznaczonym zadaniu. Innymi słowy można dodać niestandardową funkcję ustawiającą do kodu XML zadania, a następnie pobrać ją 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 metodę GetProperty ) do wyświetlenia dla wybranego zadania. Ta metoda jest stosowana na stronach postępu i inspekcji wstępnej w celu wyświetlenia obrazu wybranego zadania.

HRESULT Wait(DWORD waitMilliseconds)

Ta metoda pomaga głównie w testach jednostkowych, więc test może zapewnić, że zadania zakończą się przed zakończeniem testu jednostkowego. Normalnie nie wywołałbyś tej metody. Funkcja jest zwracana po zakończeniu działania wszystkich zadań lub po upływie czasu 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ń obecnie oznaczonych jako ostrzeżenie.

size_t SucceedCount(void)

Ta metoda zwraca liczbę zadań obecnie oznaczonych jako zakończone pomyślnie.

size_t RunningCount(void)

Ta metoda zwraca liczbę aktualnie uruchomionych zadań.

void OnCommonControlEvent(WORD controlId, LPNMHDR pInfo)

Wywołaj tę metodę z OnCommonControlEvent strony, aby TaskManager mógł przetworzyć potrzebne zdarzenia.

void OnControlEvent(WORD eventId, WORD controlId)

Wywołaj tę metodę z elementu OnControlEvent strony, aby TaskManager mógł przetwarzać potrzebne zdarzenia.

void EnableButtons(BOOL enable)

Ta metoda jest przeznaczona tylko do użytku wewnętrznego.

Interfejs IWizardComponent

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

Zazwyczaj nie implementuje się tego interfejsu bezpośrednio, ale za pośrednictwem klasy szablonu WizardComponent . 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ć.

Interfejs IWizardDialogController

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

__interface IWizardDialogView : IUnknown
{
    HRESULT LoadBannerImage(LPCTSTR bannerFilename);
    HRESULT LoadPage(LPCTSTR pageType, ISettingsProperties *pPageSettings, IWizardPageView **view);
    HRESULT SetEnable(WizardButtons button, BOOL enable);
    HRESULT Focus(WizardButtons button);
    void EnableFinish(BOOL isFinish);
    void Exit(int exitCode);
    void ShowWarningMessage(LPCTSTR message);
    void HideWarningMessage(void);
    void SetTitle(LPCTSTR title);
    void SetPageTitle(LPCTSTR title);
    int ShowMessageBox(LPCTSTR message, LPCTSTR lpCaption, UINT uType);
    HWND GetHwnd(void);
    void UpdateFocus(void);
};

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

Interfejs IWizardPage

__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 WizardPageImpl, więc zazwyczaj nie trzeba go implementować samodzielnie. Wszystkie te metody są wywoływane przez kreatora podczas interakcji ze stronami niestandardowymi.

IWizardPageContainer Interface

__interface IWizardPageContainer : IUnknown
{
    ILogger * Logger(void);
    IPropertyBag * Properties(void);
    HRESULT CreateInstance(LPCTSTR type, [out] IUnknown **ppInstance);
    HRESULT GetService(REFIID iid, [out] IUnknown **ppInstance);
    HRESULT ReplaceVariables(LPCTSTR source, [out] LPBSTR pDest);
    HRESULT GotoPage(LPCTSTR pageName);
    int ShowMessageBox(LPCTSTR message, LPCTSTR lpCaption, UINT uType);
    BOOL InPreview(void);
    HWND GetHwnd(void);
};
Omówienie

Interfejs ten jest dostępny dla Twojej strony za pośrednictwem metody Container (zaimplementowanej 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 * Właściwości (nieważne)

Ta metoda zapewnia dostęp do zmiennych "pamięci", czyli właściwości znajdujących się w pamięci tylko wtedy, gdy jest uruchomiony Kreator UDI. Te właściwości są dostępne dla innych stron w kodzie lub w pliku XML przy użyciu składni $memoryVarName$ .

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

Ta metoda umożliwia utworzenie nowej instancji dowolnego zarejestrowanego składnika. Lepiej jednak używać funkcji szablonu CreateInstance, ponieważ jest ona silnie wpisana.

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

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

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

Ta metoda obsługuje pracę ze zmiennymi wewnątrz wartości ciągów. Obsługuje ona formaty przedstawione 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).
%Nazwa% Zmienna sekwencji zadań lub zmienna środowiskowa. Kolejność jest następująca:

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

Tabela 52. Parametr HRESULT

Parametr Opis
Źródło Ciąg wejściowy $ , który może zawierać dowolną kombinację zmiennych lub % nie zawierać żadnych zmiennych
pDest powiedział: Po zwróceniu zawiera nowy ciąg, który zawiera wszystkie tokeny zamienione zgodnie z tabelą 51
HRESULT GotoPage(LPCTSTR pageName)

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

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

Ta metoda powoduje wyświetlenie okna komunikatu z podanym tekstem i podpisem. Parametrem uType jest dowolna wartość, którą można dostarczyć do funkcji MessageBox Win32.

BOOL InPreview(void)

Ta metoda zwraca wartość TRUE, jeśli kreator został uruchomiony w trybie podglądu przez podanie przełącznika /preview . W trybie podglądu przycisk Dalej nigdy nie jest wyłączony. Ta metoda pozwala na pominięcie kodu w trybie podglądu, który może na przykład powodować problemy, jeśli na stronie nie ma prawidłowych danych.

HWND GetHwnd(puste)

Ta metoda zwraca HWND dla głównego okna dialogowego. Z tej metody należy korzystać ostrożnie. Ogólnie rzecz biorąc, interfejs programowania aplikacji UDI Wizard został zaprojektowany w taki sposób, aby nigdy nie pracować bezpośrednio z klamkami okiennymi.

Interfejs IWizardPageView

__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 (zaimplementowanej przez WizardPageImpl).

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

Kreator kodu UDI używa otejki, która w rzeczywistości jest fasadą do interakcji z kontrolkami na stronie. Użycie tych fasad zamiast rzeczywistych kontrolek znacznie ułatwia pisanie testów dla strony, ponieważ można dostarczyć 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(puste)

Ta metoda zwraca uchwyt okna dla strony. Ogólnie rzecz biorąc, dostęp do tej klamki nie powinien być potrzebny.

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 jest przeznaczona tylko do użytku wewnętrznego.

HRESULT Hide(void)

Ta metoda jest przeznaczona tylko do użytku wewnętrznego.

HRESULT Focus(int itemId)

Ustawianie fokusu wejściowego na określoną kontrolkę.

IWizardPage * Page(void)

Ta metoda jest przeznaczona tylko do użytku wewnętrznego.

IFormController * Form(void)

Ta metoda jest przeznaczona tylko do użytku wewnętrznego.

HRESULT FocusWizardButton (przycisk WizardButtons)

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

HRESULT SetEnable(WizardButtons button, BOOL enable)

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

void ShowWarningMessage(LPCTSTR message)

Ta metoda powoduje wyświetlanie komunikatu ostrzegawczego u dołu obszaru zawartości strony. Może to być dowolny tekst.

void HideWarningMessage(void)

Ukrywanie komunikatu ostrzegawczego wyświetlonego przy wywołaniu funkcji ShowWarningMessage.

Interfejs IXmlDocument

__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

Interfejs ten jest implementowany przez komponent ID_IXmlDocument , który jest fasadą zaprojektowaną w celu ułatwienia pracy z dokumentami XML w języku C++.

HRESULT Load(LPCTSTR filename)

Ta metoda pozwala załadować dokument XML z pliku zewnętrznego. Funkcja zwraca S_OK , jeśli plik został załadowany bez błędów, lub S_FALSE , jeśli wystąpił błąd. Gdy wystąpi błąd, możesz go wyświetlić, wywołując metodę GetParseErrorMessage.

HRESULT LoadXml(LPCTSTR xml)

Ta metoda powoduje załadowanie dokumentu XML z ciągu, a nie z pliku zewnętrznego. Poza źródłem odczytu kodu XML zachowanie metody jest takie samo jak w przypadku metody ładowania .

HRESULT Save(LPCWSTR filename)

Ta metoda zapisuje dokument XML znajdujący się w pamięci w pliku zewnętrznym.

HRESULT GetParseErrorMessage(LPBSTR pMessage)

Ta metoda zwraca nowy ciąg znaków z komunikatem o błędzie podczas ładowania dokumentu XML, jeśli taki występuje. Zawsze zwraca S_OK.

HRESULT SelectNodes(LPCTSTR xpath, IXMLDOMNodeList **ppNodes)

Ta metoda umożliwia pobranie kolekcji węzłów z dokumentu za pomocą wyrażenia XPath. Zawsze zwraca S_OK.

HRESULT SelectSingleNode(LPCTSTR xpath, IXMLDOMNode **ppNode)

Ta metoda umożliwia pobranie jednego węzła z dokumentu za pomocą wyrażenia XPath. Zawsze zwraca S_OK.

HRESULT AddSchema(LPCTSTR nazwa_pliku, LPCTSTR ns)

Ta metoda dodaje nazwę pliku schematu zewnętrznego, który będzie używany do sprawdzania poprawności schematu dokumentu XML po załadowaniu. Podana przestrzeń nazw jest ciągiem, którego można używać w zapytaniach XPath, chociaż nie zostało to przetestowane.

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

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

Tabela 53. HRESULT AddAttribute

Parametr Opis
pNode 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żna dodać go jako element podrzędny do innego węzła, wywołując metodę appendChild elementu nadrzędnego.

Funkcje pomocnicze

Funkcja szablonu CreateInstance

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

Ta funkcja jest zdefiniowana w pliku IWizardPageContainer.h i zapewnia bezpieczną otokę nad metodą 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.

Funkcja szablonu GetService

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

Ta funkcja jest zdefiniowana w pliku IWizardPageContainer.h i zapewnia bezpieczną otokę 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 ITSVariableBag zamiast tego można użyć metody TSVariables klasy WizardPageImpl ).

UDI Wizard Designer Configuration File Diagram Reference

Ten plik jest używany przez narzędzie UDI Wizard Designer. Dla każdego niestandardowego pliku .dll tworzony jest osobny plik, który może zawierać niestandardowe edytory stron kreatora, niestandardowe zadania lub niestandardowe walidatory. Plik musi kończyć się.config i znajdować się w folderze installation_folder\Bin\Config (gdzie installation_folder jest folderem , w którym zainstalowano zestaw MDT).

Tabela 54 zawiera listę elementów w pliku konfiguracyjnym UDI Wizard Designer i ich opisy. Element DesignerConfig jest węzłem głównym dla tego odwołania.

Tabela 54. Elementy w pliku konfiguracyjnym UDI Wizard Designer i ich opisy

Nazwa elementu Opis
DesignerConfig Określa katalog główny dla wszystkich pozostałych elementów
DesignerMappings (Mapy projektantów) Grupuje zestaw elementów strony
Strona Określa edytor stron kreatora do załadowania do narzędzia UDI Wizard Designer, który służy do edytowania ustawień konfiguracji strony kreatora
Parametr Określa parametr, który jest przekazywany do elementu nadrzędnego Task lub Validator i odpowiada elementowi Setter w pliku konfiguracyjnym UDI Wizard Uwaga: Atrybuty tego elementu są różne, jeśli element nadrzędny jest elementem Task lub Validator .
Zadanie Określa zadanie w bibliotece zadań
Element zadania Określa grupę parametrów przekazywanych do zadania
Biblioteka zadań Grupuje zestaw elementów zadania
Walidator Określa weryfikator w bibliotece weryfikatora
Biblioteka walidatora Grupuje zestaw elementów 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ń Po pierwsze: ten element jest wymagany.
Elementy nadrzędne Brak
Spis treści DesignerMappings, BibliotekaZadań, BibliotekaWalidatorów
Atrybuty elementów

Ten element nie ma atrybutów.

Uwagi

Żaden.

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

DesignerMappings (Mapy projektantów)

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 bibliotece DLL odpowiadającej temu plikowi konfiguracji UDI Wizard Designer nie ma niestandardowej strony kreatora).
Elementy nadrzędne DesignerConfig
Spis treści Strona
Atrybuty elementów

Ten element nie ma atrybutów.

Uwagi

Żaden.

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 do UDI Wizard Designer, który z kolei służy 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 (Mapy projektantów)
Spis treści Poprawnie sformułowana zawartość XML
Atrybuty elementów

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

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

Atrybut Opis
Opis Określa tekst dostarczający informacji o parametrze, który jest wyświetlany w narzędziu UDI Wizard Designer
DesignerAssembly 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 MDT).
DesignerType (TypProjektanta) 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 programu Microsoft .NET).
DisplayName (Nazwa wyświetlana) Określa przyjazną dla użytkownika nazwę edytora strony, która jest wyświetlana w narzędziu UDI Wizard Designer
Biblioteka 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 zestaw MDT, a platforma to x86 w przypadku wersji 32-bitowej lub x64 w przypadku 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ę zestawu MDT, upewnij się, że używasz 32-bitowej biblioteki DLL dla strony kreatora.
Obraz Określa nazwę obrazu strony w formacie PNG (Portable Network Graphics) (plik .png musi istnieć w folderze installation_folder\Bin\Images (gdzie installation_folder jest folderem , w którym zainstalowano zestaw MDT).
Type Określa edytor stron kreatora i musi być zgodny z nazwą użytą podczas rejestrowania strony niestandardowej
Uwagi

Kreator UDI Wizard Designer używa elementu Page jak szablonu do utworzenia początkowego kodu XML dla nowego kreatora. Kreator UDI Wizard Designer sprawdza poprawność schematu, aby upewnić się, że elementy strony i elementy podrzędne mają prawidłowy format. Ten element zapewnia mapowanie między typem strony Kreator UDI a informacjami potrzebnymi Kreatorowi UDI Designer do edycji i tworzenia stron tego typu za pomocą niestandardowego edytora stron.

Przykład

Żaden.

Parametr

Ten element określa parametr, który jest przekazywany do elementu nadrzędnego Task lub Validator i odpowiada elementowi Setter w pliku konfiguracyjnym Kreatora UDI.

Uwaga

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

Informacje o elemencie

Tabela 59 zawiera informacje o elemencie Param .

Tabela 59. Informacje o elemencie parametru

Atrybut Wartość
Liczba wystąpień Co najmniej jeden element dla każdego elementu nadrzędnego elementu zadania lub weryfikatora
Elementy nadrzędne Element zadania, weryfikator
Spis treści Poprawnie sformułowana zawartość XML
Atrybuty elementów

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

Tabela 60. Atrybuty i odpowiadające im wartości elementu Param

Atrybut Opis
Opis Określa tekst dostarczający informacji o parametrze, który jest wyświetlany w narzędziu UDI Wizard Designer Uwaga: Ten atrybut jest prawidłowy tylko dla elementu Validator.
DisplayName (Nazwa wyświetlana) Określa przyjazną dla użytkownika nazwę parametru walidatora, która jest wyświetlana dla odpowiedniej strony Kreatora UDI w UDI Wizard Designer (Ta nazwa jest zwykle bardziej opisowa niż atrybut Name). Uwaga: Ten atrybut jest prawidłowy tylko dla elementu Validator.
Nazwa Określa nazwę parametru, który jest przekazywany do zadania lub walidatora, w zależności od elementu nadrzędnego (Ten atrybut stanie się atrybutem Property w elemencie Setter w pliku konfiguracyjnym Kreatora UDI). Uwaga: Ten parametr jest używany zarówno dla elementów nadrzędnych elementu TaskItem , jak i walidatora .
Uwagi

Żaden.

Przykład

Żaden.

Zadanie

Ten element określa zadanie w bibliotece zadań.

Informacje o elemencie

Tabela 61 zawiera informacje o elemencie Zadanie .

Tabela 61. Informacje o elemencie zadania

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

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

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

Atrybut Opis
Opis Określa tekst dostarczający informacji o zadaniu, który jest wyświetlany w narzędziu UDI Wizard Designer
Biblioteka 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 zestaw 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 oraz w narzędziu UDI Wizard Designer
Type Określa typ zadania, który jest zarejestrowany w rejestrze fabrycznym i używany do wywoływania określonego zadania w pliku .dll
Uwagi

Żaden.

Przykład

Żaden.

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

Atrybut Wartość
Liczba wystąpień Co najmniej jeden dla każdego elementu zadania
Elementy nadrzędne Zadanie
Spis treści Parametr
Atrybuty elementów

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

Tabela 64. Atrybut i odpowiadające mu wartości elementu TaskItem

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

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 drugi element podrzędny Param z atrybutem Name ustawionym na Dest)
- Funkcja ustawiająca, która wymaga jednego elementu podrzędnego Param
Uwagi

Żaden.

Przykład

Żaden.

Biblioteka zadań

Ten element grupuje zestaw elementów zadania .

Informacje o elemencie

Tabela 65 zawiera informacje o elemencie TaskLibrary .

Tabela 65. Informacje o elemencie biblioteki zadań

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

Ten element nie ma atrybutów.

Uwagi

Żaden.

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>

Walidator

Ten element określa walidator w bibliotece walidatorów.

Informacje o elemencie

Tabela 66 zawiera informacje o elemencie walidatora .

Tabela 66. Informacje o elemencie walidatora

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

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

Tabela 67. Atrybuty i odpowiadające im wartości elementu walidatora

Atrybut Opis
Opis Określa tekst dostarczający informacji o weryfikatorze, który jest wyświetlany w narzędziu UDI Wizard Designer
DisplayName (Nazwa wyświetlana) Określa przyjazną dla użytkownika nazwę walidatora wyświetlaną w UDI Wizard Designer (Ta nazwa jest zwykle bardziej opisowa niż atrybut Name).
Biblioteka DLL Określa nazwę pliku .dll skojarzonego z weryfikatorem (plik .dll musi istnieć w folderze installation_folder\Templates\Distribution\Tools\platform (gdzie installation_folder jest folderem , w którym zainstalowano zestaw MDT, a platforma to x86 dla wersji 32-bitowej lub x64 dla wersji 64-bitowej).
Nazwa Określa nazwę walidatora, która jest wyświetlana na odpowiedniej stronie Kreatora UDI oraz w narzędziu UDI Wizard Designer
Type Określa typ weryfikatora, który jest rejestrowany przez czynnik rejestru i używany do wywoływania określonego weryfikatora w pliku .dll
Uwagi

Żaden.

Przykład

Żaden.

Biblioteka walidatora

Ten element grupuje zestaw elementów walidatora .

Informacje o elemencie

Tabela 68 zawiera informacje o elemencie ValidatorLibrary .

Tabela 68. Informacje o elemencie ValidatorLibrary

Atrybut Wartość
Liczba wystąpień Zero lub jeden w elemencie DesignerConfig (Ten element jest opcjonalny, jeśli w bibliotece DLL nie ma niestandardowych modułów sprawdzania poprawności odpowiadających temu plikowi konfiguracyjnemu UDI Wizard Designer).
Elementy nadrzędne DesignerConfig
Spis treści Walidator
Atrybuty elementów

Ten element nie ma atrybutów.

Uwagi

Żaden.

Przykład

<DesignerConfig> + <TaskLibrary> - <ValidatorLibrary> +<Validator DLL="" Description="Wymaga tekstu w polu" Type="Microsoft.Wizard.Validation.NonEmpty" Name="NonEmpty"> +<Validator DLL="" Description="Nie zezwala na pewne znaki w polu" Type="Microsoft.Wizard.Validation.InvalidChars" Name="InvalidChars"> +<Validator DLL="" Description="Musi być zgodny ze wstępnie zdefiniowanym wzorcem" Type="Microsoft.Wizard.Validation.RegEx" Name=" NamedPattern"> +<Validator DLL="" Description="Wymagaj, aby zawartość była zgodna z wyrażeniem regularnym" Type="Microsoft.Wizard.Validation.RegEx" Name="RegEx"></ValidatorLibrary> + <DesignerMappings></DesignerConfig>

Dokumentacja UDI Wizard Designer

Sterowanie

Kontrolki używane do tworzenia niestandardowych edytorów stron kreatora do użycia w UDI Wizard Designer to wystąpienia kontrolki użytkownika WPF. W tabeli 69 wymieniono kontrolki, za pomocą których można tworzyć niestandardowe edytory stron kreatora.

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

Sterowanie Opis
KolekcjaTControl Ta kontrolka służy do edytowania danych przechowywanych w elemencie Dane w elemencie Page .
PoleElementControl Ta kontrolka służy do edytowania pola, które jest zwykle połączone z kontrolką TextBox na stronie .xaml.
Kontrolka ustawiająca Ta kontrolka służy do modyfikowania wartości elementu ustawiającego w pliku konfiguracyjnym Kreatora UDI.

KolekcjaTControl

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

PoleElementControl

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 konfigurowania wartości domyślnej pola na stronie kreatora za pomocą 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 (Dane pól)

Ta właściwość ciągu zawiera informacje umożliwiające połączenie kontrolki 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 nazywa się ControlRoot i jest określony w parametrze ElementName . Powiązanie jest wykonywane z właściwością DataContext.Location interfejsu edytora strony ControlRoot . DataContext to model widoku, który wskazuje element Page w pliku konfiguracyjnym Kreatora UDI. Lokalizacja jest właściwością widoku, który zwraca listę możliwych lokalizacji i jest zdefiniowany przez element Dane w pliku konfiguracyjnym Kreatora UDI. Każda lokalizacja jest definiowana przez element DataItem w pliku konfiguracyjnym kreatora UDI.

HeaderText (Tekst nagłówka)

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

InstructionText (Tekst instrukcji)

Ta właściwość ciągu umożliwia określenie tekstu informacyjnego dla kontrolki PoleElementControl . Zazwyczaj tekst jest używany do krótkiego opisu pola oraz wyjaśnienia, jak konfiguracja pola wpłynie na odpowiednią stronę kreatora.

HideEnableButton (UkryjEnableButton)

Ta właściwość logiczna pozwala kontrolować widoczność przycisku, który zmienia stan między odblokowanym a zablokowanym (włączonym lub wyłączonym). Jeśli ustawiono na:

  • To prawda, że przycisk nie jest widoczny

  • Fałsz, przycisk jest widoczny (jest to wartość domyślna).

HideDefaultTab

Ta właściwość logiczna umożliwia sterowanie widocznością sekcji zawierającej kontrolkę służącą do ustawiania wartości domyślnej. Mimo że ta właściwość odwołuje się do karty, w kontrolce FieldElementControl nie ma karty, a raczej sekcja, którą można ukryć. Jeśli ustawiono na:

  • To prawda, że sekcja nie jest widoczna

  • Fałsz, sekcja jest widoczna (jest to wartość domyślna).

HideBorder (UkryjObramowanie)

Ta właściwość logiczna umożliwia sterowanie widocznością obramowania wokół kontrolki pola. Jeśli ustawiono na:

  • To prawda, że obramowanie nie jest widoczne

  • Fałsz, obramowanie jest widoczne (jest to wartość domyślna).

Ukryj obraz

Ta właściwość logiczna umożliwia sterowanie widocznością obrazu konfigurowaną przez właściwość FieldImageSource . Jeśli ustawiono na:

  • To prawda, że obraz nie jest widoczny

  • Fałsz, obraz jest widoczny (jest to wartość domyślna).

HideValidationTab (UkryjKartę sprawdzania poprawności)

Ta właściwość logiczna pozwala kontrolować widoczność sekcji, w której zarządzana jest lista walidatorów. Mimo że ta właściwość odwołuje się do karty, w kontrolce FieldElementControl nie ma karty, a raczej sekcja, którą można ukryć. Jeśli ustawiono na:

  • To prawda, że sekcja nie jest widoczna

  • Fałsz, sekcja jest widoczna (jest to wartość domyślna).

HideSummaryTab

Ta właściwość logiczna umożliwia sterowanie widocznością sekcji, w której jest konfigurowany podpis podsumowania pola. Podpis i odpowiadająca mu wartość pola są wyświetlane na typie strony kreatora Strona podsumowania w przepływie etapowym. Mimo że ta właściwość odwołuje się do karty, w kontrolce FieldElementControl nie ma karty, a raczej sekcja, którą można ukryć. Jeśli ustawiono na:

  • To prawda, że sekcja nie jest widoczna

  • Fałsz, sekcja jest widoczna (jest to wartość domyślna).

HideTaskSequenceTab

Ta właściwość logiczna umożliwia sterowanie widocznością sekcji, w której konfigurujesz zmienną sekwencji zadań odpowiadającą temu polu. Mimo że ta właściwość odwołuje się do karty, w kontrolce FieldElementControl nie ma karty, a raczej sekcja, którą można ukryć. Jeśli ustawiono na:

  • To prawda, że sekcja nie jest widoczna

  • Fałsz, sekcja jest widoczna (jest to wartość domyślna).

Kontrolka ustawiająca

Ta kontrolka służy do modyfikowania wartości elementu Setter w pliku konfiguracyjnym Kreatora UDI. Ta kontrolka zawiera kontrolkę podrzędną służącą do modyfikowania wartości elementu ustawiającego .

Przykład

Poniższy fragment pliku .xaml ilustruje użycie kontrolki SetterControl do modyfikowania elementu Setter o nazwie KeyLocationSetter za pomocą 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
Dane ustawiające

Musisz powiązać to z właściwością widoku lub modelu widoku, która łączy się z ustawiającą. Jest to podobne do sposobu powiązania z polem, zgodnie z opisem dla kontrolki FieldElementControl.

HeaderText (Tekst nagłówka)

Ta właściwość umożliwia ustawienie tekstu, który będzie wyświetlany w nagłówku kontrolki. Pomyśl o tej właściwości jako o tytule kontrolki; Domyślnie jest on wyświetlany jako pogrubiony, pomarańczowy tekst.

InstructionText (Tekst instrukcji)

Ustaw tę właściwość na tekst, który ma być wyświetlany poniżej nagłówka — zwykle jest to tekst instrukcji informujący użytkownika edytora niestandardowego, kiedy i dlaczego chce zmodyfikować zachowanie pola.

Interfejsy

W tabeli 70 wymieniono interfejsy, za pomocą których można tworzyć niestandardowe edytory stron kreatora.

Tabela 70. Interfejsy, za pomocą których można tworzyć niestandardowe edytory stron kreatora

Berło Opis
IDataService Ten interfejs służy do łączenia pól z elementami danych w pliku konfiguracyjnym Kreatora kodu UDI.
IMessageBoxService Ten interfejs zapewnia dostęp do metod wyświetlania okien komunikatów.

IDataService

Ten interfejs zawiera kilka właściwości i metod, ale potrzebna jest tylko jedna właściwość. Jest to jedyna udokumentowana tutaj właściwość.

Możesz użyć wstrzykiwania zależności, aby uzyskać wskaźnik do tego interfejsu za pomocą 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 usługi IDataService .

Tabela 71. Właściwości interfejsu usługi IDataService

Berło Opis
CurrentPage (Bieżąca strona) Ta właściwość zapewnia dostęp do elementów, atrybutów i wartości XML poniżej kontekstu bieżącej strony edytowanej w pliku konfiguracyjnym Kreatora UDI
CurrentPage (Bieżąca strona)
XElement CurrentPage { get; set; }

Ta właściwość umożliwia uzyskanie dostępu do pliku XML bieżącej strony. Nigdy nie należy ustawiać tej właściwości, ale można dowolnie modyfikować kod XML strony. Przykładowy edytor stron z przykładami modyfikowania pliku XML. Ta właściwość jest używana przede wszystkim w przypadku danych niestandardowych. W przypadku pól i właściwości (ustawiających) możesz użyć wstępnie utworzonych kontrolek, które zadbają o wszystkie szczegóły.

IMessageBoxService

Ten interfejs zapewnia dostęp do metod wyświetlania okien komunikatów. Być może zastanawiasz się, po co Ci interfejs do wyświetlania okna komunikatu. Rzeczywistość jest taka, że nie: Microsoft używa tego interfejsu w kodzie, ponieważ pomaga on w pisaniu automatycznych testów dla stron projektanta.

Korzystanie z tych metod ma jednak jedną użyteczną korzyść: okna dialogowe zawsze mają "właściciela" ustawionego na Kreatora UDI, co zapewnia, że okno dialogowe jest poprawnie zgrupowane z oknem głównym.

Możesz użyć wstrzykiwania zależności, aby uzyskać wskaźnik do tego interfejsu za pomocą kodu takiego jak ten w klasie:

[Dependency]
public IMessageBoxService MessageBoxes { get; set; }
Metody

Tabela 72 zawiera listę metod interfejsu IMessageBoxService .

Tabela 72. Metody dla interfejsu IMessageBoxService

Metoda Opis
ShowMessageBox (Pole wiadomości ShowMessageBox) Ta przeciążona metoda służy do wyświetlania okna komunikatu z następującymi elementami:

- ShowMessageBox(String message, String podpis, MessageBoxImage icon)
- ShowMessageBox(wiadomość ciągowa, podpis ciągu, przycisk MessageBoxButton, ikona MessageBoxImage)
- ShowMessageBox(wyjątek wyjątku)
ShowDialogWindow (Pokaż okno dialogowe) Ta metoda umożliwia utworzenie nowego okna dialogowego.
ShowWizardWindow (Pokaż okno kreatora) Ta metoda służy do wyświetlania edytora niestandardowego w oknie dialogowym, które zawiera przyciski Dalej i Wstecz służące do nawigacji.
ShowMessageBox (Pole wiadomości ShowMessageBox)

Ta metoda powoduje wyświetlenie okna komunikatu, które jest polem podrzędnym edytora stron kreatora niestandardowego. Ten element jest przeciążony: Tabela 73 zawiera listę członków i krótki opis każdego z nich. Aby uzyskać pełne informacje o każdym elemencie (w tym składnię, użycie i przykłady), zobacz sekcję odpowiadającą poszczególnym elementom.

Tabela 73. Przeciążone elementy członkowskie metody ShowMessagBox

Członek zespołu Opis
ShowMessageBox(String message, String podpis, MessageBoxImage icon) Wyświetla okno komunikatu z ikoną i przyciskiem OK
ShowMessageBox(wiadomość ciągowa, podpis ciągu, 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 z informacją o wyjątku i przyciskiem OK
ShowMessageBox(String message, String podpis, MessageBoxImage icon)
void ShowMessageBox(String message, String caption, MessageBoxImage icon);

Ta metoda powoduje wyświetlenie okna komunikatu z przyciskiem OK . Patrz tabela 74.

Tabela 74. Parametry metody ShowMessageBox(String message, String podpis, MessageBoxImage icon)

Parametr Opis
Wiadomość Komunikat wyświetlany w obszarze zawartości okna komunikatu
podpis Tekst, który ma być wyświetlany na pasku tytułu okna dialogowego
Ikona Typ ikony wyświetlanej w oknie wiadomości
ShowMessageBox(wiadomość ciągowa, podpis ciągu, przycisk MessageBoxButton, ikona MessageBoxImage)
MessageBoxResult ShowMessageBox(string message, string caption, MessageBoxButton button, MessageBoxImage icon);

Ta metoda powoduje wyświetlenie okna komunikatu z zestawem przycisków, które mają być wyświetlane, oraz informację, który przycisk został wybrany. Patrz tabela 75.

Tabela 75. Parametry metody ShowMessageBox(wiadomość ciągowa, podpis ciągu, przycisk MessageBoxButton, ikona MessageBoxImage)

Parametr Opis
Wiadomość Komunikat wyświetlany w obszarze zawartości okna komunikatu
podpis Tekst, który ma być wyświetlany na pasku tytułu okna dialogowego
Przycisk Które przyciski mają być wyświetlane
Ikona Typ ikony wyświetlanej w oknie wiadomości
ShowMessageBox(wyjątek wyjątku)
void ShowMessageBox(Exception exception);

Ta metoda powoduje wyświetlenie okna komunikatu z informacją o wyjątku. W tym oknie komunikatu znajduje się jeden przycisk OK . Patrz 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 użyto wyjątku. wiadomość jako zawartość).
ShowDialogWindow (Pokaż okno dialogowe)
void ShowDialogWindow(Type viewType, DialogInteraction dialogPayload);

Ta metoda tworzy nowe okno dialogowe, którego zawartość stanowi tekst wprowadzany w parametrze viewType . Narzędzie UDI Designer tworzy nowe wystąpienie tego typu i opakowuje je w okno dialogowe zawierające przyciski OK i Anuluj.

Dane są przekazywane do kontrolki za pomocą parametru dialogPayload. Rozwiązanie SampleEditor w katalogu SDK zawiera przykład użycia tej funkcji.

ShowWizardWindow (Pokaż okno kreatora)
void ShowWizardWindow(Type viewType, DialogInteraction dialogPayload);

Ta metoda pozwala na wyświetlenie edytora niestandardowego w oknie dialogowym, które zawiera przyciski Dalej i Wstecz służące do nawigacji. Firma Microsoft nie udostępniła przykładowego sposobu użycia tej metody.

Plik konfiguracji Kreatora UDI — wykaz schematu

Ten plik jest używany przez Kreatora UDI i konfigurowany przez Kreatora UDI Designer. Ten plik służy do konfigurowania:

  • Strony kreatora wyświetlone w Kreatorze kodu UDI

  • Kolejność stron kreatora w Kreatorze kodów UDI

  • Ustawienia pól na poszczególnych stronach kreatora

  • Dostępne grupy etapów w narzędziu UDI Wizard Designer

  • Dostępne etapy w ramach każdego kreatora wdrażania w narzędziu UDI Wizard Designer

    77 wyświetla elementy w pliku konfiguracyjnym UDI Wizard i ich opisy. Element Wizard jest węzłem głównym dla tego odwołania.

Tabela 77. Elementy w pliku konfiguracyjnym kreatora UDI i ich opisy

Nazwa elementu Opis
Data (Dane) Grupuje poszczególne elementy DataItem w elemencie Page i jest nazywany atrybutem Name .
DataItem (Element danych) Grupuje poszczególne elementy Setter w elemencie Page . Dane hierarchiczne można utworzyć, uwzględniają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 zawierać element DataItem dla nazwy wyświetlanej i inny element DataItem dla odpowiedniej litery dysku.
Domyślne Określa wartość domyślną dla pola określonego w elemencie nadrzędnym Field lub RadioGroup . Wartością domyślną jest wartość ujęta w nawias kwadratowy dla tego elementu.
Biblioteka DLL Określa bibliotekę DLL, do której mają się odwoływać Kreator UDI i Kreator UDI Designer.
Biblioteki DLL Grupuje poszczególne elementy biblioteki DLL .
Błąd Określa możliwy kod błędu, który może zostać zwrócony przez zadanie. Wartość kodu błędu jest zwracana przez HRESULT zadania i jest przechwytywana przez ten element w celu zapewnienia bardziej szczegółowych informacji o błędzie.
Kod wyjścia Określa możliwy kod zakończenia zadania. Kody zakończenia to kody zwrotne, których oczekuje 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 zwrotne, których nie ma na liście w innych elementach ExitCode .
ExitCodes (Kody wyjścia) Grupuje zestaw elementów ExitCode i Error dla elementu Task lub elementu Error .
Pole Określa wystąpienie kontrolki w elemencie Page , która służy do dostosowywania danych XML. Nie wszystkie kontrolki umożliwiają dostosowywanie za pomocą języka XML — tylko kontrolki używające elementu Field .
Pola Grupuje poszczególne elementy pól 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 File , aby skopiować więcej niż jeden plik w ramach jednego zadania.
Strona Określa wystąpienie strony oraz uwzględnia wszystkie ustawienia konfiguracyjne strony.
PageRef (Odnośnik strony) Określa odniesienie do wystąpienia strony wewnątrz stołu montażowego w grupie etapów.
Strony Grupuje poszczególne elementy strony .
RadioGroup Określa grupę przycisków radiowych w elemencie Field .
Grupa etapowa Określa grupę składającą się z jednego lub większej liczby etapów.
Grupy etapowe Grupuje zestaw grup etapów w pliku konfiguracyjnym Kreatora udi.
Rozgrywający Określa ustawienie wartości właściwości właściwości, której nazwa jest określona przez właściwość właściwości .
Etap Określa etap w grupie StageGroup i zawiera co najmniej jeden element PageRef .
Styl Grupuje poszczególne elementy ustawiające , które konfigurują wygląd i działanie Kreatora UDI, w tym tytuł wyświetlany w górnej części kreatora i obraz transparentu wyświetlany w Kreatorze identyfikatorów 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 strony .
Walidator Określa weryfikator dla kontrolki pola określonej w nadrzędnym elemencie Field .
Kreator Określa katalog główny dla wszystkich pozostałych elementów.

Data (Dane)

Ten element grupuje poszczególne elementy DataItem w elemencie Page i jest nazwany przez atrybut Name .

Informacje o elemencie

Tabela 78 zawiera informacje o elemencie Dane .

Tabela 78. Informacje o elementach danych

Atrybut Wartość
Liczba wystąpień Zero lub więcej w każdym elemencie strony (ten element jest opcjonalny).
Elementy nadrzędne Page, DataItem
Spis treści DataItem, Setter
Atrybuty elementów

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

Tabela 79. Atrybuty i odpowiadające im wartości elementu danych

Atrybut Opis
Nazwa Określa nazwę elementu danych .
Uwagi

Atrybut Name umożliwia kodowi pobieranie określonego zestawu danych.

Przykład

Żaden.

DataItem (Element danych)

Ten element grupuje poszczególne elementy Setter w elemencie Page . Dane hierarchiczne można utworzyć, uwzględniają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 zawierać 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. Informacje o elemencie elementu danych

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, Ustawiacz
Atrybuty elementów

Ten element nie ma atrybutów.

Uwagi

Żaden.

Przykład

Żaden.

Domyślne

Ten element określa wartość domyślną dla pola określonego w elemencie nadrzędnym Field lub RadioGroup . Wartością domyślną jest wartość ujęta w nawias kwadratowy tego elementu.

Informacje o elemencie

Tabela 81 zawiera informacje o elemencie domyślnym .

Tabela 81. Domyślne informacje o elemencie

Atrybut Wartość
Liczba wystąpień Zero lub więcej w obrębie elementu Field lub RadioGroup (ten element jest opcjonalny).
Elementy nadrzędne Pole, RadioGroup
Spis treści Może być dowolną, poprawnie sformułowaną zawartością XML, ale zazwyczaj jest to standardowy tekst.
Atrybuty elementów

Ten element nie ma atrybutów.

Uwagi

Żaden.

Przykład

W poniższym przykładzie wartość domyślna pola TimeZone (Strefa czasowa ) jest ustawiona jako "Standardowy czas pacyficzny":

<Field Name="TimeZone" Enabled="true" VarName="OSDTimeZone" Summary="Time Zone:">
  <Default>Pacific Standard Time</Default>

Biblioteka DLL

Ten element określa bibliotekę DLL do załadowania i odwołania przez Kreatora UDI i Kreatora UDI Kreatora Designer.

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 w elemencie DLL
Element nadrzędny Biblioteki DLL
Spis treści Brak zawartości dozwolonej dla tego elementu
Atrybuty elementów

Tabela 83 zawiera listę atrybutów elementu DLL i 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, do której będą się odwoływać Kreator UDI i Kreator UDI Designer
Uwagi

Żaden.

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 Kreator
Spis treści Biblioteka DLL
Atrybuty elementów

Ten element nie ma atrybutów.

Uwagi

Żaden.

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 wychwytywana przez HRESULT zadania w celu zapewnienia bardziej szczegółowych informacji o błędzie.

Informacje o elemencie

Informacje o elemencie Error znajduje się w tabeli 85.

Tabela 85. Informacje o elemencie błędu

Atrybut Wartość
Liczba wystąpień Zero lub więcej w obrębie każdego elementu ExitCode (ten element jest opcjonalny).
Elementy nadrzędne ExitCodes (Kody wyjścia)
Spis treści Poprawnie sformułowana zawartość XML
Atrybuty elementów

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

Tabela 86. Informacje o elemencie błędu

Atrybut Opis
Stan Określa stan zwrócony zadania, które napotkało błąd. Zazwyczaj wartość tego atrybutu to Błąd. Ta wartość jest wyświetlana w kolumnie Województwo na stronie kreatora w Kreatorze kodu UDI.
Text (Tekst) Określa tekst opisujący warunek błędu, który napotkało zadanie.
Type Określa, czy ten element oznacza błąd, ostrzeżenie czy sukces. Wartość określona wpolu Type musi być unikatowa w elemencie ExitCodes . Prawidłowe wartości tego elementu:

- **0.**Element reprezentuje sukces.
- 1. Element reprezentuje ostrzeżenie.
- -1. Ten element reprezentuje błąd.
Wartość Określa wartość kodu, który zadanie zwraca jako wartość liczbową. Określenie wartości gwiazdki (*) wskazuje domyślny element dla kodów zwrotnych, które nie są wymienione w innych elementach błędu .
Uwagi

Żaden.

Przykład

Żaden.

Kod wyjścia

Ten element określa możliwy kod zakończenia zadania. Kody zakończenia to kody zwrotne, których oczekuje 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 zwrotne, których nie ma na liście 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 ExitCodes elemencie (ten element jest opcjonalny).
Elementy nadrzędne ExitCodes (Kody wyjścia)
Spis treści Co najmniej jeden element ExitCode i zero lub więcej elementów Error
Atrybuty elementów

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

Tabela 88. Atrybuty i odpowiadające im wartości elementu ExitCode

Atrybut Opis
Stan Określa stan zwracany przez zadanie. Wartość tego atrybutu jest wyświetlana w kolumnie Województwo na odpowiedniej stronie kreatora w Kreatorze kodu UDI. Można użyć dowolnych wartości tego atrybutu, które są znaczące dla danego zadania. Poniżej przedstawiono typowe wartości używane dla tego atrybutu:

- Sukces
- Ostrzeżenie
- Błąd
Text (Tekst) Określa tekst opisowy istniejącego kodu zadania.
Type Określa, czy ten element oznacza błąd, ostrzeżenie czy sukces. Wartość określona w typie musi być unikatowa w elemencie ExitCodes . Prawidłowe wartości tego elementu:

- 0. Element reprezentuje sukces.
- 1. Element reprezentuje ostrzeżenie.
- -1. Ten element reprezentuje błąd.
Wartość Określa wartość kodu, który zadanie zwraca jako wartość liczbową. Określenie wartości gwiazdki (*) wskazuje domyślny element dla kodów powrotnych, które nie są wymienione w innych elementach ExitCode .
Uwagi

Żaden.

Przykład

Żaden.

ExitCodes (Kody wyjścia)

Ten element grupuje zestaw elementów ExitCode i Error dla elementu Task lub Error .

Informacje o elemencie

Tabela 89 zawiera informacje o elemencie ExitCodes .

Tabela 89. ExitCodes — informacje o elemencie

Atrybut Wartość
Liczba wystąpień Po jednym w każdym elemencie zadania
Elementy nadrzędne Zadanie
Spis treści Błąd, kod wyjścia
Atrybuty elementów

Ten element nie ma atrybutów.

Uwagi

Żaden.

Przykład

Żaden.

Pole

Ten element określa wystąpienie formantu w elemencie Page służącego do dostosowywania za pomocą kodu XML. Nie wszystkie kontrolki umożliwiają dostosowywanie za pomocą języka XML — tylko kontrolki używające 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ślnie, Validator
Atrybuty elementów

Tabela 91 zawiera listę atrybutów elementu Field wraz z opisem każdego z nich.

Tabela 91. Atrybuty i odpowiadające im wartości elementu pola

Atrybut Opis
Włączone Określa, czy pole jest włączone dla danych wejściowych użytkownika (atrybut może mieć wartość Prawda lub Fałsz).
Nazwa Określa nazwę pola.
Podsumowanie Określa tekst opisowy wyświetlany na stronie Kreatora podsumowań dla wartości ustawianej przez to pole
VarName (Nazwa zmiennej) Określa nazwę zmiennej sekwencji zadań odczytaną lub skonfigurowaną przy użyciu pola w elemencie nadrzędnym Field
Uwagi

Ten element może zawierać zero lub więcej elementów Default i zero lub więcej elementów Validator .

Przykład

Żaden.

Pola

Ten element grupuje poszczególne elementy Field w elemencie Page .

Informacje o elemencie

Tabela 92 zawiera informacje o elemencie Fields .

Tabela 92. Informacje o elemencie pól

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

Żaden.

Przykład

Żaden.

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 File , aby skopiować więcej niż jeden plik w ramach jednego zadania.

Informacje o elemencie

Tabela 93 zawiera informacje o elemencie File .

Tabela 93. Informacje o elemencie pliku

Atrybut Wartość
Liczba wystąpień Co najmniej jeden dla każdego zadania, 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 opis każdego z nich.

Tabela 94. Atrybuty i odpowiadające im 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, który kopiuje typ zadania Microsoft.Wizard.CopyFilesTask . Ten atrybut obsługuje symbole wieloznaczne, dzięki czemu można kopiować wiele plików za pomocą jednego elementu File . Zmienne środowiskowe są dozwolone jako część ścieżki.
Uwagi

Żaden.

Przykład

Żaden.

Strona

Ten element określa wystąpienie strony i zawiera wszystkie ustawienia konfiguracyjne 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 w każdym elemencie Pages
Elementy nadrzędne Strony
Spis treści Dane, Pola, Ustawiająca, Zadania
Atrybuty elementów

Tabela 96 zawiera listę atrybutów elementu Page wraz z opisem każdego z nich.

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

Atrybut Opis
DisplayName (Nazwa wyświetlana) Określa przyjazną dla użytkownika nazwę strony kreatora wyświetlanej w narzędziu UDI Wizard Designer. Ta nazwa jest zwykle bardziej opisowa niż atrybut Name .
Nazwa Określa nazwę strony kreatora wyświetlanej w narzędziu UDI Wizard Designer.
Type Określa typ strony kreatora, który odnosi się bezpośrednio do określonej strony kreatora w bibliotece DLL.
Uwagi

Żaden.

Przykład

Żaden.

PageRef (Odnośnik strony)

Ten element określa odwołanie do wystąpienia strony w ramach Stage w StageGroup.

Informacje o elemencie

Tabela 97 zawiera informacje o elemencie PageRef .

Tabela 97. Informacje o elemencie PageRef

Atrybut Wartość
Liczba wystąpień Co najmniej jeden element w elemencie stołu montażowego
Elementy nadrzędne Etap
Spis treści Brak
Atrybuty elementów

Tabela 98 zawiera listę atrybutów elementu PageRef wraz z jego opisem.

Tabela 98. Atrybuty i odpowiadające im wartości elementu PageRef

Atrybut Opis
Strona Określa wystąpienie strony w ramach stołu montażowego w grupie StageGroup. Ustaw tę wartość na atrybut Name elementu Page .
Uwagi

Żaden.

Przykład

Żaden.

Strony

Ten element grupuje poszczególne elementy strony .

Informacje o elemencie

Tabela 99 zawiera informacje o elemencie Pages .

Tabela 99. Informacje o elemencie strony

Atrybut Wartość
Liczba wystąpień Jeden
Elementy nadrzędne Kreator
Spis treści Strona
Atrybuty elementów

Ten element nie ma atrybutów.

Uwagi

Żaden.

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 z elementem 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 Pola (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 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 wprowadzania danych przez użytkownika. Atrybut można ustawić na:

- True (prawda). Określa, że przyciski radiowe są wyłączone i użytkownicy nie mogą wybrać przycisku radiowego w grupie.
- False (fałsz). Określa, że przyciski radiowe są włączone i użytkownicy mogą wybrać przycisk radiowy w grupie.
Nazwa Określa nazwę grupy opcji opcji opcji radia.
Uwagi

Żaden.

Przykład

Żaden.

Grupa etapowa

Ten element określa grupę etapu 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 Grupy etapowe
Spis treści Etap
Atrybuty elementów

Tabela 103 zawiera listę atrybutów elementu StageGroup i opis atrybutu.

Tabela 103. Atrybuty i odpowiadające im wartości elementu StageGroup

Atrybut Opis
DisplayName (Nazwa wyświetlana) Określa przyjazną dla użytkownika nazwę grupy etapów wyświetlanej w narzędziu UDI Wizard Designer. Ta nazwa jest zwykle bardziej opisowa niż atrybut Name .
Uwagi

Żaden.

Przykład

Żaden.

Grupy etapowe

Ten element grupuje zestaw grup etapów w pliku konfiguracyjnym UDI Wizard.

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 Kreator
Spis treści Grupa etapowa
Atrybuty elementów

Ten element nie ma atrybutów.

Uwagi

Żaden.

Przykład

Żaden.

Rozgrywający

Ten element określa ustawienie właściwości dla wartości właściwości, której nazwa jest we właściwości Property .

Informacje o elemencie

Tabela 105 zawiera informacje o elemencie Setter .

Tabela 105. Informacje o elemencie ustawiającym

Atrybut Wartość
Liczba wystąpień Zero lub więcej w każdym elemencie nadrzędnym (ten element jest opcjonalny).
Elementy nadrzędne Dane, Element danych, Strona, Styl, Zadanie, Walidator
Spis treści Zawiera wartość ciągu w atrybucie Property .
Atrybuty elementów

Tabela 106 zawiera listę atrybutów elementu Setter i jego opis.

Tabela 106. Atrybuty i odpowiadające im wartości dla elementu ustawiającego

Atrybut Opis
Właściwość Określa ustawianą nazwę właściwości. Nazwa właściwości jest ustawiana na wartość ujętą w nawias kwadratowy tego atrybutu.
Uwagi

Żaden.

Przykład

Żaden.

Etap

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 etapu

Atrybut Wartość
Liczba wystąpień Co najmniej jeden element w elemencie StageGroup
Elementy nadrzędne Grupa etapowa
Spis treści PageRef (Odnośnik strony)
Atrybuty elementów

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

Tabela 108. Atrybuty i odpowiadające im wartości elementu stołu montażowego

Atrybut Opis
DisplayName (Nazwa wyświetlana) Określa przyjazną dla użytkownika nazwę strony kreatora wyświetlanej w narzędziu UDI Wizard Designer. 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 parametrem wiersza polecenia /stage: name .
Uwagi

Żaden.

Przykład

Żaden.

Styl

Ten element grupuje poszczególne elementy Setter , które konfigurują wygląd i działanie Kreatora UDI, w tym tytuł wyświetlany w górnej części kreatora i obraz transparentu 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 Kreator
Spis treści Rozgrywający
Atrybuty elementów

Ten element nie ma atrybutów.

Uwagi

Żaden.

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 nadrzędnym Page .

Informacje o elemencie

Tabela 110 zawiera informacje o elemencie Zadanie .

Tabela 110. Informacje o elemencie zadania

Atrybut Wartość
Liczba wystąpień Co najmniej jeden element w elemencie Zadania
Elementy nadrzędne Zadania
Spis treści ExitCodes, File, Setter
Atrybuty elementów

Tabela 111 zawiera listę atrybutów elementu Zadanie wraz z opisem każdego z nich.

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

Atrybut Opis
DependsOn (Zależnie od Określa, czy zadanie jest zależne od innego zadania. Wartość tego atrybutu jest ustawiana na atrybut Name innego elementu Task . Uwaga: Tego atrybutu nie można skonfigurować za pomocą narzędzia UDI Wizard Designer. Można jednak ręcznie dodać ten atrybut do elementu Task , bezpośrednio modyfikując plik .xml.
DisplayName (Nazwa wyświetlana) Określa przyjazną dla użytkownika nazwę zadania wyświetlaną w kreatorze UDI Wizard Designer. 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 bibliotece DLL zawierającej zadanie.
Uwagi

Żaden.

Przykład

Żaden.

Zadania

Ten element grupuje zestaw zadań dla elementu Page .

Informacje o elemencie

Tabela 112 zawiera informacje o elemencie Zadania .

Tabela 112. Informacje o elementach zadań

Atrybut Wartość
Liczba wystąpień Zero lub jeden w każdym elemencie strony (ten element jest opcjonalny).
Elementy nadrzędne Strona
Spis treści Zadanie
Atrybuty elementów

Tabela 113 zawiera listę atrybutów elementu Zadania wraz z opisem każdego z nich.

Tabela 113. Atrybuty i odpowiadające im wartości elementu Zadania

Atrybut Opis
NameTitle (NazwaTytuł) Określa podpis wyświetlany u góry kolumny zawierającej nazwy zadań na odpowiedniej stronie kreatora.
StatusTitle (Tytuł statusu) Określa podpis wyświetlany u góry kolumny zawierającej stan zadań na odpowiedniej stronie kreatora.
Uwagi

Żaden.

Przykład

Żaden.

Walidator

Ten element określa walidator dla kontrolki pola określonej w elemencie nadrzędnym Field .

Informacje o elemencie

Tabela 114 zawiera informacje o elemencie walidatora .

Tabela 114. Informacje o elemencie walidatora

Atrybut Wartość
Liczba wystąpień Zero lub jeden w elemencie Field
Elementy nadrzędne Pole
Spis treści Rozgrywający
Atrybuty elementów

Tabela 115 wymienia atrybut elementu Validator i podaje jego opis.

Tabela 115. Atrybuty i odpowiadające im wartości elementu walidatora

Atrybut Opis
Wpisać Określa typ walidatora, który jest zdefiniowany w bibliotece DLL zawierającej walidator
Uwagi

Żaden.

Przykład

Żaden.

Kreator

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

Informacje o elemencie

Tabela 116 zawiera informacje o elemencie Wizard .

Tabela 116. Informacje o elemencie kreatora

Atrybut Wartość
Liczba wystąpień Jeden
Elementy nadrzędne Brak
Spis treści Biblioteki DLL, strony, grupy etapów, styl
Atrybuty elementów

Ten element nie ma atrybutów.

Uwagi

Żaden.

Przykład
<Wizard>
   + <DLLs>
   + <Style>
   + <Pages>
   + <StageGroups>
</Wizard>