User Driven Installation - Guia do desenvolvedor

A UDI (User Driven Installation) ajuda a simplificar a implantação de sistemas operacionais cliente Windows®, como o Windows 8.1, em computadores usando o recurso de implantação de sistema operacional (OSD) no Microsoft® System Center 2012 R2 Gerenciador de Configurações. A UDI faz parte do Microsoft Deployment Toolkit (MDT).

Introdução

Normalmente, ao implantar sistemas operacionais usando o recurso OSD, você deve fornecer todas as informações necessárias para implantar o sistema operacional. As informações são configuradas em arquivos de configuração ou em bancos de dados (como o arquivo CustomSettings.ini ou o banco de dados MDT [MDT DB]). Você deve fornecer todas as definições de configuração antes de iniciar a implantação.

A UDI fornece uma interface orientada por assistente que permite fornecer informações de configuração imediatamente antes de executar a implantação. Esse comportamento permite criar sequências de tarefas OSD genéricas e, em seguida, fornecer informações específicas do computador no momento da implantação, o que fornece maior flexibilidade no processo de implantação.

Público-alvo

Este guia foi escrito para os desenvolvedores que criam páginas de assistente personalizadas para o Assistente UDI e editores de página de assistente personalizados para o UDI Wizard Designer. Este guia pressupõe que você esteja familiarizado com o desenvolvimento de aplicativos Windows usando:

  • C++, que é usado para criar páginas personalizadas do assistente

  • Microsoft .NET Framework, usado para criar editores de página de assistente personalizados

  • Windows Presentation Foundation (WPF), que é usado para criar editores de página de assistente personalizados

  • Linguagens compatíveis com o WPF, como C#, C++ ou Microsoft Visual Basic® .NET, que são usadas para criar editores de página de assistente personalizados

Sobre este guia

Este guia fornece as informações de referência necessárias para ajudá-lo a personalizar a UTI para sua organização. Este guia não discute tópicos administrativos ou operacionais, como a instalação do MDT (que inclui UDI), a configuração da UDI para implantar sistemas operacionais e aplicativos ou a execução de implantações usando o Assistente de UDI. Para obter mais informações sobre esses tópicos, consulte os tópicos de UDI em Usando o Microsoft Deployment Toolkit, incluído no MDT.

Visão geral do desenvolvimento da UDI

O desenvolvimento da UDI permite estender os recursos que a UDI fornece. Normalmente, o desenvolvimento de UDI é necessário quando você deseja coletar informações adicionais que o processo de implantação de UDI consome. Essas informações adicionais geralmente são salvas como variáveis de sequência de tarefas que as etapas da sequência de tarefas em uma sequência de tarefas UDI no Gerenciador de Configurações leem.

Arquitetura UDI

O objetivo de alto nível do desenvolvimento de UDI é criar páginas de assistente personalizadas que possam ser exibidas no Assistente de UDI. Ao criar páginas de assistente personalizadas, você pode estender os recursos existentes do UDI para atender aos requisitos técnicos e de negócios de sua organização. Uma página de assistente personalizada coleta informações além ou no lugar das páginas de assistente que a UDI fornece.

A Figura 1 ilustra a relação entre o UDI Wizard Designer e o UDI Wizard.

Figura 1. Relação entre o Assistente UDI e o UDI Wizard Designer Figura 1. Relação entre o Assistente UDI e o UDI Wizard Designer

Figura 1. Relação entre o Assistente UDI e o UDI Wizard Designer

A nível conceptual, o desenvolvimento da UDI inclui a criação de:

  • Páginas de assistente personalizadas. As páginas do assistente são exibidas no Assistente UDI e coletam as informações necessárias para concluir o processo de implantação. Você cria páginas de assistente usando C++ no Microsoft Visual Studio®. As páginas do assistente personalizado são implementadas como DLLs que o Assistente UDI lê. O SDK (Software Development Kit) da UDI inclui um exemplo de como criar páginas de assistente personalizadas.

  • Editores de página de assistente personalizados. Você usa editores de página do assistente para configurar o comportamento da página personalizada do assistente. Os editores de página do assistente personalizado são implementados como DLLs que o UDI Wizard Designer lê. Você cria editores de página de assistente usando:

    • WPF versão 4.0

    • Microsoft Prism versão 4.0

    • Bloco de Aplicativos do Microsoft Unity (Unity) versão 2.1

      O MDT inclui todos os assemblies necessários para criar um editor de página de assistente personalizado para uso no UDI Wizard Designer. O UDI SDK inclui um exemplo de como criar editores de página de assistente personalizados.

    Além disso, o UDI Wizard Designer consome arquivos de configuração do editor de página do assistente de suporte. Você cria os arquivos de configuração do editor de páginas do assistente como parte do processo para criar suas páginas personalizadas do assistente e editores de página personalizados do assistente. O UDI Wizard Designer cria as informações XML necessárias no arquivo de configuração do UDI Wizard e no arquivo .app correspondente.

Preparando o ambiente de desenvolvimento de UDI

Antes de começar a criar suas próprias páginas de assistente e editores de página de assistente personalizados, execute as seguintes etapas para preparar o ambiente de desenvolvimento de UDI:

  1. Prepare os pré-requisitos do ambiente de desenvolvimento UDI conforme descrito em Preparar os pré-requisitos do ambiente de desenvolvimento UDI.

  2. Configure o ambiente de desenvolvimento da UDI conforme descrito em Configurar o ambiente de desenvolvimento da UDI.

  3. Verifique se o ambiente de desenvolvimento da UDI está configurado corretamente, conforme descrito em Verificar o ambiente de desenvolvimento da UDI.

Preparar os Pré-requisitos do Ambiente de Desenvolvimento de UDI

Para preparar os pré-requisitos do ambiente de desenvolvimento de UDI, execute as seguintes etapas:

  1. Prepare os pré-requisitos de hardware do ambiente de desenvolvimento UDI, conforme descrito em Preparar os pré-requisitos de hardware do ambiente de desenvolvimento UDI.

  2. Prepare os requisitos de software do ambiente de desenvolvimento UDI, conforme descrito em Preparar os pré-requisitos do software do ambiente de desenvolvimento UDI.

Preparar o ambiente de desenvolvimento UDI Pré-requisitos de hardware

Os pré-requisitos de hardware do ambiente de desenvolvimento UDI são os mesmos requisitos de hardware para a edição do Microsoft Visual Studio que você está usando. Para obter mais informações sobre esses requisitos, consulte os requisitos do sistema para cada edição na Documentação do Visual Studio.

Preparar os Pré-requisitos de Software do Ambiente de Desenvolvimento UDI

O ambiente de desenvolvimento da UDI tem os seguintes pré-requisitos de software:

  • Qualquer sistema operacional Windows compatível com o Visual Studio 2010 (recomenda-se o Windows 7 ou o Windows Server ® 2008 R2).

    Você precisará de um sistema operacional Windows que suporte a arquitetura do processador para o qual você deseja desenvolver. Você pode executar o desenvolvimento de UDI de 32 bits e 64 bits usando um sistema operacional de 64 bits. Você só faz o desenvolvimento de UDI de 32 bits em sistemas operacionais de 32 bits. Por esse motivo, você deve usar um sistema operacional de 64 bits.

    Observação

    As versões IntelItanium (IA-64) do sistema operacional Windows não têm suporte para ambientes de desenvolvimento UDI.

    Para obter mais informações sobre os sistemas operacionais compatíveis com o Visual Studio 2010, consulte os requisitos do sistema para cada edição na Documentação do Visual Studio.

  • Microsoft .NET Framework versão 4.0 (exigido pelo Visual Studio 2010)

  • Linguagem C++ (a linguagem usada para estender páginas do Assistente UDI)

  • Outras linguagens compatíveis com o WPF, como C#, Visual Basic .NET ou C++/Common Language Infrastructure, que são usadas para estender os editores de página do assistente do UDI Wizard Designer

    Observação

    O código-fonte de exemplo para os editores de página do assistente do UDI Wizard Designer é escrito em C#. Instale a linguagem C# se quiser usar o código-fonte de exemplo.

Configurar o ambiente de desenvolvimento da UDI

Depois que os pré-requisitos do ambiente de desenvolvimento UDI forem atendidos, execute as seguintes etapas para configurar o ambiente de desenvolvimento UDI:

  1. Instale o Visual Studio 2010.

    Certifique-se de instalar a linguagem C++ e qualquer outra linguagem compatível com o WPF.

    Observação

    O código-fonte de exemplo para as páginas do editor do UDI Wizard Designer é escrito em C#. Instale a linguagem C# se quiser usar o código-fonte de exemplo.

    Para obter mais informações sobre como instalar o Visual Studio 2010, consulte Instalando o Visual Studio.

  2. Instale o MDT.

    Para obter mais informações sobre como instalar o MDT, confira a seção "Instalando ou atualizando para o MDT", no documento MDT Usando o Microsoft Deployment Toolkit.

  3. No Windows Explorer, crie local_folder (onde local_folder é qualquer pasta localizada em uma unidade local no computador de desenvolvimento).

  4. Copie a pasta installation_folder\SDK para local_folder (onde installation_folder é a pasta na qual você instalou o MDT e local_folder é qualquer pasta localizada em uma unidade local no computador de desenvolvimento).

    Você copia a pasta SDK para outro local porque o MDT está instalado na pasta Program Files, que não pode ser gravada sem permissões elevadas. Copiar a pasta do SDK para outro local permite que você modifique os arquivos na pasta do SDK sem exigir permissões elevadas.

  5. Copie a pasta installation_folder\Templates\Distribution\Tools para local_folder (onde installation_folder é a pasta na qual você instalou o MDT e local_folder é a pasta criada anteriormente no processo).

  6. Renomeie a pasta local_folder\Tools para local_folder\OSDSetupWizard(onde local_folder é a pasta criada anteriormente no processo).

    Quando concluída, a estrutura de pastas abaixo local_folder deve se parecer com a estrutura de pastas ilustrada na Figura 2 (onde local_folder é a pasta que você criou anteriormente no processo e é mostrada como UDIDevelopment na figura).

    Figura 2. Estrutura de pastas para desenvolvimento de UDI Figura 2. Estrutura de pastas para desenvolvimento de UDI

    Figura 2. Estrutura de pastas para desenvolvimento de UDI

Verificar o ambiente de desenvolvimento de UDI

Quando o ambiente de desenvolvimento da UDI estiver configurado, verifique se o ambiente de desenvolvimento da UDI está configurado corretamente, garantindo que os projetos de exemplo sejam compilados corretamente no Visual Studio 2010.

Verifique se o ambiente de desenvolvimento de UDI está configurado corretamente, determinando se:

Verificar se o projeto SamplePage é compilado corretamente

O projeto SamplePage fornece um exemplo de como criar uma página de assistente personalizada para o Assistente UDI. Para obter mais informações sobre o projeto SamplePage, consulte Revisar a solução SamplePage do Visual Studio.

Para verificar se o projeto SamplePage é compilado corretamente

  1. Inicie o Visual Studio 2010.

  2. Abra o projeto SamplePage.

    O projeto SamplePage reside na pasta local_folder\SDK\UDI\SamplePage (onde local_folder é a pasta criada anteriormente no processo).

  3. No Visual Studio 2010, no Gerenciador de Soluções, clique com o botão direito do mouse no projeto SamplePage e selecione Propriedades.

    A caixa de diálogo Páginas de Propriedades SamplePage é exibida.

  4. Na caixa de diálogo Páginas de Propriedades SamplePage , acesse Propriedades de Configuração/Depuração.

  5. Nas propriedades de Depuração, em Configuração, selecione Todas as Configurações.

  6. Nas propriedades de Depuração, em Comando, digite $(TargetDir)\OSDSetupWizard.exe.

  7. Nas propriedades de Depuração, em Diretório de Trabalho, digite $(TargetDir).

  8. Na caixa de diálogo Páginas de Propriedades SamplePage , vá para Propriedades de Configuração/Eventos de Build/Evento Pós-Compilação.

  9. Nas propriedades do Evento Pós-Compilação, em Linha de Comando, digite o seguinte:

    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. Na caixa de diálogo Páginas de Propriedades de SamplePage, selecione OK.

  11. Salve o projeto.

  12. No menu Depurar , selecione Iniciar Depuração.

    A caixa de diálogo Microsoft Visual Studioé exibida indicando que a fonte está desatualizada e pergunta se você deseja compilar o projeto.

  13. Na caixa de diálogo do Microsoft Visual Studio , selecione Sim.

    A caixa de diálogo Sem Informações de Depuração é exibida informando que nenhuma informação de depuração está disponível para OSDSetupWizard.exe.

  14. Na caixa de diálogo Sem Informações de Depuração , selecione Sim.

    O Assistente UDI é aberto com a página do assistente personalizado exibida.

  15. Verifique se você pode selecionar um valor em Escolher seu local.

  16. No Assistente com formulário de página de exemplo , selecione Cancelar.

    A caixa de diálogo Assistente para Cancelamento é exibida.

  17. Na caixa de diálogo Assistente para Cancelamento , selecione Sim.

  18. Feche o Visual Studio 2010.

Verificar se o projeto SampleEditor é compilado corretamente

O projeto SampleEditor fornece um exemplo de como criar um editor de página de assistente personalizado para o UDI Wizard Designer. Para obter mais informações sobre o projeto SampleEditor, consulte Revisar a solução SamplePage do Visual Studio.

Para verificar se o projeto SampleEditor é compilado corretamente

  1. Inicie o Visual Studio 2010.

  2. Abra o projeto SampleEditor.

    O projeto SampleEditor reside na pasta local_folder\SDK\UDI\SampleEditor (onde local_folder é a pasta criada anteriormente no processo).

  3. No Visual Studio 2010, no Gerenciador de Soluções, selecione o projeto SampleEditor.

  4. No menu Projeto , selecione Adicionar referência.

    A caixa de diálogo Adicionar Referência é aberta.

  5. Na caixa de diálogo Adicionar Referência , selecione a guia Procurar .

  6. Na guia Procurar , acesse installation_folder\Lixeira (onde installation_folder é a pasta na qual você instalou o MDT). Selecione os seguintes arquivos e selecione 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

    Observação

    Você pode selecionar vários arquivos na guia Procurar mantendo pressionada a tecla CTRL enquanto seleciona os arquivos.

  7. No Gerenciador de Soluções, acesse SampleEditor/References.

  8. Verifique se nenhuma das referências tem avisos ou erros.

  9. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto SampleEditor e selecione Propriedades.

    A caixa de diálogo Páginas de Propriedades do Editor de Amostra é exibida.

  10. Na caixa de diálogo Páginas de Propriedades do Editor de Exemplo , selecione a guia Depurar .

  11. Na guia Depurar , selecione Iniciar programa externo.

  12. Em Iniciar programa externo, digite installation_folder\Bin\UDIDesigner.exe (onde installation_folder é a pasta na qual você instalou o MDT) e selecione OK.

    Dica

    Você pode selecionar o botão de reticências (...) para navegar até a pasta e selecionar UDIDesigner.exe.

  13. No menu Arquivo , selecione Salvar Tudo.

  14. Copie o arquivo\SDK\SamplePage\SamplePage.dll.config local_folder para a pasta installation_folder\Bin\Config (onde local_folder é a pasta criada no computador de desenvolvimento anteriormente no processo de configuração einstallation_folder é a pasta na qual você instalou o MDT).

  15. No Visual Studio 2010, no menu Depurar , selecione Iniciar Depuração.

    O UDI Wizard Designer é iniciado.

  16. No UDI Wizard Designer, na Faixa de Opções, selecione Abrir.

    A caixa de diálogo Abrir é exibida.

  17. Na caixa de diálogo Abrir , abra o arquivo de\SDK\SamplePage\SamplePage\Config.xml local_folder (onde local_folder é a pasta criada no computador de desenvolvimento anteriormente no processo de configuração).

    O arquivo Config.xml é aberto e o Grupo de Estágios Personalizado é exibido no painel de detalhes.

  18. No painel de detalhes, selecione a guia Configurar .

  19. Examine as informações de configuração da caixa Local , incluindo o seguinte:

    • Botão desbloqueado, com o qual você habilita ou desabilita a caixa Local

    • Caixa Valor padrão, na qual é inserido um valor padrão a ser exibido na caixa Local

    • Nome de exibição amigável visível na página de resumo, na qual você insere a legenda das informações exibidas na página de resumo

    • Caixa de listagem de localização, que inclui uma lista de possíveis localizações

  20. Feche o UDI Wizard Designer.

  21. Feche o Visual Studio 2010.

Revisando os exemplos do SDK UDI

Antes de iniciar o desenvolvimento, examine os exemplos fornecidos no SDK da UDI. Use as informações neste guia e o código-fonte nos exemplos para ajudá-lo a criar suas próprias páginas de assistente personalizadas UDI e editores de página de assistente.

Percorra os exemplos do SDK do UDI examinando o:

Revise o conteúdo da pasta do SDK

Durante a configuração do ambiente de desenvolvimento da UDI, você copiou a pasta do SDK da pasta na qual você instalou o MDT para outra pasta que você criou. A Tabela 1 lista as pastas imediatamente abaixo da pasta do SDK e fornece uma breve descrição de cada uma.

Tabela 1. Pastas no SDK do UDI

Folder Esta pasta contém
Inclui Os arquivos de cabeçalho C++ necessários para criar páginas de assistente personalizadas para o Assistente UDI
Bibliotecas Os arquivos da biblioteca C++ que serão vinculados à sua página personalizada; Há versões de 32 bits e 64 bits das bibliotecas de vínculo estático. Observação: As versões Itanium das bibliotecas (IA-64) não estão disponíveis.
Editor de Amostra Um projeto do Visual Studio para criar um editor personalizado usado para editar a página SamplePage no UDI Wizard Designer, que é escrito em C#
SamplePage Um projeto do Visual Studio para criar uma página personalizada do assistente de UDI, que é escrita em Visual C++

Examinar a solução Visual Studio samplePage

Antes de começar a criar suas páginas de assistente personalizadas e editores de página de assistente, execute as seguintes tarefas para preparar o ambiente de desenvolvimento de UDI:

Examinar o ciclo de vida da página do assistente

Uma página do assistente UDI tem métodos que correspondem a cada estágio (ou fase) do ciclo de vida da página. Como parte da criação de sua página de assistente personalizada, você precisa substituir esses métodos pelo código. A Tabela 2 lista os métodos que você precisará substituir e fornece uma breve descrição de cada método, incluindo quando usar o método no ciclo de vida da página do assistente.

Tabela 2. Métodos em um Ciclo de Vida da Página do Assistente

Method Descrição
OnWindowCreated Esse método é chamado uma vez, depois que a janela da página é criada.

Para esse método, escreva o código que inicializa a página pela primeira vez e só precisa ser executado uma vez. Por exemplo, use este método para inicializar campos ou para ler informações de configuração dos elementos Setter no arquivo de configuração do Assistente UDI.
OnWindowShown Esse método é chamado sempre que a página é exibida (mostrada) no Assistente UDI. É chamada na primeira vez que a página é exibida e sempre que você navega até a página selecionando Avançar ou Voltar no assistente.

Para esse método, escreva o código que prepara a página a ser exibida, por exemplo, lendo variáveis de memória, variáveis de sequência de tarefas ou variáveis de ambiente e, em seguida, atualizando a página com base em quaisquer alterações nessas variáveis.
OnCommonControlEvent Esse método pode ser chamado sempre que a página do assistente é exibida e recebe uma mensagem WM_NOTIFY de um filho (normalmente, controles comuns).

Para esse método, escreva o código que lida com WM_NOTIFY com base na mensagem de notificação. Por exemplo, talvez você queira responder a eventos de um controle comum, como responder a eventos de seleção ou clique duas vezes para um controle TreeView .
OnUnhandledEvent Esse método é chamado sempre que ocorre uma mensagem de janela sem tratamento para a página do assistente. Esse método oferece a oportunidade de interceptar e manipular essas mensagens de janela sem tratamento.

Para esse método, escreva o código que manipule as mensagens de janela pertinentes à página do assistente. Normalmente, você não precisará substituir esse método.
OnNextSelected Esse método é chamado quando você seleciona Avançar no assistente.

Para esse método, escreva o código que execute todas as ações necessárias antes de passar para a próxima página do assistente - por exemplo, executar uma validação que pode levar muito tempo. Se a validação falhar, você poderá cancelar a solicitação Next e exibir uma mensagem.
OnWindowHidden Esse método é chamado sempre que a página fica oculta quando a página anterior ou a próxima do assistente é mostrada.

Para esse método, escreva o código que executa todas as ações antes que a página seja ocultada, antes de outra página ser mostrada. Normalmente, você não precisará substituir esse método.

Examine o exemplo SamplePage

Examine o exemplo SamplePage usando a lista a seguir, que representa a sequência de eventos durante o ciclo de vida da página do assistente do exemplo SamplePage:

  1. O Assistente de UDI, OSDSetupWizard.exe, lê as informações de configuração do arquivo de configuração do Assistente de UDI no exemplo (o arquivo Config.xml), conforme descrito na Etapa 1: O Assistente de UDI (OSDSetupWizard.exe) lê o arquivo Config.xml.

  2. O Assistente UDI carrega as DLLs necessárias para cada página do assistente listada no arquivo de configuração do Assistente UDI, conforme descrito na Etapa 2: O Assistente UDI carrega a DLL para a página personalizada do assistente.

  3. O Assistente de UDI exibe a página do assistente personalizado e permite a interação de controle desejada, conforme descrito na Etapa 3: O Assistente de UDI exibe a página do assistente personalizado.

  4. Quando a página do assistente personalizado tiver coletado as informações, execute todas as tarefas necessárias antes de selecionar Avançar para prosseguir para o próximo assistente, conforme descrito na Etapa 4: O botão Avançar é selecionado na página do assistente personalizado.

Etapa 1: O Assistente UDI (OSDSetupWizard.exe) lê o arquivo Config.xml

Quando o Assistente de UDI (OSDSetupWizard.exe) é iniciado, por padrão, ele lê o arquivo de configuração do Assistente de UDI, que é o arquivo de UDIWizard_Config.xml - o arquivo de configuração principal do Assistente de UDI.

Observação

O exemplo usa o arquivo Config.xml como o arquivo de configuração. No MDT, o arquivo de configuração padrão é o arquivo UDIWizard_Config.xml, que fica na pasta Scripts do pacote Files MDT para configuração.

Você pode substituir o arquivo de configuração padrão que o Assistente UDI usa modificando a etapa de sequência de tarefas do Assistente UDI para usar o parâmetro /definition . Para obter mais informações sobre como substituir o arquivo de configuração padrão usado pelo Assistente de UDI, consulte "Substituir o arquivo de configuração usado pelo Assistente de UDI".

Os elementos de nível superior no arquivo Config.xml são os

  • Elemento DLLs

  • Elemento de estilo

  • Elemento Pages

  • Elemento StageGroups

    Para obter mais informações sobre o esquema do arquivo de configuração do Assistente UDI e cada um desses elementos, consulte Referência de esquema do arquivo de configuração do Assistente UDI.

    O Assistente de UDI verifica o elemento DLLs procurando os arquivos .dll a serem carregados. No exemplo, dois arquivos .dll são listados: SamplePage.dll e SharedPages.dll. Esses arquivos .dll devem residir na mesma pasta que OSDSetupWizard.exe — a pasta Tools\platform(onde platform é x86 para a versão de 32 bits ou x64 para a versão de 64 bits).

    O Assistente de UDI examina o elemento Pages procurando as páginas definidas. No exemplo, duas páginas são definidas: Custom e SummaryPage. O atributo Type do elemento Page é definido no arquivo PageClassIDs.h e define exclusivamente o tipo de sua página personalizada.

    No exemplo, o tipo definido é Microsoft.SamplePage.LocationPage. Na sua página personalizada, substitua o seguinte para evitar possíveis conflitos com outras páginas que você possa criar no futuro:

  • O nome da sua organização no lugar da Microsoft.

  • O nome do seu projeto no lugar de SamplePage.

  • Seu nome de página de assistente personalizado no lugar de LocationPage.

Etapa 2: O Assistente de UDI carrega a DLL para a página do Assistente Personalizado

Quando o Assistente de UDI carrega sua DLL, ele chama a função RegisterFactories , que deve ser implementada no arquivo .dll. No exemplo, essa função é implementada no arquivo dllmain.ccp. Cada página de assistente criada deve implementar a função RegisterFactories .

A função RegisterFactories é usada para registrar a classe de fábrica da página do assistente com o registro de fábrica de classe para o Assistente de UDI. Fábricas de classes são classes que podem criar uma instância de outra classe. A função RegisterFactories cria uma nova instância de uma classe de fábrica e passa essa classe para o registro de fábrica de classe para o Assistente de UDI, que disponibiliza essa classe de fábrica para o assistente. O Assistente de UDI procura uma classe de fábrica registrada com uma ID que corresponda ao atributo Tipo do elemento Page para a página personalizada do assistente.

No exemplo, a ID é definida como ID_Location no arquivo PageClassIds.h como Microsoft.SamplePage.LocationPage, que corresponde ao atributo Type para o elemento Page no arquivo Config.xml. ID_Location é passado como um parâmetro na função RegisterFactories implementada no arquivo dllmain.ccp.

Você pode criar uma função usando o modelo de função Register_name para simplificar a criação de uma nova instância de fábrica e registrar a instância recém-criada. O valor de nome fornecido usando o modelo de função Register deve implementar a interface iClassFactory . A classe ClassFactoryImpl lida com a maioria dos detalhes para implementar uma fábrica de classes.

Você também pode usar a função RegisterFactories para registrar tipos de tarefa e tipos de validador. Para obter mais informações, confira o seguinte:

Observação

O exemplo contém e registra apenas uma página de assistente personalizada. O exemplo não inclui tarefas ou validadores personalizados e, portanto, não registra nenhum validador ou tarefa personalizada.

Etapa 3: O Assistente de UDI exibe a página Assistente Personalizado

A página personalizada do assistente no exemplo é definida no arquivo LocationPage.cpp. As páginas do assistente são derivadas de classes de modelo que fornecem grande parte da funcionalidade de uma página. Todas as páginas do assistente devem derivar da classe de modelo WizardPageImpl , que implementa a interface IWizardPage . Cada página do assistente pode implementar outras classes de modelo opcionais e interfaces correspondentes com base nas necessidades da página.

A classe de modelo WizardPageImpl tem várias interfaces úteis que podem ajudá-lo a escrever páginas de assistente personalizadas. Implemente a classe de modelo WizardPageImpl como a classe base para sua página de assistente personalizada.

Para obter uma lista dos disponíveis:

  • Classes de modelo para páginas de assistente, consulte Classes auxiliares de página do assistente

  • Interfaces para as classes de modelo de página do assistente, consulte Interfaces de página do assistente

    A página de assistente personalizada no exemplo é derivada da classe de modelo WizardPageImpl e implementa a interface IWizardPage . Além disso, a página do assistente personalizado implementa a interface IFieldCallback . Ambos são implementados no arquivo LocationPage.cpp.

    A página de assistente personalizado de exemplo substitui os seguintes métodos:

  • OnWindowCreated. O método OnWindowCreated na página do assistente de exemplo chama os seguintes métodos:

    • AddField. Esse método relaciona o controle de caixa de IDC_COMBO_LOCATION no recurso IDD_LOCATION_PAGE com o elemento Data chamado Location no arquivo Config.xml.

      Além do método AddField , você pode usar os métodos AddRadioGroup e AddToGroup para dar suporte a outros controles e comportamentos.

      Observação

      Certifique-se de chamar o método AddField, AddRadioGroup ou AddToGroup antes de chamar o método InitFields .

    • InitFields. Use esse método para inicializar os campos (controles) que você adicionou ao formulário. O ponteiro da página é um parâmetro. No exemplo, o ponteiro this é passado, que se refere à página atual.

      Observação

      Para dar suporte ao uso deste ponteiro, você deve implementar a interface IFieldCallback além das interfaces compatíveis com a classe de modelo WizardPageImpl .

      A interface IFieldCallback chama o método SetFieldDefault, que é usado para definir os valores padrão para controles diferentes dos controles de caixa de texto e caixa de marca seleção. No exemplo, o método SetFieldDefault define o índice inicial do controle de caixa de combinação com base no valor padrão especificado no elemento Default para o elemento Field no arquivo Config.xml.

      O método OnWindowCreated configura o controlador de formulário usando a interface IFormController. Para obter mais informações sobre como configurar o controlador de formulário, consulte Configurando o formulário.

  • InitLocations. Esse método preenche a caixa de combinação da lista de locais no arquivo Config.xml. O elemento Data e os elementos DataItem filho do arquivo Confg.xml fornecem a lista de valores possíveis.

  • OnNextSelected. Esse método executa as seguintes tarefas:

    • Atualizações da variável de sequência de tarefas TSLocation com o valor selecionado na caixa de combinação usando o método SaveFields

    • Adiciona informações que serão mostradas na página Resumo usando o método SaveFields

Etapa 4: o botão Avançar é selecionado na página Assistente Personalizado

Quando o usuário preenche os campos na página do assistente personalizado, ele seleciona Avançar, que chama o método OnNextSelected . O método OnNextSelected executa todas as tarefas necessárias antes de prosseguir para a próxima página do assistente, como registrar as alterações de configuração feitas na página do assistente personalizado.

Para a página de assistente personalizado de exemplo, a substituição do método OnNextSelected é implementada no arquivo LocationPage.ccp. No método OnNextSelected na página do assistente personalizado de exemplo, os seguintes métodos são chamados:

  1. InitSection. Esse método inicializa o cabeçalho (rótulo legenda) dos dados de resumo exibidos na página Resumo. Normalmente, você pode definir esse valor usando a função DisplayName(). Os dados associados a essa legenda são salvos usando o método SaveFields.

  2. SaveFields. Esse método salva os valores de campo nas variáveis da sequência de tarefas e nos dados exibidos na página Resumo .

Examinar a solução SampleEditor do Visual Studio

Antes de começar a criar suas próprias páginas de assistente e editores de página de assistente personalizados, execute as seguintes etapas para preparar o ambiente de desenvolvimento de UDI:

Examinar a arquitetura do Designer do Assistente de UDI

O UDI Wizard Designer foi desenvolvido usando WPF, Prism e Unity. O UDI Designer é usado para editar o arquivo de configuração do Assistente de UDI (UDIWizard_Config.xml), que o Assistente de UDI (OSDSetupWizard.exe) lê em tempo de execução. O elemento Pages no arquivo de configuração do Assistente de UDI contém uma lista de páginas que tem um elemento Page separado para cada página do assistente.

Quando você edita as definições de configuração de uma página do assistente, o UDI Wizard Designer carrega o editor de página personalizado que corresponde ao tipo de página do assistente. Os editores de página do assistente personalizado são desenvolvidos como controles de usuário do WPF. As páginas do editor de páginas do assistente personalizado usam o padrão de design MVVM (Model-View-ViewModel ) para WPF.

O padrão de design MVVM ajuda a separar a interface do usuário (UI; apresentação) dos dados que estão sendo apresentados. Os dados são uma fachada sobre o elemento Page no arquivo de configuração do Assistente de UDI (o arquivo Config.xml no exemplo), que é acessado usando a propriedade CurrentPage da interface IDataService .

O UDI Wizard Designer usa o DependencyAttribute para obter acesso à classe DataService com base na estrutura de injeção de dependência no Unity. Para obter mais informações sobre a estrutura de interjeição de dependência no Unity, consulte Injete um pouco de vida em seus aplicativos – Conhecendo o bloco de aplicativos do Unity.

Revisar componentes configuráveis de uma página do assistente de UDI

À medida que você cria sua página personalizada do assistente, algumas das definições de configuração podem ser definidas no código e não podem ser alteradas após a compilação da página. No entanto, para outras configurações, você precisará permitir que essas definições sejam alteradas usando o UDI Wizard Designer.

Normalmente, as definições de configuração que você deseja definir usando o Assistente de UDI Designer são salvas no arquivo de configuração do Assistente de UDI (o arquivo Config.xml no exemplo). No entanto, você também pode criar seu próprio arquivo de configuração separado, se necessário. Um exemplo de uso de um arquivo de configuração separado é o arquivo UDIWizard_Config.xml.app, que a tarefa de Descoberta de Aplicativo e o tipo de página do assistente ApplicationPage usam.

Veja a seguir uma lista das definições de configuração típicas que você pode gerenciar usando o UDI Wizard Designer:

  • campo. Os campos de uso permitem que os usuários forneçam informações. Os campos aparecem como elementos de campo no arquivo de configuração do Assistente de UDI (UDIWizard_Config.xml), que contém as definições de configuração de cada campo. O editor de páginas do assistente correspondente precisa fornecer um método para editar as definições de configuração de campo para o campo usando o FieldElementControl.

  • Propriedades. Os setters ajudam a criar propriedades para entidades na página, como páginas no elemento Page , campos no elemento Field ou dados nos elementos Data ou DataItem . Você configura propriedades nos elementos Setter . Adicione um elemento Setter separado para cada propriedade que deseja definir. Você edita as propriedades usando o SetterControl e configura outros elementos Setter usando outros controles.

  • Dados. Os dados são usados para armazenar informações para uso pela página do assistente e outros componentes. Você pode definir dados para páginas ou campos usando os elementos Dados ou DataItem . Os dados podem ser definidos em uma estrutura simples ou hierárquica por meio do uso adequado dos elementos Data ou DataItem . A Config.xml no exemplo no SDK mostra como criar estruturas de dados simples.

    O editor de página do assistente personalizado criado deve ser capaz de gerenciar essas configurações.

Examinar o exemplo EditorPage

O exemplo EditorPage é usado para definir as definições de configuração para a página do assistente SamplePage no arquivo de configuração do Assistente UDI. O exemplo EditorPage tem os seguintes componentes principais:

  • Interface do usuário para definir as configurações da caixa de combinação de localização

  • Interface do usuário para adicionar ou editar um local na lista de possíveis locais, mostrada na caixa de combinação Local

  • Definições de configuração lidas e salvas no arquivo de configuração do Assistente UDI

  • Código de suporte para os outros componentes

    Examine o exemplo EditorPage no Visual Studio executando as seguintes etapas:

  1. Examine como o editor de páginas do assistente SampleEditor é carregado e inicializado no UDI Wizard Designer, conforme descrito em Carregamento e inicialização do editor de páginas do Assistente de Revisão.

  2. Examine a interface do usuário usada para editar a caixa de combinação Local nos arquivos LocationPageEditor.xaml e LocationPageEditor.xaml.cs, conforme descrito em Revisar a interface do usuário usada para configurar a caixa de combinação Local.

  3. Examine a interface do usuário usada para adicionar ou editar locais à lista nos arquivos AddEditLocationView.xaml e AddEditLocationView.xaml.cs, conforme descrito em Revisar a interface do usuário usada para modificar a lista de possíveis locais.

  4. Revise o código usado para gerenciar informações de configuração salvas no arquivo de configuração do Assistente de UDI, conforme descrito em Revise o código usado para gerenciar informações de configuração.

Carregamento e inicialização do editor de páginas do Assistente de Revisão

Os editores de página do assistente personalizado são carregados conforme exigido pelo UDI Wizard Designer. Os arquivos de configuração do UDI Wizard Designer são carregados quando o UDI Wizard Designer é iniciado. O Assistente de UDI Designer verifica a pasta install_folder\Bin\Config (onde install_folder é o nome da pasta em que o MDT está instalado) em busca de arquivos com uma extensão de arquivo .config.

Durante a configuração do ambiente de desenvolvimento da UDI, você copiou o arquivo SamplePage.dll.confg para a pasta install_folder\Bin\Config. Quando você inicia a Designer do Assistente de UDI, o arquivo SamplePage.dll.confg é encontrado e carregado.

O Assistente UDI Designer usa os seguintes atributos do elemento Page no arquivo SamplePage.dll.confg para carregar e inicializar o exemplo EditorPage:

  • DesignerAssembly. Esse atributo determina o nome da DLL a ser carregada. Essa DLL precisa ser colocada na mesma pasta que o arquivo UDIDesigner.exe, que é a pasta install_folder\Bin (onde install_folder é o nome da pasta na qual o MDT está instalado).

  • DesignerType. Esse atributo é o nome do tipo Microsoft .NET da classe que contém o controle de usuário do WPF.

  • Tipo. Use esse atributo para configurar o tipo de página da página do assistente personalizado, que o Assistente UDI carrega. O UDI Wizard Designer usa esse atributo para localizar o elemento Page apropriado no arquivo de configuração do UDI Wizard.

  • Dll. Use esse atributo para configurar o elemento DLL no arquivo de configuração do Assistente de UDI, que o UDI Wizard Designer cria.

  • Descrição. Use esse atributo para fornecer informações sobre o editor de páginas do assistente. O valor desse atributo é mostrado na caixa de diálogo Adicionar Nova Página no UDI Wizard Designer, que é usada para adicionar a página do assistente à "Biblioteca de Páginas".

  • Nome de Exibição. Use esse atributo para fornecer o nome da página do assistente personalizado que é exibida no UDI Wizard Designer. O valor desse atributo é mostrado na caixa de diálogo Adicionar Nova Página no UDI Wizard Designer, que é usada para adicionar a página do assistente à "Biblioteca de Páginas".

    No exemplo, o tipo da página personalizada do assistente SamplePage é Microsoft.SamplePage.LocationPage, que é salva no arquivo Config.xml. O arquivo Config.xml reside na pasta local_folder\SDK\SamplePage\SamplePage para (onde local_folder é a pasta criada no computador de desenvolvimento anteriormente no processo de configuração).

Analisar a interface do usuário usada para configurar a caixa de combinação Local

Quando o editor de páginas do assistente é carregado e inicializado, o editor de páginas do assistente SampleEditor é carregado quando uma página com um tipo de Microsoft.SamplePage.LocationPage é editada. A interface do usuário do editor de páginas é armazenada no arquivo LocationPageEditor.xaml.

Se você examinar a interface do usuário na guia Design e o código na guia XAML , poderá ver a relação entre a interface gráfica da interface do usuário e os elementos e atributos na linguagem XAML (Extensible Application Markup Language).

Por exemplo, se você examinar o elemento Controls:FieldElementControl no XAML, poderá ver como isso se relaciona com o layout da interface do usuário correspondente. Use o elemento Controls:FieldElementControl para definir o controle FieldElementControl .

Os parâmetros de associação no arquivo XAML associam os campos no editor de página de exemplo com as informações no arquivo de configuração do assistente UDI. Por exemplo, o código a seguir vincula a caixa de texto de valor Padrão ao elemento Padrão no arquivo de configuração do assistente de UDI (Config.xml no exemplo):

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

Para obter mais informações, consulte Como disponibilizar dados para associação em XAML.

Use o elemento Views:CollectionTControl.ColumnCollectionView no XAML para editar a lista de locais disponíveis no modo de exibição de grade. Você usa o controle CollectionTControl para exibir a exibição de grade e vincular a exibição de grade ao elemento Data com o nome Location no arquivo de configuração UDI.

Revise a interface do usuário usada para modificar a lista de possíveis locais

A interface do usuário para modificar a lista de locais possíveis consiste em:

Examine o menu contextual e os botões da faixa de opções para modificar a lista de locais

Quando você clica com o botão direito do mouse na caixa de listagem que contém a lista de locais, um menu contextual é exibido. A faixa de opções tem botões correspondentes que permitem executar as mesmas tarefas. O elemento de controle Views:CollectionsTControl no arquivo LocationPageEditor.xaml define os métodos chamados com base na ação realizada e nas propriedades que você define da seguinte maneira:

  • SelectedItem. Essa propriedade vinculada a dados é ativada quando o usuário seleciona um item na lista. Essa propriedade está vinculada à propriedade CurrentLocation no modelo de exibição, que está localizada no arquivo LocationPageEditorViewModel.cs e é usada pelo controle CollectionTControl para passar o item selecionado quando você edita ou remove um item existente.

  • AddItemAction. Essa ação é executada quando o usuário seleciona a opção Adicionar Item no menu contextual ou os botões correspondentes na Faixa de Opções. Há uma associação de dados a uma propriedade no modelo de exibição que retorna o objeto AddLocationAction . Esse objeto é o método AddLocationCallback , localizado no arquivo LocationPageEditorViewModel.cs, e exibe a caixa de diálogo no arquivo AddEditLocationView.xaml.

  • EditItemAction. Essa ação é executada quando o usuário seleciona a opção Editar Item no menu contextual. Há uma associação de dados a uma propriedade no modelo de exibição que retorna o objeto EditLocationAction . Esse objeto é o método EditLocationCallback , localizado no arquivo LocationPageEditorViewModel.cs, e exibe a caixa de diálogo no arquivo AddEditLocationView.xaml.

  • RemoveAction. Essa ação é executada quando o usuário seleciona a opção Remover Item no menu contextual. Há uma associação de dados a uma propriedade no modelo de exibição que retorna o objeto RemoveAction . Esse objeto é o método EditLocationCallback , localizado no arquivo LocationPageEditorViewModel.cs, e mostra uma mensagem que confirma a exclusão do local.

Examine a caixa de diálogo para adicionar ou editar locais

Se você adicionar um novo local à lista de locais ou editar um local existente, será exibida uma mensagem que está no arquivo AddEditLocationView.xaml. A mensagem é exibida usando o método de janela ShowDialogWindow no arquivo LocationPageEditorViewModel.cs.

A interface do usuário no arquivo AddEditLocationView.xaml consiste em:

  • Um quadro de diálogo chamado DialogFrame, que inclui os seguintes elementos:

    • Um título, que você configura usando o atributo DialogTitle do quadro de diálogo

    • Um botão OK, que define a status de retorno como para a propriedade Approved como True (o status de retorno é verificado no método AddLocationCallback no arquivo LocationPageEditorViewModel.cs para determinar se o usuário selecionou OK.)

    • Um botão Cancelar, que define a status de devolução como para a propriedade Approved como False (o status de retorno é verificado no método AddLocationCallback no arquivo LocationPageEditorViewModel.cs para determinar se o usuário selecionou Cancelar.)

  • Um elemento WPF que contém:

    • Um rótulo, que você configura usando o atributo Conteúdo

    • Uma caixa de texto, que é associada ao elemento Data com o nome Location no arquivo de configuração UDI (o arquivo Config.xml no exemplo)

Examinar o código usado para gerenciar as informações de configuração

As informações de configuração da página personalizada do assistente são armazenadas no arquivo de configuração do Assistente UDI, que é:

  • Config.xml arquivo no exemplo fornecido com o SDK da UDI (Este arquivo contém apenas as definições de configuração para o exemplo.)

  • UDIWizard_Config.xml arquivo fornecido com o MDT, armazenado na pasta installation_folder\Templates\Distribution\Scripts (onde installation_folder é a pasta na qual você instalou o MDT); Esse arquivo contém as definições de configuração para todas as páginas e estágios internos do assistente

    No exemplo SampleEditor, a rotina Locations ajuda a gerenciar as informações de configuração e está localizada no arquivo LocationPageEditorViewModel.cs. A rotina Locais retorna uma lista dos locais do arquivo de configuração do Assistente UDI. Especificamente, a lista retornada contém um item para cada elemento DataItem no arquivo de configuração do Assistente UDI.

Criando páginas personalizadas do assistente UDI

O processo de alto nível para criar páginas personalizadas do assistente UDI é o seguinte:

  1. Faça uma cópia da solução SamplePage como ponto de partida.

  2. Coloque os controles (campos) desejados no formulário.

  3. Escreva o código para executar as tarefas apropriadas quando a página do assistente for carregada (substituições do método OnWindowCreated ), incluindo as seguintes etapas:

    1. Inicialize o formulário.

    2. Ler variáveis de memória, variáveis de sequência de tarefas, variáveis de ambiente ou informações de arquivo XML (como propriedades Setter ).

  4. Escreva qualquer código para executar as tarefas apropriadas quando a página for mostrada (substituições do método OnWindowShown ), incluindo as seguintes etapas:

    1. Habilite ou desabilite controles com base nas informações lidas quando a página foi carregada na etapa 3.

    2. Atualize os controles com base nas informações lidas quando a página for carregada na etapa 3, como a população de controles com base nas informações lidas.

  5. Escreva qualquer código para executar as tarefas apropriadas enquanto o usuário interage com a página do assistente.

  6. Escreva qualquer código para executar as tarefas apropriadas quando o usuário selecionar Avançar no Assistente de UDI (substituições do método OnNextSelected ), incluindo as seguintes etapas:

    1. Atualize quaisquer variáveis de memória, variáveis de sequência de tarefas, variáveis de ambiente ou informações de arquivo XML.

    2. Atualizar informações da página de resumo (se não for realizada pelos campos na página).

  7. Compile a solução.

    Verifique se a versão da DLL criada é a mesma plataforma de processador que a instalação do MDT, especificamente, a plataforma do processador para o Ambiente de Pré-Instalação do Windows (Windows PE). O Assistente UDI pode ser executado em:

    • O sistema operacional existente no computador de destino. Você pode executar versões de 32 bits da página do assistente em sistemas operacionais Windows de 32 bits ou 64 bits. No entanto, você só pode executar versões de 64 bits da página do assistente em sistemas operacionais Windows de 64 bits.

    • Windows PE no computador de destino. O Windows PE não oferece suporte à execução de aplicativos de 32 bits em uma versão de 64 bits do Windows PE. Portanto, você precisa ter criado uma versão para sua página de assistente para cada arquitetura de processador do Windows PE que planeja usar.

  8. Copie a DLL da página personalizada do assistente para a pasta installation_folder\Templates\Distribution\Tools\ platform (onde installation_folder é a pasta na qual você instalou o MDT e a plataforma é x86 para a versão de 32 bits ou x64 é para a versão de 64 bits).

  9. Conclua as etapas para criar um editor de página personalizado.

Criando editores de página de assistente personalizados

O processo de alto nível para criar editores de página personalizados do assistente UDI é o seguinte:

  1. Faça uma cópia da solução SampleEditor como ponto de partida.

  2. Crie a interface do usuário do editor de página principal em um arquivo .xaml.

  3. Adicione instâncias do controle FieldElementControl conforme exigido pela página do assistente a ser configurada (se necessário).

  4. Adicione instâncias do controle SetterControl conforme exigido pela página do assistente a ser configurada (se necessário).

  5. Adicione instâncias do controle CollectionTControl conforme exigido pela página do assistente a ser configurada (se necessário).

  6. Adicione a interface IDataService .

  7. Escreva o código apropriado para atualizar o arquivo de configuração do Assistente UDI com base nas definições de configuração a serem definidas usando o editor de páginas personalizado do assistente.

  8. Crie caixas de diálogo filho em um arquivo .xaml e chame-as do editor de página principal usando a interface IMessageBoxService conforme exigido pela página do assistente a ser configurada.

  9. Adicione as interfaces apropriadas à Faixa de Opções do Designer do Assistente de UDI com base nos requisitos da página do assistente a ser configurada.

  10. Compile a solução.

    Observação

    Verifique se a versão da DLL criada é a mesma plataforma de processador que a instalação do MDT. Por exemplo, se você instalar a versão de 64 bits do MDT, crie uma versão de 64 bits do editor de página personalizado.

  11. Crie um Assistente de UDI Designer arquivo de configuração para carregar as DLLs necessárias e mapear o editor de páginas do assistente com a página do assistente correspondente (o arquivo SamplePage.dll.config no exemplo).

    Para obter mais informações sobre os elementos necessários para executar o mapeamento entre a página do assistente e o editor de páginas do assistente, consulte o elemento DesignerMappings , elementos filho e atributos correspondentes.

  12. Copie o Assistente de UDI Designer arquivo de configuração criado na etapa anterior para a pasta installation_folder\Bin\Config (onde installation_folder é a pasta na qual você instalou a versão do MDT).

  13. Copie a DLL do editor de páginas do assistente personalizado para a pasta installation_folder\Bin (onde installation_folder é a pasta na qual você instalou o MDT).

Criando tarefas UDI personalizadas

As tarefas UDI são DLLs escritas em C++ que implementam a interface ITask. Registre a DLL com a biblioteca de tarefas Designer do Assistente de UDI criando um arquivo de configuração de Designer do Assistente de UDI (arquivo .config) e colocando-o na pasta installation_folder\Bin\Config (onde installation_folder é a pasta na qual você instalou o MDT).

Observação

Você pode criar uma DLL que contenha páginas de assistente, tarefas e validadores no mesmo arquivo .dll. Você também pode criar um único Assistente de UDI Designer arquivo de configuração (.config) que contenha as definições de configuração para as páginas do assistente, tarefas e validadores na DLL.

Para criar tarefas UDI personalizadas

  1. Escreva o código que implementa a interface ITask e os seguintes métodos:

    • Inicialização. Esse método é chamado para inicializar sua tarefa.

    • Executar. Esse método é chamado para executar sua tarefa.

  2. Escreva o código que registra a fábrica de classe de tarefa personalizada no registro de fábrica.

  3. Compile a solução para sua tarefa personalizada.

    Observação

    Verifique se a versão da DLL criada é a mesma plataforma de processador que a instalação do MDT. Por exemplo, se você instalar a versão de 64 bits do MDT, crie uma versão de 64 bits da tarefa UDI personalizada.

  4. Crie um elemento Task no elemento TaskLibrary no arquivo de configuração do UDI Wizard Designer semelhante ao seguinte trecho:

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

    Observação

    Todos os elementos Task devem incluir o parâmetro BitmapFilename . Especifique todos os outros parâmetros conforme a tarefa exigir. Por exemplo, no trecho anterior, o parâmetro log é usado para especificar um parâmetro para o local de um arquivo de log.

  5. Copie o UDI Wizard Designer arquivo de configuração criado na etapa anterior para a pasta installation_folder\Bin\Config (onde installation_folder é a pasta na qual você instalou o MDT).

  6. Copie a DLL da tarefa personalizada para a pasta da plataforma installation_folder\Templates\Distribution\Tools\ (onde installation_folder é a pasta na qual você instalou o MDT e a plataforma é x86 para a versão de 32 bits ou x64 é para a versão de 64 bits).

Criando validadores de UDI personalizados

Os validadores de UDI são DLLs escritas em C++ que implementam a interface IValidator . Você registra a DLL com a biblioteca do validador de Designer do Assistente de UDI criando um arquivo de configuração de Designer do Assistente de UDI (arquivo .config) e colocando-o na pasta installation_folder\Bin\Config (onde installation_folder é a pasta na qual você instalou o MDT).

Para criar validadores de UDI personalizados

  1. Escreva o código que cria uma subclasse da classe BaseValidator e implementa os seguintes métodos:

    • Init(IControl, *pControl, IWizardPageContainer, *pContainer, IStringProperties, *pProperties). O controlador de formulário chama o membro Init para inicializar o validador. Esse método deve chamar o método Init para a classe BaseValidator . Normalmente, ele lê todas as propriedades definidas para o validador do arquivo de configuração do Assistente de UDI. Por exemplo, o validador InvalidCharactersValidator recupera o valor da propriedade InvalidChars usando esse método.

    • ÉVálido. O controlador de formulário chama esse método para ver se o controle contém texto válido. A seguir, um exemplo do método IsValid para um validador que valida se o campo não está vazio:

      BOOL IsValid(LPBSTR pMessage)
      {
          __super::IsValid(pMessage);
      
          _bstr_t text;
          m_pText->GetText(text.GetAddress());
          return (text.length() > 0);
      }
      
    • Init(IControl *pControl, mensagem LPCTSTR). O controlador de formulário chama esse membro para cada pressionamento de tecla e outros eventos para que o validador possa validar o conteúdo do controle e as mensagens atualizadas na parte inferior da página do assistente (ou limpá-las).

      Normalmente, esses são os únicos métodos que você precisa substituir. No entanto, dependendo do validador, talvez seja necessário substituir outros métodos na subclasse da classe BaseValidator que você criar. Para obter mais informações sobre esses outros métodos, consulte a classe BaseValidator .

  2. Escreva o código que registra a classe de tarefa personalizada no alocador do Registro.

  3. Compile a solução para sua tarefa personalizada.

    Observação

    Verifique se a versão da DLL criada é a mesma plataforma de processador que a instalação do MDT. Por exemplo, se você instalar a versão de 64 bits do MDT, crie uma versão de 64 bits da tarefa UDI personalizada.

  4. Crie um elemento Validator no elemento ValidatorLibrary no arquivo de configuração do UDI Wizard Designer semelhante ao seguinte trecho:

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

    Aviso

    Todos os elementos do validador devem incluir o parâmetro Message . Especifique todos os outros parâmetros conforme exigido pelo validador. Por exemplo, no trecho anterior, o parâmetro NamedPattern é usado para especificar um parâmetro para o nome de um padrão de expressão regular predefinido.

  5. Copie o UDI Wizard Designer arquivo de configuração criado na etapa anterior para a pasta installation_folder\Bin\Config (onde installation_folder é a pasta na qual você instalou o MDT).

  6. Copie a DLL da tarefa personalizada para a pasta da plataforma installation_folder\Templates\Distribution\Tools\ (onde installation_folder é a pasta na qual você instalou o MDT e a plataforma é x86 para a versão de 32 bits ou x64 é para a versão de 64 bits).

Referência do Assistente UDI

Componentes da Página do Assistente

Você pode usar qualquer um dos vários componentes predefinidos para criar suas páginas personalizadas.

Criar instâncias de componente

O Assistente UDI usa fábricas de classe para criar novas instâncias de objetos para você. Essas fábricas são registradas com um registro de fábrica, usando uma cadeia de caracteres como a chave para a fábrica. Por exemplo, o componente WmiRepository é identificado pela cadeia de caracteres "Microsoft.Wizard.WmiRepository", que está disponível no arquivo de cabeçalho IWmiRepository como ID_WmiRepository.

Supondo que você tenha escrito sua página como uma subclasse de WizardPageImpl, você pode criar uma nova instância de um WmiRepoistory como este:

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

A função CreateInstance é uma função de modelo fortemente tipado para criar novas instâncias de componentes. PWmiRepository é um ponteiro inteligente, portanto, ele lida com a contagem de referências para você.

Componentes que podem ser criados

Há um conjunto de componentes que você pode registrar no Registro. O primeiro conjunto de componentes é sempre registrado, pois o arquivo executável principal do Assistente de UDI o fornece. Os outros dois conjuntos de componentes são fornecidos em DLLs "opcionais". Para que esses componentes estejam disponíveis, a DLL deve ser listada na seção DLLs do arquivo XML .config. Seu código não precisa saber qual executável contém um componente específico.

A lista de IDs de componentes para componentes (o nome do componente é o mesmo que o ID, mas sem o ID_ inicial) registrada no registro de fábrica (definido no OSDSetupWizard) é mostrada na Tabela 3.

Tabela 3. IDs de componente

ID Descrição
ID_ACPowerTask (ITask, IWizardComponent) Uma tarefa de simulação que garante que o computador não esteja funcionando apenas com a bateria
ID_AppDiscoveryTask (ITask, IWizardComponent) Uma tarefa especializada para descobrir quais itens de software você instalou em seu computador
ID_BackgroundTask (IBackgroundTask, IWizardComponent) Pode ser usado para executar uma tarefa em outro thread
ID_CopyFilesTask (ITask, IWizardComponent) Uma tarefa para copiar um ou mais arquivos
ID_FormController (IFormController) Você mais gostará de não precisar criar uma instância por conta própria, pois sua página recebe sua própria instância
ID_InvalidCharactersValidator (IValidador) Garante que nenhum campo de texto contenha caracteres de uma lista fornecida ao validador
ID_Logger (ILogger) É mais provável que você não precise criar uma instância por conta própria, pois sua página recebe um ponteiro para a instância compartilhada
ID_NonEmptyValidator (IValidador) Um validador que garante que nenhum campo esteja vazio
ID_PasswordValidator (IValidador) Um validador que garante que dois campos de texto não tenham o mesmo conteúdo
ID_Regex (IRegEx) Avalia expressões regulares, procurando por correspondências
ID_RegExValidator (IValidador) Um validador que valida em relação a uma expressão regular ou a um padrão conhecido
ID_SimpleStringProperties (IStringProperties, ISimpleStringProperties) Fornece uma maneira simples de enviar propriedades para tarefas sem usar XML
ID_ShellExecuteTask (ITask, IWizardComponent) Executar um programa externo
ID_SummaryBag (ISummaryBag) Disponível indiretamente em sua página por meio do método Form
ID_TaskManager (ITaskManager, IBackgroundCallback, IWizardComponent) Gerencia a execução de um conjunto de tarefas e a interface do usuário
ID_WmiRepository (IWmiRepository, IWizardComponent) Permite executar consultas WMI (Instrumentação de Gerenciamento do Windows)
ID_IXmlDocument (IXmlDocument) Fornece uma fachada para leitura e gravação de documentos XML

Os OSDRefreshWizard.dll definidos, páginas compartilhadas e outros componentes de controle são mostrados na Tabela 4 e na Tabela 5.

Tabela 4. Controles de diretório

ID Descrição
ID_Directory (IDirectory) Uma fachada para obter informações de diretório do sistema de arquivos

Tabela 5. SharedPages.dll definido

ID Descrição
ID_ADHelper (IADHelper) Fornece uma fachada para um conjunto limitado de recursos no Active Directory® Domain Services (AD DS)
ID_CpuInfo (ICpuInfo) Determina se a sua CPU é de 32 ou 64 bits
ID_DomainJoinValidator (IDomainJoinValidator) Possui alguns métodos para verificar se um conjunto de credenciais tem permissão para ingressar em um domínio
ID_DriveList (IDriveList, IBindableList, IWizardComponent) Usa o WMI para obter uma lista de unidades no computador
ID_WiredNetworkTask (ITask) Uma tarefa que verifica se você está conectado à rede com um adaptador de rede com fio (em vez de sem fio)

Componentes de Controle

Você interage com os controles em sua página por meio da função de modelo GetControlWrapper , que fornece acesso a um dos tipos de componentes listados na Tabela 6.

Tabela 6. Componentes

Caixa de diálogo tipos de controle Descrição
CONTROL_CHECK_BOX (ICheckBox) Uma fachada para trabalhar com controles de caixa de marcação
CONTROL_COMBO_BOX (IComboBox) Uma fachada para controles de caixa de combinação
CONTROL_GENERIC (IControl) Permite trabalhar com a maioria dos tipos de controles para controlar o estado habilitado e visível
CONTROL_LIST_VIEW (IListView) Uma fachada que fornece acesso aos recursos de um controle de exibição de lista
CONTROL_PROGRESS_BAR (IProgressBar) Uma fachada para trabalhar com a posição de um controle de barra de progresso
CONTROL_RADIO_BUTTON (IRadioButton) Uma fachada para trabalhar com controles de botão de opção
CONTROL_STATIC_TEXT (IStaticText) Uma fachada que fornece permissão de leitura/gravação para o texto de um controle, como um rótulo ou caixa de texto
CONTROL_TREE_VIEW (ItreeView) Uma fachada para trabalhar com um controle de visualização em árvore

Componente Lista de Imagens

Esse componente é uma fachada para um controle ImageList em sua página. Você cria uma lista de imagens por meio da interface IListView ou ITreeView .

Componente FormController

O assistente cria esse componente para você e o passa para sua página. Você o acessa de sua página usando o método Form , que a classe base WizardPageImpl implementa.

Componente InvalidCharacterValidator

Esse é um tipo de validador que você pode incluir em uma página. A ID é ID_InvalidCharactersValidator (definida em IValidator.h), que tem um valor de texto de "Microsoft.Wizard.Validation.InvalidChars".

Esse validador procura uma única propriedade (um elemento Setter no arquivo .config) chamada InvalidChars, que é uma lista de caracteres que não são permitidos. Ele verifica os caracteres em uma caixa de texto; Se o texto contiver algum caractere dessa lista, o componente relatará falha.

Componente NonEmptyValidator

Esse é um tipo de validador que você pode incluir em uma página. A ID é ID_NonEmptyValidator (definida em IValidator.h), que tem um valor de texto de "Microsoft.Wizard.Validation.NonEmpty".

Esse validador relatará falha se a caixa de texto (ou qualquer outro controle que dê suporte a IStaticText) tiver um valor de cadeia de caracteres vazia.

Componente PasswordValidator

Esse é um tipo de validador que você pode incluir em uma página. A ID é ID_PasswordValidator (definida em IValidator.h), que tem um valor de texto de "Microsoft.Wizard.Validation.Password".

Esse validador trabalha com dois controles de texto diferentes (controles que dão suporte a IStaticText) e relata a falha se eles não contiverem os mesmos valores. Em outras palavras, ele falhará se as caixas de texto Senha e Confirmar Senha não corresponderem.

Como esse validador requer dois controles, ele precisa de mais configuração do que outros validadores. A configuração pode ser algo assim:

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

Primeiro, você define o controle Confirmar Senha como um "filho" do controle de Senha . Dessa forma, se o controlador de formulário desabilitar o controle de senha , ele também desativará o controle Confirmar senha . Em seguida, adicione um validador de senha ao formulário. Por fim, forneça ao validador de senha a interface para o controle Confirmar senha .

Devido ao requisito de dois controles, você deve usar código para configurar esse validador em vez do arquivo XML .config.

Componente RegExValidator

Esse é um tipo de validador que você pode incluir em uma página. A ID é ID_RegExValidator (definida em IValidator.h), que tem um valor de texto de "Microsoft.Wizard.Validation.RegEx".

Esse validador compara o conteúdo de um controle de texto (um que dá suporte a IStaticText) com uma expressão regular e falha se o texto não corresponder à expressão regular.

Como alternativa, você pode usar esse validador com um padrão nomeado predefinido. Para usar uma expressão regular, o XML deve conter uma propriedade setter chamada Pattern. Se você quiser usar um padrão nomeado, use um setter chamado NamedPattern definido como um dos valores na Tabela 7.

Tabela 7. Modeladores nomeados

Padrão de Descrição
Nome de usuário Verifica se o texto é do formato, domain\user ou user@domain
Nome do computador O nome deve ter entre 1 e 15 caracteres e não pode incluir um conjunto de caracteres (como: e ?)
Workgroup O nome deve ter entre 1 e 15 caracteres e não pode conter um conjunto de caracteres (como =, + e ?)

Componente do FactoryRegistry

Este componente mantém o controle de todas as fábricas e serviços de classe. Ele implementa a interface IFactoryRegistry e está disponível indiretamente por meio do método Container da sua página. Além disso, o registro carrega DLLs de extensão. Depois de carregar uma DLL, o registro procura uma função exportada chamada RegisterFactories. Você deve implementar essa função e nela registrar as fábricas de classe para suas páginas, tarefas e validadores (e quaisquer outras fábricas de classe que você deseja registrar). Aqui está um exemplo do projeto de exemplo:

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

Componente Logger

Esse componente está disponível para sua página por meio do método Logger (implementado por WizardPageImpl). Use esse método para gravar entradas no arquivo de log. O conteúdo do arquivo de log é útil para diagnosticar problemas que os usuários possam ter ao executar o Assistente de UDI.

Componente PropertyBag

O recipiente de propriedades é um contêiner para variáveis de memória. Ele está disponível em sua página usando Container()->Properties(). As variáveis de memória são úteis para passar dados temporários entre páginas diferentes.

Componentes TSVariableBag e TSRepository

O componente TSVariableBag permite ler e gravar variáveis de sequência de tarefas. Ele mantém os valores na memória até que o usuário selecione Concluir (por padrão). Você pode acessar o repositório TSVariable por meio do método TSVariables da página (implementado pela classe base WizardPageImpl ). Esses componentes registram todas as leituras e gravações de variáveis de sequência de tarefas.

Componente WmiRepository

Esse componente fornece uma fachada para trabalhar com consultas WMI. Você pode chamar a função auxiliar CreateInstance com ID_WmiRepository para obter uma instância desse componente, que dá suporte à interface IWmiRepository . Esse componente retorna registros de resultado por meio da interface IWmiIterator .

Classes auxiliares de página do assistente

Você pode criar páginas personalizadas do assistente UDI usando classes auxiliares internas fornecidas com o SDK da UDI. A Tabela 8 lista as classes auxiliares que você pode usar para criar páginas de assistente personalizadas.

Tabela 8. Classes auxiliares

Classe auxiliar Descrição
ClassFactoryImpl Class Essa é uma classe base útil para criar uma fábrica de classes que você pode registrar no registro da fábrica.
Classe de Modelo de Interface Use essa classe de modelo quando quiser criar um componente que implemente mais de uma interface.
Classe Auxiliar de Caminho Essa classe fornece operações comuns de arquivo/diretório.
Classe de Modelo de Ponteiro Essa classe fornece contagem de referência para gerenciamento de tempo de vida em componentes COM. É importante liberar interfaces quando terminar de usá-las. Essa classe de modelo lida com o tempo de vida automaticamente.
Classe PUnknown Essa classe é um ponteiro inteligente específico para a interface IUnknown . Para todas as outras interfaces, use a classe de modelo Pointer.
Classe auxiliar StringUtil Essa classe fornece métodos auxiliares que facilitam o trabalho com cadeias de caracteres.
Classe de modelo de subinterface Essa classe base facilita a implementação de um componente que dá suporte a uma interface que herda de outra interface.
Classe de modelo UnknownImpl Essa classe lida com a maioria dos detalhes da criação de um componente COM.
Classe de modelo WizardComponent Essa classe base é usada para criar componentes que precisam de acesso aos serviços do assistente, como criação e registro em log de componentes.
WizardPageImpl Classe de modelo Essa classe base deve ser usada como a classe base para todas as páginas personalizadas do assistente

ClassFactoryImpl Class

Essa é uma classe base útil para criar uma fábrica de classes que você pode registrar no registro da fábrica.

Veja a seguir um trecho do arquivo LocationPage.h no projeto de exemplo para definir a classe ClassFactoryImpl .

#pragma once

#include "ClassFactoryImpl.h"

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

A seguir, um trecho do arquivo de LocationPage.cpp na página do assistente de exemplo usado para definir a fábrica de classes para a página.

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

Classe de Modelo de Interface

Use essa classe de modelo quando quiser criar um componente que implemente mais de uma interface, por exemplo:

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

Esse código cria uma cadeia de classe base que dá suporte a IFieldCalback e às interfaces compatíveis com WizardPageImpl (que por acaso são IWizardPage).

Classe Auxiliar de Caminho

Essa classe fornece operações comuns de arquivo/diretório:

static inline std::wstring GetModulePath(HINSTANCE hModule)

Ele também retorna o caminho completo para o arquivo .exe ou .dll com o identificador de instância que você fornece para este método:

static inline std::wstring GetModuleFilename(HINSTANCE hModule)

A classe retorna o caminho completo e o nome do arquivo do .exe e .dll arquivo com o identificador de instância que você fornece para este método:

static inline std::wstring GetDirectoryName(LPCWSTR fullName)

. . . ou apenas o caminho ao remover o nome do arquivo:

static inline std::wstring GetFileName(LPCWSTR fullName)

Dado um caminho com um nome de arquivo, a classe auxiliar de caminho retorna apenas o nome do arquivo:

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

Por fim, a classe retorna uma nova cadeia de caracteres que é o caminho combinado e o nome do arquivo (ou outro caminho).

Classe de Modelo de Ponteiro

Essa classe é definida em Pointer.h. Como os componentes COM usam a contagem de referências para gerenciamento de tempo de vida, é importante que você sempre libere as interfaces quando terminar de usá-las. A Microsoft fornece uma classe de modelo que lida com o tempo de vida automaticamente. Por exemplo, se você quiser um ponteiro inteligente para uma interface XML, poderá escrever algo assim:

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

A primeira linha define o ponteiro inteligente. A segunda linha mostra a recuperação de um ponteiro inteligente por meio de outra chamada. O operador & sempre libera uma interface existente se contiver uma e retorna o endereço para o ponteiro interno. Depois de recuperar um ponteiro como esse, a instância Pointer chama Release para você quando a variável sai do escopo. A Microsoft recomenda que você use ponteiros inteligentes em vez de chamar AddRef e Release manualmente.

Além disso, a classe de ponteiro inteligente Pointer chama QueryInterface para recuperar outras interfaces para você. Por exemplo, quando o registro de fábrica cria uma nova instância de um componente, ele tem um código como este:

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

A primeira linha chama QueryInterface nos bastidores para solicitar a interface IWizardComponent . O ponteiro inteligente resultante será igual a nullptr se o componente não der suporte a essa interface.

Classe PUnknown

Essa classe é um ponteiro inteligente específico para a interface IUnknown . Para todas as outras interfaces, use a classe de modelo Pointer .

Classe auxiliar StringUtil

Essa classe é definida em Utilities.h e fornece métodos auxiliares que facilitam o trabalho com cadeias de caracteres:

static inline int CompareIgnore(LPCWSTR first, LPCWSTR second)

Esse método compara duas strings ignorando maiúsculas e minúsculas (consulte a Tabela 9).

Tabela 9. Classe auxiliar StringUtil

Retorna Descrição
0 Strings correspondem, ignorando maiúsculas e minúsculas
<0 Primeiro < segundo
>0 Primeiro > segundo

Veja um exemplo:

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

Esses métodos são um pouco como os métodos de formato Microsoft .NET, no sentido de que os parâmetros estão na forma de {0}. No entanto, elas não executam nenhuma formatação da entrada — apenas substituição:

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)

Esses são wrappers em torno do StringCchPrintf que retornam um wstring para que você não precise alocar memória para cadeias de caracteres ou buffers por conta própria.

Classe de modelo de subinterface

Essa classe base facilita a implementação de um componente que dá suporte a uma interface que herda de outra interface. Por exemplo, a interface ICheckBox herda de IControl. Veja como essa classe é usada para definir o CheckBoxWrapper:

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

A interface base é o primeiro parâmetro, enquanto a interface derivada é o segundo parâmetro.

Classe de modelo UnknownImpl

Essa classe é definida em UnknownImpl.h e lida com a maioria dos detalhes da criação de um componente COM. Aqui está um exemplo de como você usaria essa classe base:

classDirectory :public UnknownImpl<IDirectory>

Esse código define uma classe que dá suporte à interface IDirectory .

Classe de modelo WizardComponent

Essa classe é definida em IWizardComponent.h e é uma classe base útil para criar componentes que precisam de acesso aos serviços do assistente, como criação e registro em log de componentes.

Como exemplo, veja como o componente CopyFilesTask é definido:

classCopyFilesTask :public WizardComponent<ITask>
{
    ...

O parâmetro para essa classe de modelo é a interface "principal" que você deseja usar para seu componente, que no caso de tarefas é ITask. O uso de WizardComponent significa que o componente dá suporte à interface fornecida (ITask neste exemplo) e ao IWizardComponent.

Sempre que você usa o registro de fábrica de classes para criar um novo componente, o registro chama o método IWizardComponent-SetContainer> do componente para fornecer ao componente acesso aos serviços do assistente.

WizardPageImpl Classe de modelo

Use essa classe como a classe base para suas páginas personalizadas, por exemplo:

class LocationPage :public WizardPageImpl<IDD_LOCATION_PAGE>

O parâmetro é a ID do recurso para seu modelo de caixa de diálogo.

Interfaces de Página do Assistente

O Assistente UDI usa interfaces para acessar os diferentes controles em sua página. Na sua página, você usa a função GetControlWrapper para recuperar um wrapper de controle. Veja um exemplo:

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

Aqui, PStaticText é um ponteiro inteligente para a interface IStaticText . Os ponteiros inteligentes chamam automaticamente o método COM Release() quando saem do escopo ou você passa o endereço de uma variável (como &pFormat) para um método.

IADHelper Interface

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

HRESULT Init(ILogger *pLogger)

Inicialize esse componente, passando-o para o agente para que ele possa registrar informações.

HRESULTValidLogon(nome de usuário LPCTSTR, senha LPCTSTR, domínio LPCTSTR)

Esse método verifica se um conjunto de credenciais é válido, conforme mostrado na Tabela 10.

Tabela 10. HResultValidLogon

HResult Descrição
S_OK As credenciais são válidas
S_FALSE As credenciais não são válidas
E_FAIL Não foi possível localizar o controlador de domínio; Marque logs para obter detalhes
HRESULT HasAccess(nome de usuário LPCTSTR, senha LPCTSTR, domínio LPCTSTR, computerName LPCTSTR, accountDomain LPCTSTR)

Esse método verifica se um conjunto de credenciais tem acesso de leitura/gravação ao objeto de computador no AD DS, conforme mostrado na Tabela 11.

Tabela 11. HResult HasAccess

HRESULT Descrição
S_OK O usuário tem acesso
E_FAIL O usuário não tem acesso. Verifique o arquivo de log para obter informações adicionais.

IBackgroundTask Interface

__interface IBackgroundTask : IUnknown
{
    HRESULT Init(ITask *pTask, int id, IBackgroundCallback *pCallback);
    void Start(void);
    BOOL Running(void);
    HRESULT Wait(DWORD waitMilliseconds);
    HRESULT Terminate(DWORD exitCode);
    HRESULT GetExitCode(LPDWORD pCode, HRESULT *pHresult);
    HRESULT Close(void);
};
Visão Geral

A página Progresso usa essa classe para executar tarefas em um thread separado. Você também pode usar essa classe sempre que quiser executar operações em um thread separado. Tarefas são qualquer classe que dê suporte à interface ITask .

Essa interface é implementada pelo componente ID_BackgroundTask ("Microsoft.Wizard.BackgroundTask"), definido na interface IBackgroundTask.h.

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

Essa interface inicializa o componente, conforme mostrado na Tabela 12.

Tabela 12. Inicialização HRESULT

Parâmetro Descrição
pTask Ponteiro para a classe que contém o código que você deseja executar em outro thread
Id Um número que você pode usar no método Finished do retorno de chamada para informar qual tarefa terminou de ser executada; Útil se você iniciar várias tarefas com o mesmo método de retorno de chamada
pCallback Uma classe que implementa o método Finished , que é chamado sempre que uma tarefa termina de ser executada; a chamada para o método Completed estará no thread em segundo plano, não no thread da interface do usuário
void Start(void)

Esse método inicia a tarefa em um thread em segundo plano e retorna os elementos mostrados na Tabela 13.

Tabela 13. Retornar thread em segundo plano

Retorna Descrição
E_INVALIDARG A tarefa já está em execução, portanto você não pode iniciá-la agora.
E_FAIL Ocorreu um problema ao iniciar o tópico.
S_OK O tópico foi iniciado.
BOOL Running()

Esse método retornará TRUE se a tarefa em segundo plano estiver em execução no momento e FALSE se não estiver em execução.

HRESULT Wait(DWORD waitMilliseconds)

Esse método aguarda até que o thread pare de ser executado ou o número de milissegundos tenha decorrido.

HRESULT Terminate(DWORD, exitCode)

Esse método elimina o thread que está em execução (consulte a Tabela 14 e a Tabela 15). Esse processo pode levar um curto período de tempo para ser concluído após o retorno desse método.

Tabela 14. Código de saída de término HRESULT

Parâmetro Descrição
exitCode O código de saída que será enviado para o método de retorno de chamada Finished, que também estará disponível no método GetExitCode .

Tabela 15. Códigos de Rescisão

Retorna Descrição
E_FAIL A chamada para encerrar falhou.
S_OK A solicitação para encerrar o segmento foi bem-sucedida.
HRESULT: GetExitCode(LPDWORD, pCode, HRESULT *pHresult)

Use esse método para obter os resultados da execução da tarefa no thread em segundo plano (consulte a Tabela 16).

Tabela 16. Códigos de resultado

Parâmetro Descrição
pCode Ponteiro para um DWORD que será definido em return ou nullptr se você não precisar do valor retornado. Na saída, esse parâmetro é definido como STILL_ACTIVE se o thread estiver em execução, o código retornado pelo método Execute da tarefa ou o valor passado para o método Terminate se você chamou esse método.
pHresult Ponteiro para um HRESULT que será definido como return ou nullptr se você não precisar do valor HRESULT .
HRESULT Close(void)

Esse método libera o thread em segundo plano. Ele retorna E_INVALIDARG se o thread estiver em execução no momento e S_OK caso contrário.

ICheckBox Interface

__interface ICheckBox : IControl
{
    void Check(BOOL check);
    BOOL IsButtonChecked();
};
Verificação nula (verificação BOOLIANA marcar)

Marque o estado marcado da caixa de marca. Quando o método é TRUE, a caixa de marca é marcada; quando o método é FALSE, a caixa de marca é desmarcada.

BOOL IsButtonChecked()

Esse método informa o estado de marcação atual de uma caixa de marca seleção.

IComboBox Interface

__interface IComboBox : IControl
{
    HRESULT Bind([in] IBindableList *pList);
    HRESULT Select(int index);
    int Selected(void);
    void Add([in] LPCTSTR caption);
    HRESULT GetText([out, retval] LPBSTR pText);
    void Clear();
};
Visão Geral

Essa interface é implementada pelo componente CheckBoxWrapper . Você recupera uma instância desse componente usando a função auxiliar GetControlWrapper com o tipo CONTROL_COMBO_BOX.

HRESULT: Bind([in] IBindableList *pList)

Use esse método quando você tiver uma fonte de dados que implemente a interface IBindableList . A caixa de listagem inicializa o conteúdo com as legendas dessa lista.

HRESULT Select(int index)

Selecione o item na caixa de combinação no índice.

int Selected(void)

Esse método retornará o índice do item selecionado ou -1 se nada estiver selecionado.

void Add([in] LPCTSTR legenda)

Adicione manualmente um item à caixa de combinação.

HRESULT GetText([out, retval] LPBSTR pText)

Recupere a cadeia de caracteres do item selecionado no momento na caixa de combinação.

void Clear()

Remova todos os itens da caixa de combinação.

IControl Interface

__interface IControl : IUnknown
{
    HRESULT SetEnable(BOOL enable);
    BOOL IsEnabled(void);
    HRESULT SetVisible(BOOL visible);
};
Visão Geral

Essa interface é implementada pelo componente ControlWrapper . Você recupera uma instância desse componente usando a função auxiliar GetControlWrapper com o tipo CONTROL_GENERIC.

HRESULT SetEnable(BOOL habilitado)

Habilite ou desabilite o controle.

BOOL IsEnabled(void)

Retorna VERDADEIRO se o controle estiver habilitado, FALSO se não estiver.

HRESULT SetVisible(BOOL visible)

Mostrar ou ocultar o controle.

ICpuInfo Interface

__interface ICpuInfo : IUnknown
{
    BOOL Is64Bit(void);
};
Visão Geral

Você obtém essa interface criando um novo componente ID_CpuInfo . O método único informa se a CPU é de 32 ou 64 bits. Observe que, se você tiver um sistema operacional de 32 bits em um computador de 64 bits, esse método retornará TRUE, pois ele está relatando apenas a largura da CPU (não o sistema operacional).

IDirectory Interface
__interface IDirectory : IUnknown
{
    BOOL FileExists(LPCWSTR name);
    BOOL FindFirst([in] LPCWSTR name);
    HRESULT FoundName([out, retval] LPBSTR name);
    DWORD FoundAttributes(void);
    BOOL FindNext(void);
    void FinishFind(void);
};
Visão Geral

O componente Diretório , que você cria usando o ID_Directory, fornece uma fachada para trabalhar com diretórios no sistema de arquivos.

BOOL FileExists (nome LPCWSTR)

Esse método retornará TRUE se existir um arquivo com o nome fornecido.

BOOL FindFirst([in] nome LPCWSTR)

Esse método localiza uma primeira correspondência para o nome fornecido. Ele dá suporte a caracteres curinga e retorna nomes de arquivo e diretório. O método retornará TRUE se uma correspondência for encontrada, caso contrário, FALSE.

HRESULT FoundName([out, retval] nome LPBSTR)

Esse método recupera o nome do arquivo encontrado com uma chamada para FindFirst ou FindNext.

DWORD: FoundAttributes(void)

Esse método retorna o atributo para o arquivo ou diretório encontrado mais recentemente. Você pode usar o código da seguinte maneira para testar se é um diretório:

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

Encontre o próximo. Esse método retorna TRUE se outra correspondência foi encontrada, caso contrário, FALSE.

void FinishFind(void)

Esse método libera recursos usados para a operação Localizar.

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);
};
Visão Geral

Você obtém uma instância dessa interface usando o valor ID_DomainJoinValidator para a função de modelo CreateInstance .

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

Inicialize a instância, conforme mostrado na Tabela 17.

Tabela 17. HRESULT Init - Inicialização da instância

Parâmetro Descrição
pLogger A instância do agente, que está disponível para sua página por meio do método Logger da página
pContainer Transmite os resultados do método Container da página
pNome de usuário A caixa de texto que contém o nome de usuário a ser validado
pPassword A caixa de texto que contém a senha a ser validada
PComputerName A caixa de texto que contém o nome do computador que eventualmente ingressará no domínio
HRESULT IsUsernameValid(LPCWSTR domainName)

Esse método usa o método IADHelper-ValidLogon> para fazer o trabalho. Confira esse método para obter detalhes.

BOOL CanModifyComputerAdEntry(LPCWSTR domainName)

Verifique se o usuário tem direitos para modificar a entrada do computador. A maior parte do trabalho é feita pelo IADHelper-HasAccess>. Se esse método retornar FALSE, Marque o arquivo de log para obter detalhes.

IDriveList Interface

__interface IDriveList : IUnknown
{
    HRESULT Init(IWmiRepository *pWmi);
    HRESULT SetWhereClause(LPCTSTR whereClause);
    HRESULT SetMinimumDriveSize(__int64 size);
    HRESULT Update(void);
    HRESULT AddProperty(ENUM_DISK_QUERY_SECTION section, LPCTSTR propName, LPCTSTR propNameReturned);

    size_t Count(void);
    HRESULT GetProperty(size_t index, LPCTSTR propName,  LPVARIANT value);
    HRESULT GetCaption(size_t index,  LPBSTR pCaption);
}
HRESULT Init(IWmiRepository *pWmi)

Chame esse método antes de chamar qualquer outro componente. Você precisará criar um novo WmiRepository antes de chamar esse método.

HRESULT SetWhereClause(LPCTSTR whereClause)

Esse método permite adicionar texto que aparecerá como uma cláusula "where" na consulta. Por exemplo, a linha a seguir retorna somente unidades USB:

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

Defina minimizar o tamanho da unidade, em bytes, para as unidades que serão retornadas da consulta.

Atualização HRESULT (nula)

Execute a consulta. A lista de unidades disponível após chamar esse método é classificada por letra de unidade.

Seção HRESULT AddProperty(ENUM_DISK_QUERY_SECTION, LPCTSTR propName, LPCTSTR propNameReturned)

Esse método adiciona os nomes de propriedades adicionais que você deseja disponibilizar nos resultados da consulta. Chame esse método antes de chamar Update. A Tabela 18 mostra três das propriedades úteis.

Tabela 18. HRESULT AddProperty: Propriedades úteis

Section Propriedade Descrição
DISKQUERY_LOGICALDISK Tamanho O tamanho, em bytes, representado como uma cadeia de caracteres
DISKQUERY_DISKPARTITION DiskIndex O número do disco como um inteiro, começando com 0
DISKQUERY_LOGICALDISK VolumeName O rótulo do volume
size_t Count(void)

O número de registros retornados pela consulta. Chame Update antes de chamar esse método.

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

Esse método recupera o valor de uma propriedade dos resultados da consulta, conforme mostrado na Tabela 19.

Tabela 19. HRESULT GetProperty

Parâmetro Descrição
Índice Índice baseado em zero para o registro de resultado
propName Nome da propriedade, como "Tamanho"
Valor Em retorno, este parâmetro contém um valor variante da propriedade
HRESULT GetCaption(índice size_t, LPBSTR pCaption)

Esse método recupera a legenda de um registro que é o mesmo que a propriedade Caption.

IImageList Interface

__interface IImageList
{
    HRESULT CreateImageList(int width, int height, UINT flags);
    HImageList GetImageList(void);
    int AddImage(HInstance hInstance, int resourceId);
};
Visão Geral

Essa interface é implementada pelo componente ImageList . Você recupera uma instância desse componente da interface IListView .

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

Crie uma nova lista de imagens, gerenciada por este componente. Chame esse método apenas uma vez.

HImageList GetImageList(void)

Esse método retorna o identificador da lista de imagens caso você precise executar outras operações na lista de imagens.

int AddImage(HInstance hInstance, int resourceId)

Adicione uma nova imagem à lista de imagens de um recurso, conforme mostrado na Tabela 20.

Tabela 20. HRESULT IImageList Interface

Parâmetro Descrição
hInstance Identificador de instância do módulo que contém o recurso de bitmap
resourceId ID do recurso a ser carregado na lista de imagens

IListView Interface

__interface IListView : IControl
{
    int AddItem([in] LPCTSTR text);
    int AddColumn(int width, [in] LPCTSTR text);
    HRESULT SetSubItem(int index, int column, [in] LPCTSTR text);
    int GetWidth(void);
    void SetExtendedStyle(DWORD style);
    int GetSelectedItem(void);
    HRESULT SelectItem(int index);
    BOOL IsItemChecked(int index);
    int GetItemCount(void);
    HRESULT CreateImageList(int width, int height, UINT flags);
    int AddImage(HINSTANCE hInstance, int resourceId);
    HRESULT SetImage(int index, int imageIndex);
    HRESULT Clear(void);
};
Visão Geral

Essa interface é implementada pelo componente ControlWrapper . Você recupera uma instância desse componente usando a função auxiliar GetControlWrapper com o tipo CONTROL_LIST_VIEW.

int AddItem([in] LPCTSTR text)

Adicione uma nova linha à caixa de listagem. O método retorna o índice do item que acabou de ser adicionado.

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

Adicionar uma nova coluna ao modo de exibição de lista.

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

Defina o texto em uma coluna diferente da primeira coluna da caixa de listagem, conforme mostrado na Tabela 21.

Tabela 21. HRESULT SetSubItem

Parâmetro Descrição
índice O índice do item de lista que você deseja modificar
coluna O índice da coluna que você deseja atualizar; a primeira coluna é definida com AddItem, as colunas dois e seguintes são definidas com esse método
text A cadeia de caracteres a ser mostrada na coluna
int GetWidth(void)

Esse método retorna a largura de toda a caixa de texto.

void SetExtendedStyle(estilo DWORD)

Esse método permite definir estilos estendidos na caixa de listagem — por exemplo:

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

Este método retorna o índice do item de exibição de lista atualmente selecionado.

HRESULT SelectItem(int index)

Define o item selecionado na lista para este índice.

BOOL IsItemChecked(índice int)

Esse método retornará VERDADEIRO se um item na lista estiver selecionado. Esse método requer que você chame SetExtendedStyle para definir o estilo da caixa de marca seleção.

int GetItemCount(void)

Esse método retorna o número de itens no modo de exibição de lista.

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

Crie uma nova lista de imagens e anexe-a ao modo de exibição de lista.

int AddImage(HINSTANCE hInstance, int resourceId)

Adicione uma imagem à lista de imagens do modo de exibição de lista. Você precisa chamar CreateImageList primeiro.

HRESULT SetImage(int index, int imageIndex)

Defina a imagem que será mostrada no lado esquerdo para um item específico do modo de exibição de lista.

HRESULT Limpar (nulo)

Remova todos os itens da exibição de lista.

IProgressBar Interface

__interface IProgressBar : IControl
{
    HRESULT SetPercentage(int position);
    int GetPercentage(void);
};
Visão Geral

Essa interface é implementada pelo componente ProgressBarWrapper . Você recupera uma instância desse componente usando a função auxiliar GetControlWrapper com o tipo CONTROL_PROGRESS_BAR.

HRESULT SetPercentage(int position)

Definir a posição da barra de progresso usando um número entre 0 e 100. Por padrão, as novas barras de progresso do Win32® têm um intervalo máximo de 100.

int GetPercentage(void)

Esse método retorna a posição atual da barra de progresso.

IRadioButton Interface

__interface IRadioButton : IControl
{
public:
    void SetGroup(int firstId, int lastId);
    void CheckRadio(int id);
    BOOL IsButtonChecked(int id);
    void EnableRadio(int id, BOOL enable);
};
Visão Geral

Essa interface é implementada pelo componente RadioButtonWrapper . Você recupera uma instância desse componente usando a função auxiliar GetControlWrapper com o tipo CONTROL_RADIO_BUTTON.

void SetGroup(int firstId, int lastId)

Forneça ao wrapper o intervalo de botões de opção que devem ser tratados como um grupo. Chame esse método antes de chamar CheckRadio.

void CheckRadio(int id)

Defina o botão de opção específico como o único botão no grupo de botões de opção selecionado. Chame SetGroup antes de chamar esse método.

BOOL IsButtonChecked(int id)

Esse método retorna TRUE se o botão de opção estiver selecionado no momento, caso contrário, FALSE.

void EnableRadio(int id, BOOL enable)

Esse método habilita ou desabilita um botão de opção.

IStaticText Interface

__interface IStaticText : IControl
{
    HRESULT SetText([in] LPCTSTR pText);
    HRESULT GetText([out, retval] LPBSTR pText);
};
Visão Geral

Essa interface é implementada pelo componente StaticTextWrapper . Você recupera uma instância desse componente usando a função auxiliar GetControlWrapper com o tipo CONTROL_STATIC_TEXT.

HRESULT SetText([in] LPCTSTR pText)

Defina o texto para o controle.

HRESULT GetText([out, retval] LPBSTR pText)

Esse método retorna o valor atual do texto para o controle.

ITask Interface

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

Implemente essa interface se quiser que seu componente esteja disponível como uma tarefa na página de comprovação ou se quiser usar o componente BackgroundTask para executar o trabalho em um thread em segundo plano.

Aqui estão os componentes que implementam a interface ITask :

  • ID_ShellExecuteTask, L"Microsoft.Wizard.ShellExecuteTask"

  • ID_CopyFilesTask, L"Microsoft.Wizard.CopyFilesTask"

  • ID_ACPowerTask, L"Microsoft.OSDRefresh.ACPowerTask"

  • ID_WiredNetworkTask, L"Microsoft.SharedPages.WiredNetworkTask"

Inicialização
HRESULT Init(IStringProperties *pProperties, ISettingsProperties *pTaskSettings)

Se você estiver escrevendo uma tarefa para a página de comprovação, chame esse método para inicializar sua tarefa. O arquivo .config contém XML que pode ser algo assim:

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

O parâmetro pProperties fornece acesso aos três valores setter, enquanto o parâmetro pTaskSettings fornece acesso ao elemento Task e aos filhos. A maioria das tarefas só precisa ler dados do parâmetro pProperties .

Executar
HRESULT Execute(LPDWORD pReturnCode)

Aqui é onde você escreve o código que executa a tarefa. Esse método deve retornar S_OK se não houver erros e poderá retornar outro HRESULT se um erro ocorreu enquanto a tarefa estava em execução. Valores diferentes de S_OK retornados por esse método corresponderão a <elementos Error> na <seção ExitCodes> se você estiver usando a página de comprovação.

O parâmetro pReturnCode deve ser atualizado com um número que informe o estado da tarefa. Esses valores são correspondidos pela página de comprovação aos <elementos ExitCode> .

ITreeView Interface

__interface ITreeView : IControl
{
    void EnableCheckboxes(void);
    HRESULT CreateImageList(int width, int height, UINT flags);
    int AddImage(HINSTANCE hInstance, int resourceId);

    HTREEITEM AddItem(LPCTSTR text, HTREEITEM hParent = NULL);
    void SetImage(HTREEITEM item, int image, int expandImage);

    void Clear(void);
    BOOL SetFirstVisible(HTREEITEM item);
    BOOL SelectItem(HTREEITEM item);
    void CheckItem(HTREEITEM item, UINT checkState);
    HTREEITEM SelectedItem(void);
    int SetItemHeight(SHORT height);
    HRESULT EnableItem(HTREEITEM item, BOOL enable);
    void Expand(HTREEITEM hItem, BOOL expand);

    HTREEITEM GetChild(HTREEITEM hParent);
    HTREEITEM GetParent(HTREEITEM hNode);
    HTREEITEM GetNextItem(HTREEITEM hPrevious);

    UINT IsChecked(HTREEITEM item);
    BOOL IsEnabled(HTREEITEM item);

    INT_PTR CommonControlEvent(WORD controlId, void* pInfo, BOOL *pCancel);
    HRESULT SetEventHandler(ITreeViewEvent *pEventHandler);

    void SetSelectedBackColor(COLORREF color);
};
Visão Geral

Essa interface é implementada pelo componente TreeViewWrapper . Você recupera uma instância desse componente usando a função auxiliar GetControlWrapper com o tipo CONTROL_TREE_VIEW.

void EnableCheckboxes(void)

Esse método ativa caixas de marcar no controle de exibição de árvore definindo o estilo TVS_CHECKBOXES.

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

Adicione uma nova lista de imagens ao controle de exibição de árvore. O parâmetro flags é passado na chamada para a função ImageList_Create Win32.

int AddImage(HINSTANCE hInstance, int resourceId)

Adicione uma imagem à lista de imagens de um recurso (resourceId) no módulo com o identificador de instância hInstance.

HTREEITEM AddItem(LPCTSTR text, HTREEITEM hParent = NULL)

Adicione um nó à exibição de árvore. O novo nó será adicionado no nível superior se hParent for NULL. Caso contrário, forneça o identificador para o item pai onde você deseja que o novo item seja adicionado. Esse método retorna o identificador para o novo item.

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

Defina a imagem a ser usada para um item do modo de exibição de árvore. Você pode definir a imagem normal e a imagem expandida.

void Clear(void)

Remova todos os itens do modo de exibição de árvore.

BOOL SetFirstVisible(HTREEITEM item)

Verifique se o item de exibição em árvore está visível. O modo de exibição de árvore rolará, se necessário, para tornar este item visível.

BOOL SelectItem(HTREEITEM item)

Defina o item atualmente selecionado para o item que você fornece. Você pode chamar SetFirstVisible depois disso para garantir que o item recém-selecionado esteja visível.

void CheckItem(HTREEITEM item, UINT checkState)

O método basicamente define a imagem que será mostrada para a caixa de marca na exibição em árvore. Essas imagens estão em um controle ImageList separado gerenciado pelo modo de exibição de árvore. Por padrão, esta lista de imagens tem três imagens, mostradas na Tabela 22.

Tabela 22.void CheckItem Padrão da Lista de Imagens

checkState Descrição
0 Em branco
1 Desmarcado
2 Selecionado
HTREEITEM SelectedItem(void)

Este método retorna o identificador do item de exibição de árvore atualmente selecionado.

int SetItemHeight(SHORT height)

Esse método define a altura de todos os itens no controle de exibição de árvore em pixels. Ele retorna a altura anterior em pixels.

HRESULT EnableItem(HTREEITEM item, BOOL enable)

Esse método habilita ou desabilita um único item na árvore. Desabilitar um item com filhos não desabilitará os filhos.

void Expand(HTREEITEM hItem, BOOL expand)

Esse método expande ou recolhe um nó na árvore.

HTREEITEM GetChild(HTREEITEM hParent)

Esse método retornará o primeiro filho de um item do modo de exibição de árvore ou NULL se não houver filhos.

HTREEITEM GetParent(HTREEITEM hNode)

Esse método retorna o identificador do pai para um nó na exibição de árvore ou NULL se o nó estiver no nível superior.

HTREEITEM GetNextItem(HTREEITEM hPrevious)

Você pode chamar esse método com um identificador que GetChild retorna para iterar por meio de todos os filhos de um nó. Esse método retorna o próximo irmão na árvore que compartilha o mesmo pai.

UINT IsChecked(item HTREEITEM)

Esse método retornará 0 se o nó da exibição em árvore não estiver selecionado e 1 se estiver.

BOOL IsEnabled(item HTREEITEM)

Esse método retorna TRUE se o nó de exibição em árvore estiver ativado, caso contrário, FALSE.

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

Esse método é apenas para uso interno.

HRESULT SetEventHandler(ITreeViewEvent *pEventHandler)

Chame esse método se desejar receber uma notificação quando o item selecionado for alterado ou o usuário alterar o estado de marca de um item do modo de exibição de árvore. Você deve implementar o ITreeViewEvent em seu componente para receber esses retornos de chamada.

void SetSelectedBackColor(cor COLORREF)

Defina a cor da tela de fundo usada para o item selecionado.

IWmiIteration Interface

__interface IWmiIterator : IUnknown
{
    HRESULT Next(void);
    HRESULT GetProperty(LPCTSTR propertyName, [out] LPVARIANT pValue);
};
Visão Geral

Você normalmente usa essa interface, juntamente com IWmiRepository, ao trabalhar com chamadas WMI. A interface IWmiIteration permite iterar pelos valores retornados por uma consulta.

HRESULT Próximo(nulo)

Vá para o próximo item nos resultados da consulta, conforme mostrado na Tabela 23.

Tabela 23. HRESULT Next(void) A consulta retorna

HRRESULT Descrição
S_OK Movido para o próximo resultado; você pode usar GetProperty para recuperar propriedades desse resultado.
S_FALSE Não há mais itens na lista.
E_NOT_SET Não há resultados de consulta
HRESULT GetProperty(LPCTSTR propertyName, [out] LPVARIANT pValue)

Esse método recupera o valor de uma propriedade do registro de resultado atual, conforme mostrado na Tabela 24 e na Tabela 25.

Tabela 24. HRESULT GetProperty

Parâmetro Descrição
propertyName Nome da propriedade que você deseja recuperar
pValue Aponta para uma estrutura VARIANT que, por sua vez, contém o valor da propriedade

Tabela 25. Resultado HRESULT GetProperty

HRESULT Descrição
S_OK O valor da propriedade foi recuperado.
WBEM_E_NOT_FOUND Não há nenhuma propriedade com o nome.
E_NOT_VALID_STATE Não houver nenhum registro.

Observação

O método GetProperty pode retornar outros códigos de erro WMI diferentes daqueles listados na Tabela 25. Os valores listados são os resultados comuns retornados.

IWmiRepository Interface

__interface IWmiRepository : IUnknown
{
    HRESULT SetNamespace(LPCWSTR namespaceName);
    HRESULT ExecQuery(LPCWSTR query, [out] IWmiIterator **ppIterator);
};
Visão Geral

Essa interface é implementada pelo componente WmiRepository (ID_WmiRepository).

HRESULT SetNamespace(LPCWSTR namespaceName)

Esse método define o namespace WMI que será usado para a consulta. Chame esse método antes de chamar ExecQuery. Se você não chamar esse método, o namespace será root\cimv2. Esse método sempre retorna S_OK.

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

Execute uma consulta no namespace WMI definido com uma chamada para SetNamespace, conforme mostrado na Tabela 26 e na Tabela 27.

Tabela 26. HRESULT ExecQuery

Parâmetro Descrição
Query A cadeia de caracteres da consulta WMI que você deseja executar
ppIterator Passe um ponteiro para um ponteiro de interface, que no retorno será preenchido com uma interface, dando a você acesso aos resultados da consulta

Tabela 27. Resultado da Consulta HRESULT

HRESULT Descrição
S_OK Êxito na consulta
Outros Se a consulta não tiver sido bem-sucedida, retornará um WMI HRESULT

IFormController Interface

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

    Validate(void);

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

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

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

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

    void ControlEvent(WORD eventId, WORD controlId);
    BOOL IsValid(void);
 };
Visão Geral

Cada página no Assistente UDI tem seu próprio controlador de formulário que implementa essa interface. Use esse controlador para conectar os dados de campo no arquivo XML .config aos controles em sua página. Em seguida, o controlador de formulário lida com muitos dos detalhes para você.

Configurando o formulário

Em geral, configure o controlador de formulário no método OnWindowCreated da sua página. Fazer isso geralmente envolve chamar os métodos mostrados na Tabela 28.

Tabela 28. Método OnWindowCreated

Method Descrição
Inicialização Inicializa o controlador de formulário
AddField Fornece uma conexão entre um campo no arquivo XML .config que é um nome de cadeia de caracteres e um controle na caixa de diálogo da página que é uma ID
AddRadioGroup Usado para conectar um botão de opção a um grupo e a um controle na caixa de diálogo
AddToGroup Permite controles "filho" que são habilitados ou desabilitados junto com o pai ou com base no botão de opção selecionado
InitFields Chame depois de chamar todos os métodos Adicionar para configurar o formulário
Validate Executa a validação inicial
Processando Eventos de Formulário

Adicione a seguinte chamada ao método OnControlEvent :

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

Essa chamada passa eventos para o controlador de formulário para que ele possa processar eventos relacionados a formulário.

Salvar dados de formulário

No método OnNextSelected , chame os métodos de formulário mostrados na Tabela 29.

Tabela 29. Método OnNextSelected

Method Descrição
InitSection Fornece o nome da seção que será exibida na página Resumo desta página
SaveFields Salve os valores do campo nas variáveis de sequência de tarefas e na página Resumo
Inicialização
HRESULT Init(IWizardPageView *pView, IWizardPageContainer *pContainer)

Você geralmente chama esse método próximo ao início do método OnWindowCreated da sua página. O comando deve ser semelhante a este:

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

Esse método é chamado internamente e você não deve chamá-lo por conta própria. Ele fornece o XML da página para o controlador de formulário.

Validar
HRESULT Validate(void)

Esse método executa todos os validadores anexados aos controles. Se um validador não for aprovado, o controlador de formulário exibirá uma mensagem de aviso e desativará o botão Avançar , em seguida, interromperá o processamento dos validadores. Normalmente, você só precisa chamar esse método no final do método OnWindowCreated ; Ele sempre retorna S_OK.

AddToGroup
AddToGroup(int groupControlId, int controlId)

Esse método adiciona um controle como um "filho" de uma caixa de marcar ou botão de opção, conforme mostrado na Tabela 30. Todos esses controles filho serão desabilitados quando o controle pai não estiver selecionado. O método sempre retorna S_OK.

Tabela 30. AddToGroup

Parâmetro Descrição
groupControlId A ID da caixa de marca ou do botão de opção que controlará o estado de habilitação do controle filho
Controlld A ID do controle que você deseja adicionar como filho
UpdateCheckGroup
HRESULT UpdateCheckGroup(int groupControlId)

Esse método atualiza o status de habilitação ou desabilitação dos controles filho de um grupo com base no status do controle pai. Geralmente, você não precisa chamar esse método por conta própria, porque o controlador de formulário o chama para você.

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

Chame esse método somente se você tiver um validador que deseja criar no código em vez de com o XML. Esse método sempre retorna S_OK.

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

Chame esse método somente se você tiver um validador que deseja criar no código em vez de com o XML.

DisableValidation
HRESULT DisableValidation(int controlId, BOOL disable)

Chame esse método para desabilitar explicitamente o validador para um controle ou restaurar a validação normal, conforme mostrado na Tabela 31. Esse método é útil, por exemplo, quando você tem regras para habilitar/desabilitar regras para controles que não são cobertos com validação de formulário e precisa desabilitar a validação para um controle. Em outras palavras, você normalmente não chamaria esse método. Esse método sempre retorna S_OK.

Tabela 31. HRESULT DisableValidation

Parâmetro Descrição
controlId O controle para o qual você deseja habilitar ou desabilitar a validação
Disable Defina como TRUE para desabilitar a validação e como FALSE para restaurar a validação normal
AddField
HRESULT AddField(LPCWSTR fieldName, int controlId, BOOL suppressLog, DialogControlTypes type)

Adicione um mapeamento de controle entre o nome em um elemento Field do arquivo XML .config e a ID de controle na caixa de diálogo da página, conforme mostrado na Tabela 32. Você deve chamar esse método antes da chamada para InitFields, porque InitFields usa essas informações. Esse método sempre retorna S_OK.

Tabela 32. HRESULT AddField

Parâmetro Descrição
Nome do campo Nome do campo como ele aparece no XML da sua página
controlId A ID do controle no modelo de caixa de diálogo da sua página
suppressLog Defina como TRUE se você não quiser que os valores deste campo sejam gravados no arquivo de log; sempre defina esse parâmetro como TRUE para campos de senha ou PIN
Tipo O tipo de controle, que é um dos seguintes:

- CONTROL_STATIC_TEXT
- CONTROL_COMBO_BOX
- CONTROL_LIST_VIEW
- CONTROL_PROGRESS_BAR
- CONTROL_GENERIC
- CONTROL_RADIO_BUTTON
- CONTROL_CHECK_BOX
- CONTROL_TREE_VIEW
AddRadioGroup
HRESULT AddRadioGroup(LPCWSTR groupName, int radioControlId)

Esse método adiciona um controle a um grupo de botões de opção nomeados, conforme mostrado na Tabela 33. Você deve chamá-lo antes do método InitFields , pois esse método usa atributos no elemento RadioGroup para controlar as configurações de todos os controles de botão de opção no grupo. Os grupos de rádio podem ser bloqueados, por exemplo, para que todos os botões de opção sejam desabilitados, mas os controles de crianças sejam habilitados ou desabilitados com base apenas no botão de opção selecionado. Esse método sempre retorna S_OK.

Tabela 33. HRESULT AddRadioGroup

Parâmetro Descrição
groupName Uma cadeia de caracteres que define um grupo de botões de opção nesta página
radioControlId A ID de um único botão de opção a ser adicionado a este grupo
EnableRadioGroup
HRESULT EnableRadioGroup(LPCWSTR groupName, BOOL enable)

Esse método permite habilitar ou desabilitar um grupo inteiro de botões de opção. Desabilitar um grupo de opções desabilita todos os controles de botão de opção no grupo, bem como todos os filhos desses botões de opção que foram adicionados com AddToGroup. Veja a Tabela 34 e a Tabela 35.

Tabela 34. EnableRadioGroup

Parâmetro Descrição
groupName Nome de um grupo de botões de opção que você já definiu com uma chamada para AddRadioGroup
Enable Defina como TRUE para habilitar o grupo de botões de opção e FALSE para desabilitar o grupo

Tabela 35. HRESULT EnableRadioGroup

HRESULT Descrição
S_OK Grupo habilitado ou desabilitado
E_INVALIDARG Não há nenhum grupo de botões de opção com o nome fornecido
InitFields
HRESULT InitFields(IFieldCallback *pFieldCallback = nullptr)

Antes de chamar esse método, chame AddField para cada campo que o XML pode controlar. Esse método sempre retorna S_OK.

O parâmetro pFieldCallback é opcional. Se você fornecê-lo, o controlador de formulário chamará SetFieldDefault para controles que não são CONTROL_STATIC_TEXT ou CONTROL_CHECK_BOX. Esse comportamento permite que você recupere um valor padrão do XML e o defina no controle por conta própria.

SaveFields
HRESULT SaveFields(IFieldCallback *pFieldCallback = nullptr)

Esse método salva os valores do campo nas variáveis da sequência de tarefas e nos dados de resumo que serão mostrados na página Resumo . Fornecer um ponteiro em pFieldCallback permite que você manipule o salvamento de valores para controles que não dão suporte a CONTROL_STATIC_TEXT.

IsFieldDisabled
BOOL IsFieldDisabled(int controlId)

Esse método permite determinar se um campo foi desabilitado no XML.

InitSection
HRESULT InitSection(LPCWSTR key, LPCWSTR sectionCaption)

Esse método inicializa os dados de resumo que serão mostrados na página Resumo , conforme mostrado na Tabela 36. Chame esse método no método OnNextSelected antes de chamar SaveFields. Esse método sempre retorna S_OK.

Tabela 36. HRESULT InitSection

Parâmetro Descrição
Chave Esse parâmetro deve ser exclusivo para sua página. Ele é usado para garantir que cada página tenha suas próprias informações de resumo.
sectionCaption O cabeçalho que será mostrado na página Resumo para obter as informações de resumo desta página. Normalmente, você usa DisplayName() como o valor para esse parâmetro.
AddSummaryItem
HRESULT AddSummaryItem(LPCWSTR first, LPCWSTR second)

Esse método permite que você adicione itens de resumo à página Resumo acima e além dos itens definidos com o XML. Consulte a Tabela 37.

Tabela 37. HRESULT AddSummaryItem

Parâmetro Descrição
Primeira A legenda para o item de resumo, que é mostrado no lado esquerdo
Second O valor que será mostrado no lado direito
SuppressLogValue
HRESULT SuppressLogValue(LPCWSTR tsVariableName)

Chame esse método para variáveis de sequência de tarefas para as quais você não deseja que os valores sejam gravados no arquivo de log. Chame esse método para variáveis de sequência de tarefas que armazenam senhas, PINs ou outros valores confidenciais que um usuário pode inserir.

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

Esse método salva o valor de um controle de texto em uma variável de sequência de tarefas e na seção de resumo. Normalmente, você não precisará chamar esse método por conta própria, porque o controlador de formulário faz isso para todos os campos. Consulte a Tabela 38.

Tabela 38. HRESULT SaveText

Parâmetro Descrição
controlId A ID da caixa de texto que contém o valor que você deseja salvar (ou qualquer outro controle que possa retornar texto)
tsVariableName Nome da variável de sequência de tarefas que você deseja modificar
resumoLegenda A legenda na página Resumo para esse valor
Texto de Carregamento
HRESULT LoadText(int controlId, LPCWSTR tsVariableName)

Esse método lê o valor de uma variável de sequência de tarefas e define a caixa de texto com esse valor.

ControlEvent
void ControlEvent(WORD eventId, WORD controlId)

Chame esse método em seu método OnControlEvent para garantir que o controlador de formulário possa processar eventos de controle, o que ele precisa fazer para funcionar corretamente. Os valores que você passa para esse método são os mesmos valores passados para o método OnControlEvent .

IsValid
BOOL IsValid(void)

Esse método retorna o status da validação mais recente do formulário. Se algum dos validadores de controle relatou um erro, esse método retorna FALSE. Em outras palavras, ele retornará VERDADEIRO somente se todos os controles da página forem válidos.

IValidator Interface

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

Os validadores são componentes que podem validar um único controle em sua página. A maneira mais fácil de implementar um validador é torná-lo uma subclasse da classe BaseValidator , que é definida no arquivo de cabeçalho BaseValidator.h.

HRESULT Init(IControl *pControl, mensagem LPCTSTR)

Se você criar um validador no código, poderá chamar esse método para inicializar o validador. Consulte a Tabela 39.

Tabela 39. Inicialização HRESULT

Parâmetro Descrição
pControl O controle que seu validador deve validar
Mensagem A mensagem a ser exibida na página se o controle não for válido
HRESULT Init(IControl *pControl, IWizardPageContainer *pContainer, IStringProperties *pProperties)

O controlador de formulário chama esse método para inicializar validadores que ele cria com base no XML da página. Consulte a Tabela 40.

Tabela 40. Método de inicialização HRESULT

Parâmetro Descrição
pControl O controle que seu validador deve validar
pContainer Caso seu validador precise acessar o registrador ou precise criar outros componentes
pPropriedades Fornece acesso às propriedades (elementos setter) do seu validador
BOOL, IsValid(LPBSTR pMessage)

Esse método retornará TRUE se o controle for válido ou FALSE se o controle for inválido. No retorno, pMessage deve ser preenchido com um novo BSTR que contém a mensagem a ser exibida quando o controle não for válido.

HRESULT SetProperty(int propertyId, LPVARIANT pValue)

Você pode implementar esse método se precisar de valores extras que não são fornecidos no XML.

HRESULT SetProperty(int propertyId, IUnknown *pUnknown)

Você pode implementar esse método se precisar de valores extras que não são fornecidos no XML.

HRESULT SetProperty)(int propertyId, LPCTSTR pValue)

Você pode implementar esse método se precisar de valores extras que não são fornecidos no XML.

IRegEx Interface

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

Esse método é implementado pelo componente ID_Regex (IRegex.h) e fornece suporte para o processamento de expressões regulares.

BOOL MatchesRegex(entrada LPCTSTR, LPCTSTR regex)

Esse método executa a expressão regular em relação ao texto de entrada. Ele usa a função regex_match da biblioteca padrão C++ para fazer o trabalho real. O método retornará TRUE se houver correspondências, caso contrário, FALSE.

HRESULT GetMatch(size_t index, LPBSTR pValue)

Esse método permite recuperar as correspondências da chamada MatchesRegex mais recente. Observe que não há processamento de erros nesse método e ele retorna S_OK ou lança uma exceção.

ISummaryInfo Interface

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

Você não precisa usar essa interface diretamente. Em vez disso, use IFormController.

ISummaryBag

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

Você não precisa usar essa interface diretamente. Em vez disso, use IFormController.

ITSVariableBag Interface

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

Essa interface fornece acesso a variáveis de sequência de tarefas. Você pode acessar essa interface usando o método TSVariables() da sua página.

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

Esse método lê o valor de uma variável de sequência de tarefas.

Observação

Os valores são armazenados em cache após a primeira leitura.

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

Esse método define o valor de uma variável de sequência de tarefas. Esse valor é salvo na memória. Os valores da sequência de tarefas são gravados quando você seleciona Concluir no Assistente UDI.

void Clear(void)

Esse método remove todos os valores de sequência de tarefas que foram salvos na memória.

HRESULT Remove([in] LPCTSTR variableName)

Esse método remove um valor de sequência de tarefas específico da memória. Na próxima vez que você chamar GetValue com o mesmo nome de sequência de tarefas, o método tentará recuperá-lo da sequência de tarefas.

HRESULT SuppressLogValue([in] LPCTSTR variableName)

Sempre que variáveis de sequência de tarefas são gravadas, como quando você seleciona Concluir no Assistente de UDI, os nomes e os valores são gravados no arquivo de log. Chame esse método para suprimir o registro em log de valores confidenciais, como senhas ou PINs, para uma variável de sequência de tarefas específica.

void Save(void)

Esse método salva todos os valores de sequência de tarefas que foram definidos com chamadas para SetValue.

ITSVariableRepository Interface

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

Essa interface é para uso interno pelo TSVariableBag para ler e gravar variáveis de sequência de tarefas.

IWizardFinish Interface

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

Essa interface é útil em cenários avançados em que você deseja executar processamento adicional ao selecionar Concluir ou Cancelar no Assistente de UDI . O Assistente de UDI contém uma tarefa de término que salva variáveis de sequência de tarefas quando você seleciona Concluir. Se você cancelar o assistente, a tarefa definirá apenas a variável de sequência de tarefas OSDSetupWizCancelled como TRUE e não salvará as alterações em nenhuma outra variável de sequência de tarefas.

Se você criar seu próprio componente de acabamento, precisará registrá-lo com um código como este:

Register<MyFinishTaskFactory>(ID_MyFinishTask, pRegistry);

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

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

pService->Register(pFinish);

IBindableList Interface

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

Implemente essa interface se você tiver um componente de fonte de dados que deseja associar a uma caixa de combinação chamando seu método Bind .

size_t Count(void)

Esse método retorna o número de itens na lista.

HRESULT GetCaption(índice size_t, LPBSTR pCaption)

Esse método retorna a legenda do item em um índice específico.

IDataNodes Interface

__interface IDataNodes : IUnknown
{
    size_t Count();
    HRESULT SetCaptionProperty(LPCTSTR captionProperty);
    HRESULT GetProperty(size_t index, LPCTSTR propertyName, [out] LPBSTR propertyValue);
    HRESULT GetNode(size_t index, [out] ISettingsProperties **ppNode);
};

Essa interface fornece acesso a dados hierárquicos que podem ser salvos em uma página. Você obtém essa interface por meio de métodos na interface ISettingsProperties , que está disponível para sua página por meio do método Settings .

Os dados no XML de uma página podem ter a seguinte aparência

      <Data Name="Network">
        <DataItem>
          <Setter Property="DisplayName">Public</Setter>
          <Setter Property="Share">\\servername\Share</Setter>
        </DataItem>
        <DataItem>
          <Setter Property="DisplayName">Dev Team</Setter>
          <Setter Property="Share">\\servername\DevShare</Setter>
        </DataItem>
      </Data>

Calling Settings()->GetDataNode(L"Network", &pData) fornece uma instância IDataNodes com dois itens de dados (cada um dos quais, por sua vez, tem duas propriedades).

size_t Count()

Esse método retorna o número de elementos DataItem .

HRESULT SetCaptionProperty(LPCTSTR captionProperty)

O componente que dá suporte a essa interface também dá suporte a IBindableList, o que facilita o preenchimento de uma caixa de combinação com dados do XML da página. Esse método controla qual propriedade (setter) em cada elemento DataItem será usada para essa associação. Por exemplo, você poderia chamar esse método com DisplayName e ele usaria essa propriedade setter para vinculação de dados. A caixa de combinação conteria Público e Equipe de Desenvolvimento como itens.

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

Esse método obtém uma propriedade de um dos elementos DataItem . Consulte a Tabela 41 e a Tabela 42.

Tabela 41. DataItem GetProperty

Parâmetro Descrição
Índice O valor de índice (começando com 0) do DataItem para o qual você deseja recuperar um valor de propriedade
propertyName Nome da propriedade setter para a qual você deseja recuperar um valor
propertyValue Ao retornar, contém o valor da cadeia de caracteres de uma propriedade

Tabela 42. HRESULT GetProperty

HRESULT Descrição
S_OK A propriedade foi recuperada.
E_INVALIDARG O índice ultrapassou o final da matriz.
HRESULT GetNode(size_t index, [out] ISettingsProperties **ppNode)

Esse método é semelhante a GetProperty, mas em vez de retornar um valor de um DataItem, ele retorna todo o DataItem encapsulado em uma interface ISettingsProperties . Consulte a Tabela 43 e a Tabela 44.

Tabela 43. HRESULT GetNode

Parâmetro Descrição
Índice O valor de índice (começando com 0) do DataItem para o qual você deseja recuperar um valor de propriedade
ppNode Na saída, a interface ISettingsProperties que encapsula o nó DataItem

Tabela 44. Resultados de HRESULT GetNode

HRESULT Descrição
S_OK O nó foi recuperado.
E_INVALIDARG O índice ultrapassou o final da matriz.

IFactoryRegistry Interface

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

Quando você cria uma nova página personalizada, no mínimo, você precisa criar uma fábrica de páginas — uma classe que implementa IClassFactory. (Você pode usar ClassFactoryImpl como uma classe base para sua fábrica.)

void Register (tipo LPCTSTR, IClassFactory *pFactory)

Esse método registra uma fábrica de classe com o registro. Consulte a Tabela 45.

Tabela 45. IClassFactory void Registrar

Parâmetro Descrição
Tipo Uma cadeia de caracteres que identifica a fábrica que você está registrando; Em geral, esse parâmetro deve ter o nome da sua empresa na cadeia de caracteres para garantir que ele seja exclusivo
pFactory Um ponteiro para sua instância de fábrica de classe
HRESULT LoadAndRegister(LPCTSTR, dllName, ILogger *pLogger)

Esse método é apenas para uso interno.

BOOL Contém (tipo LPCTSTR)

Esse método geralmente é para uso interno. Ele verifica se uma fábrica de classes foi registrada para um tipo.

HRESULT GetFactory (tipo LPCTSTR, IClassFactory **ppFactory)

Esse método permite recuperar a fábrica de classes. Normalmente, você chamaria CreateInstance. No entanto, se você for criar um grande número do mesmo componente, será mais eficiente recuperar a fábrica e solicitar que ela crie as instâncias para você.

HRESULT CreateInstance(tipo LPCTSTR, IUnknown **ppInstance)

Este método cria uma nova instância de um componente, dado o seu tipo. Em vez disso, use o método de modelo CreateInstance , que permite a criação de objetos com segurança de tipo.

HRESULT SetContainer(IWizardPageContainer *pContainer)

Esse método é apenas para uso interno.

HRESULT RegisterService(REFGUID iid, IUnknown *pService)

Serviços são instâncias únicas de um componente que podem ser usadas em vários lugares. Você pode usar esse método para registrar um serviço em uma página e, em seguida, recuperar a mesma instância de outra página.

HRESULT GetService(REFGUID iid, IUnknown **ppService)

Esse método recupera um serviço que foi registrado anteriormente com uma chamada para RegisterService.

HRESULT SetLanguage(LANGID languageId)

Esse método define o idioma do Assistente UDI como o identificador de idioma fornecido no parâmetro languageId .

LANGID GetLanguage()

Esse método retorna o valor do identificador de idioma fornecido com o parâmetro de linha de comando /locale para o Assistente de UDI. O método retorna um dos seguintes valores:

  • Valor do identificador de idioma fornecido com o parâmetro de linha de comando /locale

  • 0, se você não forneceu o parâmetro de linha de comando /locale

ILogger Interface

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

O Assistente UDI registra informações em um arquivo de log, o que ajuda a solucionar problemas encontrados no campo. É uma boa ideia que suas páginas registrem informações. Você pode obter um ponteiro para essa interface de dentro de sua página usando o método Logger() da página. As linhas no arquivo de log contêm um número de "nível" que representa mensagens de erro, normais, detalhadas ou de depuração.

Observação

As mensagens de depuração não são salvas no arquivo de log, a menos que o suporte de depuração esteja ativado. Você pode ativar o suporte de depuração adicionando a seguinte linha ao elemento Style no arquivo .config:

<Setter Property="debug">true</Setter>
Inicialização
HRESULT Init(LPCWSTR logFilename)

Esse método é apenas para uso interno.

Mover Log
HRESULT MoveLog(LPCWSTR logFilename)

Esse método é apenas para uso interno.

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

Esse método é apenas para uso interno.

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

Esse método é apenas para uso interno.

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

Chame esse método para registrar informações sobre um erro. Consulte a Tabela 46.

Tabela 46. Erro HRESULT

Parâmetro Descrição
Erro O código de erro retornado por uma chamada (Esse código será exibido na entrada de log como um número).
Componente Uma cadeia de caracteres que identifica a origem do erro, que geralmente é sua página ou o componente que você escreveu
Mensagem A mensagem que explica o que causou o erro
Erro 2
HRESULT Error2(HRESULT error, LPCTSTR component, LPCTSTR message, LPCTSTR message2)

Esse método é como o método Error , mas permite que você forneça uma mensagem de duas partes. A mensagem final terá "message" e, em seguida, "message2" no arquivo de saída. Este é simplesmente um método de conveniência.

Normal
HRESULT Normal(LPCTSTR component, LPCTSTR message)

Esse método registra uma mensagem normal. Consulte a descrição do método Error para obter os parâmetros.

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

Esse método registra uma mensagem normal. Consulte a descrição do método Error2 para obter os parâmetros.

Detalhado
HRESULT Verbose(LPCTSTR component, LPCTSTR message)

Esse método registra uma mensagem detalhada. Consulte a descrição do método Error para obter os parâmetros.

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

Esse método registra uma mensagem detalhada. Consulte a descrição do método Error2 para obter os parâmetros.

Depurar
HRESULT Debug(LPCWSTR component, LPCWSTR message)

Esse método registra uma mensagem de depuração. Consulte a descrição do método Error para obter os parâmetros. As mensagens de depuração não são salvas no arquivo, a menos que sejam habilitadas. Consulte a seção Visão geral para obter detalhes.

EnableDebug
HRESULT EnableDebug(BOOL debug)

Esse método é apenas para uso interno.

Fechar
HRESULT Close(void)

Esse método é apenas para uso interno.

GetLogFilename
HRESULT GetLogFilename(LPBSTR pFilename)

Esse método recupera o nome do arquivo de log.

IOrientation Interface

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

Essa interface é apenas para uso interno.

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

Essa interface é apenas para uso interno.

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);
};
Visão Geral

Essa interface fornece acesso aos dados da página. Para chegar ao nível superior dos dados da página, use o método Settings() da página.

HRESULT GetAttribute(LPCTSTR attributeName, LPBSTR attributeValue)

Esse método permite recuperar os valores dos atributos no nó principal, que é o nó da página quando você está usando o método Settings() da página.

IStringProperties * Properties()

Esse método fornece acesso aos valores da propriedade setter no nó principal. Para uma página, essas são as propriedades de nível superior.

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

Chame esse método se quiser obter diretamente uma lista de nós XML usando uma expressão XPath. É melhor usar um dos outros métodos, se puder. Use esse método somente se você não puder acessar os nós de outra maneira.

HRESULT SelectSingleNode(LPCTSTR, xPath, IXMLDOMNode, **ppNode)

Chame esse método se quiser obter diretamente um único nó XML usando uma expressão XPath. É melhor usar um dos outros métodos, se puder. Use esse método somente se você não puder acessar um nó de outra maneira.

HRESULT GetDataNode(nome LPCTSTR, ISettingsProperties **ppNode)

Recupere um elemento Data com base no atributo Name desse elemento.

HRESULT GetDataNodes(IDataNodes **ppNodes)

Esse método recupera uma lista de elementos DataItem no nó atual. No nível da página, chame GetDataNode para recuperar uma interface ISettingsProperty para os dados. Em seguida, nessa instância, chame GetDataNodes para recuperar a lista de registros. Por exemplo, dado este 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)

Esse método fornece uma maneira rápida de chegar ao conjunto de nós DataItem em um nó Data específico. Usando o XML do exemplo GetDataNodes , o código a seguir faz exatamente a mesma coisa que as quatro linhas de código no exemplo em GetDataNodes , mas com verificação de erros:

ISimpleStringProperties Interface

ISimpleStringProperties Interface

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

Por si só, essa interface pode não ser útil. No entanto, ele é implementado pelo componente ID_SimpleStringProperties , que também implementa a interface IStringProperties . Você pode usar esse componente nos casos em que precisa passar um conjunto de propriedades para outro componente, como uma tarefa, mas deseja adicionar valores programaticamente em vez de usar valores de XML. Aqui está um exemplo de como você usaria essa interface:

PSimpleStringProperties *pProperties;
CreateInstance(Container(), ID_SimpleStringProperties, &pProperties);
pProperties->Add(L"filename", L"%windir%\\system32\\cscript.exe");
pTask->Init(pProperties, nullptr);
IStringProperties
__interface IStringProperties : IUnknown
{
    HRESULT Get(LPCTSTR propertyName, [out] LPBSTR pPropValue);
};

Essa interface fornece acesso simples a um conjunto de elementos setter provenientes do XML. Esta interface está disponível para as propriedades de uma página usando Settings()->Properties().

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

Esse método recupera um único valor de propriedade. Veja a Tabela 47 e a Tabela 48.

Tabela 47. IHRESULT Obter valor da propriedade

Parâmetro Descrição
propertyName Nome da propriedade que você deseja ler
pPropValue Ao sair, contém o valor da propriedade como uma string (esse valor será nullptr se não houver tal propriedade.)

Tabela 48. IHRESULT Obter resultados de valor de propriedade

HRESULT Descrição
S_OK O valor da propriedade é recuperado.
E_INVALIDARG Não há nenhuma propriedade com o nome fornecido.

ITaskManager Interface

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

    HRESULT Start(void);

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

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

Essa interface é implementada pelo componente TaskManager (ID_TaskManager em ITaskManager.h), que é o componente que executa tarefas na página de comprovação. Você pode usar a página de simulação diretamente, que é o que você faz na maioria das vezes, ou criar sua própria página, deixando esse componente fazer a maior parte do trabalho.

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

Você deve chamar esse método antes de chamar qualquer outro método. Ele inicializa o componente TaskManager . Consulte a Tabela 49.

Tabela 49. Inicialização HRESULT

Parâmetro Descrição
pPageView Fornece acesso à página que executará tarefas (Esta página deve ter um conjunto específico de controles, que são descritos nos próximos parâmetros.)
idListView A ID de controle de um controle ListView que exibirá a lista de tarefas e o status dessas tarefas
idMessage A ID de controle de uma caixa de texto que será usada para exibir uma mensagem para a tarefa selecionada
idRetryButton A ID de controle de um botão que você pode selecionar para executar as tarefas novamente
pPageInfo Um wrapper em torno do XML da página (o TaskManager carrega o conjunto de tarefas a serem executadas a partir desse XML).
pCallback Pode ser nulo (Se esse parâmetro não for nulo, o Gerenciador de Tarefas chamará o método Iniciado quando iniciar uma tarefa e o método Concluído para cada tarefa que terminar de ser executada.)
HRESULT SetFailMessage(mensagem LPCWSTR)

Esse método define a mensagem que será exibida se uma ou mais tarefas falharem.

HRESULT Start(void)

Esse método inicia todas as tarefas. Cada tarefa é iniciada em um thread separado.

HRESULT GetTaskMessage(índice size_t, mensagem LPBSTR)

Esse método é apenas para uso interno. Ele recupera a mensagem atual para uma tarefa com base em seu índice na lista de tarefas.

HRESULT GetResultType)(índice size_t, tipo LPBSTR)

Esse método recupera o "tipo" atual de uma tarefa. A Tabela 50 mostra os tipos disponíveis.

Tabela 50. HRESULT GetResultType

Tipo Descrição
0 Representa uma tarefa que teve êxito
1 Representa uma tarefa que retornou um aviso
-1 Representa uma tarefa com falha

O tipo é recuperado examinando o código de erro ou saída da tarefa e encontrando uma correspondência no elemento XML ExitCodes> da <tarefa.

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

Esse método é usado pelas páginas de progresso e de simulação para recuperar a propriedade setter BitmapFilename para que ela possa exibir uma imagem ao lado da mensagem para a tarefa que você destacar. Em outras palavras, você pode adicionar um setter personalizado ao XML da tarefa e, em seguida, recuperá-lo com esse método.

int GetSelectedIndex(void)

Esse método recupera o índice da tarefa selecionada no momento, o que é útil se você deseja recuperar informações adicionais sobre a tarefa (consulte o método GetProperty ) a serem exibidas para a tarefa selecionada. As páginas de progresso e de simulação usam esse método para exibir uma imagem para a tarefa selecionada.

HRESULT Wait(DWORD waitMilliseconds)

Esse método ajuda principalmente com testes de unidade para que o teste possa garantir que as tarefas terminem antes que o teste de unidade seja encerrado. Normalmente, você não chamaria esse método. Ele retorna quando todas as tarefas terminam de ser executadas ou o tempo de espera expirou.

size_t FailedCount(void)

Esse método retorna o número de tarefas atualmente marcadas como com falha.

size_t WarningCount(void)

Esse método retorna o número de tarefas atualmente marcadas como aviso.

size_t SucceedCount(void)

Esse método retorna o número de tarefas atualmente marcadas como bem-sucedidas.

size_t RunningCount(void)

Esse método retorna o número de tarefas em execução no momento.

void OnCommonControlEvent(WORD controlId, LPNMHDR pInfo)

Chame esse método do OnCommonControlEvent da sua página para que o TaskManager possa processar os eventos necessários.

void OnControlEvent(WORD eventId, WORD controlId)

Chame esse método do OnControlEvent da sua página para que o TaskManager possa processar os eventos necessários.

void EnableButtons(BOOL enable)

Esse método é apenas para uso interno.

IWizardComponent Interface

__interface IWizardComponent : IUnknown
{
    HRESULT SetContainer(IWizardPageContainer *pContainer);
};
Visão Geral

Normalmente, você não implementará essa interface diretamente, mas por meio da classe de modelo WizardComponent . Se o componente implementar essa interface e você tiver registrado uma fábrica de classes no registro, o componente receberá um ponteiro para a instância IWizardPageContainer quando for criado. Isso ajuda você, por exemplo, a acessar o Logger ou o Registro para criar outros componentes que seu componente pode precisar.

IWizardDialogController Interface

__interface IWizardDialogController : IUnknown
{
    void Initialize(ISettings *pSettings);
    void InitPages(void);
    void Start();
    void Next();
    void Finish();
    void Previous();
    int NumPages();
    void Cancel();

    HRESULT Focus(WizardButtons button);
    HRESULT SetEnable(WizardButtons button, BOOL enable);
    void ShowWarningMessage(LPCTSTR message);
    void HideWarningMessage();

    void ChangePage(size_t newIndex);
    IUnknown *CurrentPage(void);
    HRESULT GetCurrentTitle([out, retval] LPBSTR pDisplayName);
};

Essa interface é apenas para uso interno.

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

Essa interface é apenas para uso interno.

IWizardPage Interface

__interface IWizardPage : IUnknown
{
    HRESULT SetPageSettings(ISettingsProperties *pPageSettings);
    HINSTANCE GetInstanceHandle(void);
    int GetDialogResourceId(void);
    void WindowCreated(IWizardPageView *pView, IWizardPageContainer *pContainer);
    void WindowShown(void);
    void WindowHidden(void);

    HRESULT NextSelected(void);
    void ControlEvent(WORD eventId, WORD controlId);
    void CommonControlEvent(WORD controlId, LPNMHDR pInfo, LPBOOL pCancel);
    void UnhandledEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
};
Visão Geral

Essa interface é implementada por WizardPageImpl, portanto, você normalmente não precisará implementá-la por conta própria. O assistente chama todos esses métodos para você quando interage com suas páginas personalizadas.

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);
};
Visão Geral

Essa interface está disponível para sua página por meio do método Container (implementado por WizardPageImpl) e fornece acesso a vários serviços do assistente.

ILogger * Logger(void)

Use este método para gravar mensagens no arquivo de log, por exemplo:

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

Esse método fornece acesso a variáveis de "memória", que são propriedades que estão na memória somente enquanto o Assistente UDI está em execução. Essas propriedades estão disponíveis para outras páginas no código ou no XML usando a sintaxe $memoryVarName$ .

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

Esse método permite que você crie uma nova instância de qualquer componente que tenha sido registrado. No entanto, é melhor usar a função de modelo CreateInstance, porque ela é fortemente tipada.

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

Esse método permite recuperar um serviço que foi registrado. No entanto, é melhor chamar a função de modelo GetService , que é fortemente tipada (em vez de usar IUnknown).

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

Este método lida com o trabalho com variáveis dentro de valores de cadeia de caracteres. Ele suporta os formatos mostrados na Tabela 51 e na Tabela 52.

Tabela 51. HRESULT ReplaceVariables

Format Descrição
$Name$ Substitui o valor de uma variável de memória por este nome (se não houver nenhuma variável de memória com o nome, o "token" será removido.)
%Name% Uma variável de sequência de tarefas ou uma variável de ambiente. A ordem é a seguinte:

1. Use o valor de uma variável de sequência de tarefas, se presente.
2. Use o valor de uma variável de ambiente, se presente.
3. Caso contrário, remova este texto da string.

Tabela 52. Parâmetro HRESULT

Parâmetro Descrição
Fonte A cadeia de caracteres de entrada, que pode conter qualquer combinação de $ e % variáveis ou nenhuma
pDest Em retorno, contém uma nova cadeia de caracteres que tem todos os tokens substituídos de acordo com a Tabela 51
HRESULT GotoPage(LPCTSTR pageName)

Esse método não foi totalmente testado. A ideia é que você possa alternar diretamente para uma página específica com base no nome da página, conforme definido no arquivo XML .config. Chamar esse método ignora o OnNextSelected em sua página. Além disso, o comportamento deste método está sujeito a alterações, portanto, use-o por sua conta e risco.

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

Esse método exibe uma caixa de mensagem com o texto e a legenda fornecidos por você. O parâmetro uType é qualquer valor que você pode fornecer para a função Win32 MessageBox .

BOOL InPreview(void)

Esse método retornará TRUE se você iniciou o assistente no modo "preview" fornecendo a opção /preview . No modo de visualização, o botão Avançar nunca é desabilitado. Esse método permite que você ignore o código no modo de visualização, por exemplo, isso pode causar problemas quando você não tem dados válidos na página.

HWND GetHwnd(void)

Esse método retorna o HWND para a caixa de diálogo principal. Use esse método com cuidado. Geralmente, a interface de programação de aplicativos do UDI Wizard é projetada para que você nunca trabalhe diretamente com maçanetas de janela.

IWizardPageView Interface

__interface IWizardPageView : IUnknown
{
    HRESULT GetControlWrapper(int itemId, DialogControlTypes controlType, IUnknown **ppControl);
    HWND GetHwnd(void);
    HWND GetControl(int itemId);
    HRESULT Show (void);
    HRESULT Hide(void);
    HRESULT Focus(int itemId);
    IWizardPage * Page(void);
    IFormController * Form(void);

    HRESULT FocusWizardButton(WizardButtons button);
    HRESULT SetEnable(WizardButtons button, BOOL enable);
    void ShowWarningMessage(LPCTSTR message);
    void HideWarningMessage(void);
};

Essa interface está disponível para o código em sua página por meio do método View (implementado por WizardPageImpl).

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

O Assistente de UDI usa wrappers, que são realmente fachadas para interagir com os controles em sua página. Usar essas fachadas em vez dos controles reais torna muito mais fácil escrever testes para sua página, porque você pode fornecer fachadas simuladas de seus testes.

Em vez de usar esse método diretamente, é melhor usar o método de modelo GetControlWrapper , que é fortemente tipado - por exemplo:

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

Esse método retorna o identificador de janela da sua página. Em geral, você não deve precisar de acesso a esse identificador de janela.

HWND GetControl(int itemId)

Se for necessário, você poderá chamar esse método para obter o identificador de janela de um controle em sua página. (É melhor chamar a função de modelo GetControlWrapper ).

HRESULT Mostrar (nulo)

Esse método é apenas para uso interno.

HRESULT Ocultar(void)

Esse método é apenas para uso interno.

HRESULT Focus(int itemId)

Defina o foco de entrada para um controle específico.

IWizardPage * Page(void)

Esse método é apenas para uso interno.

IFormController * Form(void)

Esse método é apenas para uso interno.

HRESULT FocusWizardButton(botão WizardButtons)

Define o foco para um dos botões do assistente. WizardButtons tem dois valores: BackButton e NextButton.

HRESULT SetEnable(botão WizardButtons, BOOL habilitado)

Solicite que um dos botões do assistente seja habilitado ou desabilitado. O botão pode não corresponder ao estado solicitado. Por exemplo, se você executar o Assistente de UDI com a opção /preview , os botões sempre estarão habilitados. WizardButtons tem dois valores: BackButton e NextButton.

void ShowWarningMessage(LPCTSTR message)

Esse método exibe uma mensagem de aviso na parte inferior da área de conteúdo da página. Esta mensagem pode ser qualquer texto que você quiser.

void HideWarningMessage(void)

Ocultar uma mensagem de aviso exibida com uma chamada para ShowWarningMessage.

IXmlDocument Interface

__interface IXmlDocument : IUnknown
    HRESULT Load(LPCTSTR filename);
    HRESULT LoadXml(LPCTSTR xml);
    HRESULT Save(LPCWSTR filename);
    HRESULT GetParseErrorMessage(LPBSTR pMessage);
    HRESULT SelectNodes(LPCTSTR xpath, IXMLDOMNodeList **ppNodes);
    HRESULT SelectSingleNode(LPCTSTR xpath, IXMLDOMNode **ppNode);
    HRESULT AddSchema(LPCTSTR filename, LPCTSTR ns);
    HRESULT AddAttribute(IXMLDOMNode *pNode, LPCWSTR name, LPCWSTR value);
    HRESULT CreateNode(DOMNodeType type, LPCWSTR name, LPCWSTR ns, IXMLDOMNode **ppNode);
};
Visão Geral

Essa interface é implementada pelo componente ID_IXmlDocument , que é uma fachada projetada para facilitar o trabalho com documentos XML em C++.

Carregamento HRESULT (nome do arquivo LPCTSTR)

Esse método carrega um documento XML de um arquivo externo. Ele retorna S_OK se o arquivo foi carregado sem erros ou S_FALSE se ocorreu um erro. Quando há um erro, você pode receber a mensagem de erro chamando GetParseErrorMessage.

HRESULT LoadXml(LPCTSTR xml)

Esse método carrega um documento XML de uma cadeia de caracteres em vez de um arquivo externo. Além da fonte para ler o XML, o comportamento é o mesmo que o método Load .

HRESULT Save(nome do arquivo LPCWSTR)

Esse método salva o documento XML que está na memória em um arquivo externo.

HRESULT GetParseErrorMessage(LPBSTR pMessage)

Esse método retorna uma nova cadeia de caracteres com a mensagem de erro de carregamento do documento XML, se houver. Ele sempre retorna S_OK.

HRESULT SelectNodes(LPCTSTR, xpath, IXMLDOMNodeList **ppNodes)

Esse método permite usar uma expressão XPath para recuperar uma coleção de nós do documento. Ele sempre retorna S_OK.

HRESULT SelectSingleNode(LPCTSTR, xpath, IXMLDOMNode, **ppNode)

Esse método permite que você use uma expressão XPath para recuperar um nó do documento. Ele sempre retorna S_OK.

HRESULT AddSchema(nome do arquivo LPCTSTR, LPCTSTR ns)

Esse método adiciona o nome de um arquivo de esquema externo que será usado para validar o esquema do documento XML quando ele for carregado. O namespace que você fornece é a cadeia de caracteres que você pode usar em consultas XPath, embora isso não tenha sido testado.

HRESULT AddAttribute(IXMLDOMNode *pNode, nome LPCWSTR, valor LPCWSTR)

Esse método adiciona um novo atributo a um nó existente no documento XML. Consulte a Tabela 53.

Tabela 53. HRESULT AddAttribute

Parâmetro Descrição
pNode O nó ao qual você deseja adicionar um atributo
Nome Nome do novo atributo
Valor O valor do novo atributo
HRESULT CreateNode(tipo DOMNodeType, nome LPCWSTR, LPCWSTR ns, IXMLDOMNode **ppNode)

Chame este método para criar um novo nó:

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

Depois de criar um novo nó, você pode adicioná-lo como filho a outro nó chamando o método appendChild do pai.

Funções auxiliares

Função de modelo CreateInstance

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

Essa função é definida em IWizardPageContainer.h e fornece um wrapper de tipo seguro sobre o método IWizardPageContainer-CreateInstance> — por exemplo:

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

Esse código cria um novo componente ID_Directory para recuperar a interface IDirectory desse componente.

Função de modelo GetService

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

Essa função é definida em IWizardPageContainer.h e fornece um wrapper de tipo seguro sobre o método IWizardPageContainer-GetService> — por exemplo:

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

Essa função recupera o componente de sequência de tarefas, que dá suporte à interface ITSVariableBag . (Para ITSVariableBag, você pode usar o método TSVariables da classe WizardPageImpl .)

Referência de esquema do arquivo de configuração do Designer do Assistente de UDI

Esse arquivo é consumido pelo UDI Wizard Designer. Um arquivo separado é criado para cada arquivo de .dll personalizado, que pode conter editores de página de assistente personalizados, tarefas personalizadas ou validadores personalizados. O arquivo deve terminar com .config e residir na pasta installation_folder\Bin\Config (onde installation_folder é a pasta na qual você instalou o MDT).

A Tabela 54 lista os elementos no arquivo de configuração do UDI Wizard Designer e suas descrições. O elemento DesignerConfig é o nó raiz dessa referência.

Tabela 54. Elementos no arquivo de configuração do Designer do Assistente UDI e suas descrições

Nome do elemento Descrição
DesignerConfig Especifica a raiz de todos os outros elementos
DesignerMappings Agrupa um conjunto de elementos da página
Page Especifica um editor de página do assistente a ser carregado no UDI Wizard Designer, que é usado para editar as definições de configuração de uma página do assistente
Param Especifica um parâmetro que é passado para o elemento Task ou Validator pai e corresponde a um elemento Setter no arquivo de configuração do UDI Wizard Observação: os atributos para esse elemento são diferentes se o pai for o elemento Task ou Validator .
Tarefa Especifica uma tarefa dentro da biblioteca de tarefas
Item de tarefa Especifica um grupo de parâmetros que são passados para a tarefa
Biblioteca de tarefas Agrupa um conjunto de elementos de Tarefa
Validador Especifica um validador na biblioteca do validador
ValidatorLibrary Agrupa um conjunto de elementos do validador

DesignerConfig

Esse elemento especifica a raiz de todos os outros elementos.

Informações sobre o elemento

A Tabela 55 fornece informações sobre o elemento DesignerConfig .

Tabela 55. Informações do elemento DesignerConfig

Atributo Valor
Número de ocorrências Um: Este elemento é necessário.
Elementos pai Nenhum
Conteúdos DesignerMappings, TaskLibrary, ValidatorLibrary
Atributos do elemento

Esse elemento não tem atributos.

Comentários

Nenhuma.

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

DesignerMappings

Esse elemento agrupa um conjunto de elementos Page .

Informações sobre o elemento

A Tabela 56 fornece informações sobre o elemento DesignerMappings .

Tabela 56. Informações do elemento DesignerMappings

Atributo Valor
Número de ocorrências Zero ou um dentro do elemento DesignerConfig (Esse elemento será opcional se não houver nenhuma página de assistente personalizada na DLL que corresponda a esse arquivo de configuração do UDI Wizard Designer.)
Elementos pai DesignerConfig
Conteúdos Page
Atributos do elemento

Esse elemento não tem atributos.

Comentários

Nenhuma.

Exemplo
<DesignerConfig>
   + <TaskLibrary>
   + <ValidatorLibrary>
   - <DesignerMappings>
        <Page DLL="SharedPages.dll"
           Description="Used to display text that describes the current stagegroup"
           Type="Microsoft.SharedPages.WelcomePage"
           DisplayName="Welcome"
           Image="Welcome_188.png"
           DesignerType="Microsoft.Enterprise.UDIDesigner.CoreModules.Views.WelcomePageView"
           DesignerAssembly="Microsoft.Enterprise.UDIDesigner.CoreModules.dll"/>
        <Page DLL="OSDRefreshWizard.dll"
           Description="Captures or restores user state data"
           Type="Microsoft.OSDRefresh.UserStatePage"
           DisplayName="User Data"
           Image="UserState_188.png"
           DesignerType="Microsoft.Enterprise.UDIDesigner.CoreModules.Views.UserStatePageView"
           DesignerAssembly="Microsoft.Enterprise.UDIDesigner.CoreModules.dll"/>
        <Page DLL="OSDRefreshWizard.dll"
           Description="Allows selecting the image to install, target drive, and whether to format"
           Type="Microsoft.OSDRefresh.VolumePage"
           DisplayName="Volume"
           Image="Volume_188.png"
           DesignerType="Microsoft.Enterprise.UDIDesigner.CoreModules.Views.VolumePageView"
           DesignerAssembly="Microsoft.Enterprise.UDIDesigner.CoreModules.dll"/>
     </DesignerMappings>
</DesignerConfig>

Page

Esse elemento especifica um editor de página de assistente a ser carregado no UDI Wizard Designer, que por sua vez é usado para editar as definições de configuração de uma página de assistente.

Informações sobre o elemento

A Tabela 57 fornece informações sobre o elemento Page .

Tabela 57. Informações do elemento da página

Atributo Valor
Número de ocorrências Uma ou mais para cada página do assistente definida no elemento DesignerMappings
Elementos pai DesignerMappings
Conteúdos Qualquer conteúdo XML bem formado
Atributos do elemento

A Tabela 58 lista os atributos do elemento Page e uma descrição para cada um.

Tabela 58. Atributos e valores correspondentes para o elemento de página

Atributo Descrição
Descrição Especifica o texto que fornece informações sobre o parâmetro, que é exibido no UDI Wizard Designer
DesignerAssembly Especifica o nome do arquivo de .dll associado ao editor de páginas do assistente (o arquivo .dll deve existir na pasta installation_folder\Bin (onde installation_folder é a pasta na qual você instalou o MDT.)
DesignerType Especifica o nome do editor de páginas do assistente no arquivo .dll especificado no atributo DesignerAssembly (Esse é o tipo Microsoft .NET para o editor de páginas do assistente, com o namespace Microsoft .NET totalmente qualificado.)
DisplayName Especifica o nome amigável do editor de página, que é exibido no UDI Wizard Designer
DLL Especifica o nome do arquivo .dll associado à página do assistente (o arquivo .dll deve existir na pasta installation_folder\Templates\Distribution\Tools\platform (em que installation_folder é a pasta na qual você instalou o MDT e a plataforma é x86 para a versão de 32 bits ou x64 é para a versão de 64 bits.) Observação: Verifique se a arquitetura do processador DLL corresponde à arquitetura do processador MDT instalada. Por exemplo, se você instalou uma versão de 32 bits do MDT, certifique-se de usar uma DLL de 32 bits para a página do assistente.
Imagem Especifica o nome de uma imagem da página que está no formato PNG (O arquivo .png deve existir na pasta installation_folder\Bin\Images (onde installation_folder é a pasta na qual você instalou o MDT.)
Tipo Especifica o editor de página do assistente e deve corresponder ao nome usado quando a página personalizada foi registrada
Comentários

O UDI Wizard Designer usa o elemento Page como um modelo para criar o XML inicial para um novo assistente. O UDI Wizard Designer executa a validação de esquema para garantir que os elementos Page e filho tenham um formato válido. Esse elemento fornece um mapeamento entre o tipo de página do Assistente UDI e as informações que o UDI Wizard Designer precisa para editar e criar páginas desse tipo usando um editor de página personalizado.

Exemplo

Nenhuma.

Parâmetros

Esse elemento especifica um parâmetro que é passado para o elemento Task ou Validator pai e corresponde a um elemento Setter no arquivo de configuração do UDI Wizard.

Observação

Os atributos desse elemento serão diferentes se o pai for o elemento Task ou Validator .

Informações sobre o elemento

A Tabela 59 fornece informações sobre o elemento Param .

Tabela 59. Informações do elemento de parâmetro

Atributo Valor
Número de ocorrências Um ou mais para cada elemento pai TaskItem ou Validator
Elementos pai TaskItem, Validator
Conteúdos Qualquer conteúdo XML bem formado
Atributos do elemento

A Tabela 60 lista os atributos do elemento Param e fornece uma descrição de cada um.

Tabela 60. Atributos e valores correspondentes para o elemento de parâmetro

Atributo Descrição
Descrição Especifica o texto que fornece informações sobre o parâmetro, que é exibido no UDI Wizard Designer Observação: esse atributo é válido somente para o elemento Validator.
DisplayName Especifica o nome amigável do parâmetro validador, que é exibido para a página apropriada do UDI Wizard no UDI Wizard Designer (esse nome geralmente é mais descritivo do que o atributo Name.) Observação: esse atributo é válido somente para o elemento Validator.
Nome Especifica o nome do parâmetro que é passado para a tarefa ou validador, dependendo do elemento pai (esse atributo se tornará o atributo Property em um elemento Setter no arquivo de configuração do UDI Wizard.) Observação: Esse parâmetro é usado para os elementos pai TaskItem e Validator .
Comentários

Nenhuma.

Exemplo

Nenhuma.

Tarefa

Esse elemento especifica uma tarefa dentro da biblioteca de tarefas.

Informações sobre o elemento

A Tabela 61 fornece informações sobre o elemento Task .

Tabela 61. Informações do elemento da tarefa

Atributo Valor
Número de ocorrências Um ou mais dentro do elemento TaskLibrary (esse elemento não será opcional se o elemento TaskLibrary for especificado).
Elementos pai Biblioteca de tarefas
Conteúdos Item de tarefa
Atributos do elemento

A Tabela 62 lista os atributos do elemento Task e fornece uma descrição de cada um.

Tabela 62. Atributos e valores correspondentes para o elemento de tarefa

Atributo Descrição
Descrição Especifica o texto que fornece informações sobre a tarefa, que é exibida no UDI Wizard Designer
DLL Especifica o nome do arquivo .dll associado à tarefa (o arquivo .dll deve existir na pasta installation_folder\Templates\Distribution\Tools\platform (em que installation_folder é a pasta na qual você instalou o MDT e a plataforma é x86 para a versão de 32 bits ou x64 para a versão de 64 bits.)
Nome Especifica o nome da tarefa, que é exibido na página apropriada do Assistente de UDI e no UDI Wizard Designer
Tipo Especifica o tipo de tarefa, que é registrado no registro de fábrica e usado para chamar uma tarefa específica em um arquivo .dll
Comentários

Nenhuma.

Exemplo

Nenhuma.

Item de tarefa

Esse elemento especifica um grupo de parâmetros que são passados para a tarefa.

Informações sobre o elemento

A Tabela 63 fornece informações sobre o elemento TaskItem .

Tabela 63. Informações do elemento TaskItem

Atributo Valor
Número de ocorrências Um ou mais para cada elemento Task
Elementos pai Tarefa
Conteúdos Param
Atributos do elemento

A Tabela 64 lista os atributos do elemento TaskItem e fornece uma descrição de cada um.

Tabela 64. Atributo e valores correspondentes para o elemento TaskItem

Atributo Descrição
Tipo Especifica o tipo de elemento que será criado no arquivo de configuração do Assistente UDI. Será criado um elemento XML que corresponda ao valor desse atributo. Por exemplo, se o valor desse atributo for Arquivo, um elemento Arquivo será criado no arquivo de configuração do Assistente UDI.

Atualmente, os únicos valores com suporte são:

- File, que requer dois elementos filho Param (um elemento filho Param com o atributo Name definido como Source e outro elemento filho Param com o atributo Name definido como Dest)
- Setter, que requer um elemento filho Param
Comentários

Nenhuma.

Exemplo

Nenhuma.

Biblioteca de tarefas

Esse elemento agrupa um conjunto de elementos Task .

Informações sobre o elemento

A Tabela 65 fornece informações sobre o elemento TaskLibrary .

Tabela 65. Informações do elemento TaskLibrary

Atributo Valor
Número de ocorrências Zero ou um dentro do elemento DesignerConfig (esse elemento será opcional se não houver tarefas personalizadas na DLL que correspondam a esse arquivo de configuração do UDI Wizard Designer).
Elementos pai DesignerConfig
Conteúdos Tarefa
Atributos do elemento

Esse elemento não tem atributos.

Comentários

Nenhuma.

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

Validador

Esse elemento especifica um validador dentro da biblioteca do validador.

Informações sobre o elemento

A Tabela 66 fornece informações sobre o elemento Validator .

Tabela 66. Informações do elemento validador

Atributo Valor
Número de ocorrências Zero ou mais dentro do elemento ValidatorLibrary (esse elemento é opcional).
Elementos pai ValidatorLibrary
Conteúdos Param
Atributos do elemento

A Tabela 67 lista os atributos do elemento Validator e fornece uma descrição de cada um.

Tabela 67. Atributos e valores correspondentes para o elemento validador

Atributo Descrição
Descrição Especifica o texto que fornece informações sobre o validador, que é exibido no UDI Wizard Designer
DisplayName Especifica o nome amigável do validador exibido no UDI Wizard Designer (esse nome geralmente é mais descritivo do que o atributo Name).
DLL Especifica o nome do arquivo .dll associado ao validador (o arquivo .dll deve existir na pasta installation_folder\Templates\Distribution\Tools\platform (em que installation_folder é a pasta na qual você instalou o MDT e a plataforma é x86 para a versão de 32 bits ou x64 para a versão de 64 bits.)
Nome Especifica o nome do validador, que é exibido na página apropriada do Assistente UDI e no UDI Wizard Designer
Tipo Especifica o tipo de validador, que é registrado com o fator de registro e usado para chamar um validador específico em um arquivo .dll
Comentários

Nenhuma.

Exemplo

Nenhuma.

ValidatorLibrary

Esse elemento agrupa um conjunto de elementos Validator .

Informações sobre o elemento

A Tabela 68 fornece informações sobre o elemento ValidatorLibrary .

Tabela 68. Informações do elemento ValidatorLibrary

Atributo Valor
Número de ocorrências Zero ou um dentro do elemento DesignerConfig (esse elemento será opcional se não houver validadores personalizados na DLL que correspondam a esse arquivo de configuração do UDI Wizard Designer.)
Elementos pai DesignerConfig
Conteúdos Validador
Atributos do elemento

Esse elemento não tem atributos.

Comentários

Nenhuma.

Exemplo

<DesignerConfig> + <TaskLibrary> - <ValidatorLibrary> +<Validator DLL="" Description="Requer texto em um campo" Type="Microsoft.Wizard.Validation.NonEmpty" Name="NonEmpty"> +<Validator DLL="" Description="Não permite que certos caracteres estejam em um campo" Type="Microsoft.Wizard.Validation.InvalidChars" Name="InvalidChars"> +<Validator DLL="" Description="Deve seguir um padrão predefinido" Type="Microsoft.Wizard.Validation.RegEx" Name=" NamedPattern"> +<Validator DLL="" Description="Exigir que o conteúdo corresponda a uma expressão regular" Type="Microsoft.Wizard.Validation.RegEx" Name="RegEx"></ValidatorLibrary> + <DesignerMappings></DesignerConfig>

Referência do Designer do Assistente de UDI

Controles

Os controles usados para criar editores de página de assistente personalizados para uso no UDI Wizard Designer são instâncias de UserControl do WPF. A Tabela 69 lista os controles que você pode usar para criar editores de página de assistente personalizados.

Tabela 69. Controles que podem ser usados para criar editores de página de assistente personalizados

Control Descrição
CollectionTControl Esse controle é usado para editar dados armazenados no elemento Data dentro de um elemento Page .
FieldElementControl Esse controle é usado para editar um campo, que normalmente é vinculado a um controle TextBox na página .xaml.
SetterControl Esse controle é usado para modificar o valor de um elemento setter no arquivo de configuração do Assistente de UDI.

CollectionTControl

Esse controle fornece muitos recursos para edição de dados. A melhor maneira de aprender a usar esse controle é examinar o exemplo, que mostra como editar dados no elemento Data de uma página. Em particular, o exemplo mostra como adicionar, remover e editar itens nesse controle.

FieldElementControl

Use esse controle para editar um campo, que normalmente é vinculado a um controle TextBox na página .xaml.

Exemplo

O trecho a seguir de um arquivo .xaml ilustra o uso do FieldElementControl para configurar o valor padrão de um campo em uma página de assistente usando um controle TextBox filho:

<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>
Propriedades
Dados de Campo

Essa propriedade de cadeia de caracteres contém informações para conectar o FieldElementControl ao XML subjacente do campo. A conexão é feita com uma propriedade da interface do editor de páginas. O seguinte trecho de um arquivo .xaml ilustra o uso da propriedade FieldData :

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

Neste trecho, a interface do editor de página é chamada ControlRoot e é especificada no parâmetro ElementName . A associação é executada à propriedade DataContext.Location da interface do editor de páginas ControlRoot . DataContext é um modelo de exibição que aponta para o elemento Page no arquivo de configuração do Assistente de UDI. Local é uma propriedade da exibição que retorna uma lista dos locais possíveis e é definida por um elemento Data no arquivo de configuração do UDI Wizard. Cada local é definido por um elemento DataItem no arquivo de configuração do Assistente UDI.

HeaderText

Essa propriedade de cadeia de caracteres permite especificar um cabeçalho para o controle FieldElementControl . O cabeçalho atua como um título para o controle e é formatado como texto laranja em negrito exibido imediatamente acima do controle.

Texto de instrução

Essa propriedade de cadeia de caracteres permite especificar texto informativo para o controle FieldElementControl . Normalmente, o texto é usado para fornecer uma breve descrição do campo e explicar como a configuração do campo afeta a página correspondente do assistente.

HideEnableButton

Essa propriedade booleana permite controlar a visibilidade do botão que muda de estado entre Desbloqueado e Bloqueado (habilitado ou desabilitado). Se definido como:

  • Verdadeiro, o botão não está visível

  • False, o botão está visível (este é o valor padrão).

HideDefaultTab

Essa propriedade booleana permite controlar a visibilidade da seção que contém o controle usado para definir o valor padrão. Embora a propriedade se refira a uma guia, não há guia no FieldElementControl , mas sim uma seção que pode ser ocultada. Se definido como:

  • Verdadeiro, a seção não está visível

  • False, a seção está visível (este é o valor padrão).

HideBorder

Essa propriedade booleana permite controlar a visibilidade da borda ao redor do controle de campo. Se definido como:

  • Verdadeiro, a borda não está visível

  • False, a borda está visível (esse é o valor padrão).

HideImage

Essa propriedade booleana permite controlar a visibilidade da imagem configurada pela propriedade FieldImageSource . Se definido como:

  • É verdade que a imagem não está visível

  • False, a imagem está visível (este é o valor padrão.)

HideValidationTab

Essa propriedade booleana permite controlar a visibilidade da seção em que a lista de validadores é gerenciada. Embora a propriedade se refira a uma guia, não há guia no FieldElementControl , mas sim uma seção que pode ser ocultada. Se definido como:

  • Verdadeiro, a seção não está visível

  • False, a seção está visível (este é o valor padrão).

HideSummaryTab

Essa propriedade booleana permite controlar a visibilidade da seção na qual você configura a legenda do resumo do campo. A legenda e o valor correspondente do campo são exibidos em um tipo de página do assistente SummaryPage em um fluxo de estágio. Embora a propriedade se refira a uma guia, não há guia no FieldElementControl , mas sim uma seção que pode ser ocultada. Se definido como:

  • Verdadeiro, a seção não está visível

  • False, a seção está visível (este é o valor padrão).

HideTaskSequenceTab

Essa propriedade booleana permite controlar a visibilidade da seção na qual você configura a variável de sequência de tarefas que corresponde ao campo. Embora a propriedade se refira a uma guia, não há guia no FieldElementControl , mas sim uma seção que pode ser ocultada. Se definido como:

  • Verdadeiro, a seção não está visível

  • False, a seção está visível (este é o valor padrão).

SetterControl

Use esse controle para modificar o valor de um elemento Setter no arquivo de configuração do Assistente de UDI. Esse controle contém um controle filho usado para modificar o valor do elemento setter .

Exemplo

O trecho a seguir de um arquivo .xaml ilustra o uso do SetterControl para modificar um elemento Setter chamado KeyLocationSetter usando um controle TextBox filho.

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

Você precisa associá-lo a uma propriedade de sua vista ou modelo de vista que se conecta ao setter. Isso é semelhante a como você associaria a um campo, conforme descrito para o FieldElementControl.

HeaderText

Esta propriedade permite definir o texto que aparecerá no cabeçalho do controle. Pense nessa propriedade como um título para o controle; Por padrão, ele aparece como texto laranja em negrito.

Texto de instrução

Defina essa propriedade para o texto que você deseja que apareça abaixo do cabeçalho — normalmente, um texto de instrução que informa ao usuário do editor personalizado quando e por que ele deseja modificar o comportamento do campo.

Interfaces

A Tabela 70 lista as interfaces que você pode usar para criar editores de página de assistente personalizados.

Tabela 70. Interfaces que podem ser usadas para criar editores de página de assistente personalizados

Interface Descrição
IDataService Use essa interface para conectar campos aos elementos de dados no arquivo de configuração do UDI Wizard.
IMessageBoxService Essa interface fornece acesso a métodos que você pode usar para exibir caixas de mensagem.

IDataService

Essa interface contém várias propriedades e métodos, mas há apenas uma propriedade que você gostaria de precisar. Essa propriedade é a única documentada aqui.

Você pode usar a injeção de dependência para obter um ponteiro para essa interface usando um código como este em sua classe:

[Dependency]
public IDataService DataService { get; set; }
Propriedades

A Tabela 71 lista as propriedades da interface IDataService .

Tabela 71. Propriedades da interface IDataService

Interface Descrição
CurrentPage Essa propriedade fornece acesso aos elementos, atributos e valores XML abaixo do contexto da página atual que está sendo editada no arquivo de configuração do Assistente UDI
CurrentPage
XElement CurrentPage { get; set; }

Essa propriedade fornece acesso ao XML da página atual. Você nunca deve definir essa propriedade, mas é livre para modificar o XML da sua página. O editor de página de exemplo mostra exemplos de modificação do XML. Você usa essa propriedade principalmente quando tem dados personalizados. Para campos e propriedades (setters), você pode usar controles predefinidos que cuidam de todos os detalhes.

IMessageBoxService

Essa interface fornece acesso a métodos que você pode usar para exibir caixas de mensagem. Você pode estar se perguntando por que precisa de uma interface para exibir uma caixa de mensagem. A realidade é que você não: A Microsoft usa essa interface com o código, pois ela ajuda a escrever testes automatizados para páginas de designer.

No entanto, o uso desses métodos oferece um benefício útil: as caixas de diálogo sempre têm o "proprietário" definido como o Assistente UDI, o que garante que a caixa de diálogo seja agrupada corretamente com a janela principal.

Você pode usar a injeção de dependência para obter um ponteiro para essa interface usando um código como este em sua classe:

[Dependency]
public IMessageBoxService MessageBoxes { get; set; }
Métodos

A Tabela 72 lista os métodos para a interface IMessageBoxService .

Tabela 72. Métodos para a interface IMessageBoxService

Method Descrição
ShowMessageBox Esse método sobrecarregado é usado para exibir uma caixa de mensagem com os seguintes membros:

- ShowMessageBox(Mensagem de cadeia de caracteres, legenda de cadeia de caracteres, ícone MessageBoxImage)
- ShowMessageBox(mensagem de cadeia de caracteres, legenda de cadeia de caracteres, botão MessageBoxButton, ícone MessageBoxImage)
- ShowMessageBox (exceção de exceção)
ShowDialogWindow Use esse método para criar uma nova caixa de diálogo.
ShowWizardWindow Use esse método para exibir um editor personalizado dentro de uma caixa de diálogo que inclui os botões Avançar e Voltar para navegação.
ShowMessageBox

Esse método exibe uma caixa de mensagem que é um filho do editor de página personalizado do assistente. Este membro está sobrecarregado: A Tabela 73 contém uma lista dos membros e uma breve descrição de cada um. Para obter informações completas sobre cada membro (incluindo sintaxe, uso e exemplos), consulte a seção que corresponde a cada membro.

Tabela 73. Membros sobrecarregados para o método ShowMessagBox

Member Descrição
ShowMessageBox(Mensagem de cadeia de caracteres, legenda de cadeia de caracteres, ícone MessageBoxImage) Exibe uma caixa de mensagem com um ícone e um botão OK
ShowMessageBox(mensagem de cadeia de caracteres, legenda de cadeia de caracteres, botão MessageBoxButton, ícone MessageBoxImage) Exibe uma caixa de mensagem com um ícone e diferentes combinações possíveis de botões
ShowMessageBox (exceção de exceção) Exibe uma caixa de mensagem que fornece informações sobre uma exceção e tem um botão OK
ShowMessageBox(Mensagem de cadeia de caracteres, legenda de cadeia de caracteres, ícone MessageBoxImage)
void ShowMessageBox(String message, String caption, MessageBoxImage icon);

Esse método exibe uma caixa de mensagem com um botão OK . Consulte a Tabela 74.

Tabela 74. Parâmetros para o método ShowMessageBox(String message, String legenda, ícone MessageBoxImage)

Parâmetro Descrição
message A mensagem a ser exibida na área de conteúdo da caixa de mensagem
caption O texto a ser exibido na barra de título da caixa de diálogo
icon O tipo de ícone a ser exibido na caixa de mensagem
ShowMessageBox(mensagem de cadeia de caracteres, legenda de cadeia de caracteres, botão MessageBoxButton, ícone MessageBoxImage)
MessageBoxResult ShowMessageBox(string message, string caption, MessageBoxButton button, MessageBoxImage icon);

Esse método exibe uma caixa de mensagem com o conjunto de botões que você deseja mostrar e relata qual botão você selecionou. Consulte a Tabela 75.

Tabela 75. Parâmetros para o método ShowMessageBox (mensagem de cadeia de caracteres, legenda de cadeia de caracteres, botão MessageBoxButton, ícone MessageBoxImage)

Parâmetro Descrição
message A mensagem a ser exibida na área de conteúdo da caixa de mensagem
caption O texto a ser exibido na barra de título da caixa de diálogo
do botão Quais botões mostrar
icon O tipo de ícone a ser exibido na caixa de mensagem
ShowMessageBox (exceção de exceção)
void ShowMessageBox(Exception exception);

Esse método exibe uma caixa de mensagem que relata informações sobre uma exceção. Esta caixa de mensagem tem um único botão OK . Consulte a Tabela 76.

Tabela 76. Parâmetros para o método ShowMessageBox(exceção de exceção)

Parâmetro Descrição
exceção A exceção que você deseja relatar (a caixa de diálogo usa exceção. mensagem conforme o conteúdo.)
ShowDialogWindow
void ShowDialogWindow(Type viewType, DialogInteraction dialogPayload);

Esse método cria uma nova caixa de diálogo, cujo conteúdo é o texto fornecido no parâmetro viewType . O UDI Designer cria uma nova instância desse tipo e a encapsula em uma caixa de diálogo que tem os botões OK e Cancelar.

Você passa dados para seu controle usando o parâmetro dialogPayload. A solução SampleEditor no diretório do SDK tem um exemplo de como usar essa funcionalidade.

ShowWizardWindow
void ShowWizardWindow(Type viewType, DialogInteraction dialogPayload);

Esse método permite que você exiba um editor personalizado dentro de uma caixa de diálogo que inclui botões Avançar e Voltar para navegação. A Microsoft não forneceu um exemplo de como usar esse método.

Referência de esquema do arquivo de configuração do Assistente UDI

Esse arquivo é consumido pelo Assistente de UDI e configurado pelo UDI Wizard Designer. Este arquivo é usado para configurar:

  • Páginas do assistente exibidas no Assistente de UDI

  • A sequência das páginas do assistente no Assistente UDI

  • Configurações dos campos de cada página do assistente

  • StageGroups disponíveis no UDI Wizard Designer

  • Estágios disponíveis em cada assistente de implantação no UDI Wizard Designer

    77 lista os elementos no Arquivo de Configuração do Assistente UDI e suas descrições. O elemento Wizard é o nó raiz dessa referência.

Tabela 77. Elementos no arquivo de configuração do assistente UDI e suas descrições

Nome do elemento Descrição
Dados Agrupa os elementos DataItem individuais em um elemento Page e é nomeado pelo atributo Name .
Item de Dados Agrupa os elementos Setter individuais em um elemento Page . Você pode criar dados hierárquicos incluindo um ou mais elementos Data em um elemento DataItem . Cada elemento DataItem representa um item individual. Por exemplo, uma lista de unidades disponíveis pode ter um DataItem para o nome de exibição e outro elemento DataItem para a letra da unidade correspondente.
Padrão Especifica um valor padrão para o campo especificado no elemento Field ou RadioGroup pai. O padrão é definido como o valor entre colchetes por esse elemento.
DLL Especifica uma DLL que deve ser carregada e referenciada pelo Assistente de UDI e pelo UDI Wizard Designer.
DLLs Agrupa os elementos DLL individuais.
Erro Especifica um possível código de erro que uma tarefa pode retornar. O valor do código de erro é retornado pelo HRESULT da tarefa e é interceptado por esse elemento para fornecer informações de erro mais específicas.
Código de saída Especifica um possível código de saída para uma tarefa. Os códigos de saída são códigos de retorno que a tarefa espera. Crie um elemento ExitCode para cada código de saída possível. Caso contrário, você pode especificar um asterisco (*) no atributo Value para lidar com códigos de retorno não listados em outros elementos ExitCode .
ExitCodes Agrupa um conjunto de elementos ExitCode e Error para um elemento Task ou um elemento Error .
Field Especifica uma instância de um controle em um elemento Page que é usado para fornecer personalização com XML. Nem todos os controles permitem personalização com XML — apenas controles que usam o elemento Field .
Fields Agrupa os elementos Field individuais em um elemento Page .
Arquivo Especifica a origem e o destino de uma operação de cópia de arquivo usando o tipo de tarefa Microsoft.Wizard.CopyFilesTask . Você pode incluir um elemento File separado para copiar mais de um arquivo em uma única tarefa.
Page Especifica uma instância de uma página e inclui todas as definições de configuração da página.
PageRef Especifica uma referência a uma instância de uma página em um Estágio dentro de um StageGroup.
Pages Agrupa os elementos individuais da página .
RadioGroup Especifica um grupo de botões de opção dentro de um elemento Field .
StageGroup Especifica um grupo de um ou mais estágios.
Grupos de estágios Agrupa um conjunto de grupos de estágio em um arquivo de configuração do Assistente UDI.
Setter Especifica uma configuração de propriedade de um valor para uma propriedade nomeada na propriedade Property .
Etapa Especifica um estágio em um StageGroup e contém um ou mais elementos PageRef .
Estilo Agrupa os elementos setter individuais que configuram a aparência do Assistente de UDI, incluindo o título mostrado na parte superior do assistente e a imagem da faixa mostrada no Assistente de UDI.
Tarefa Especifica uma tarefa que deve ser executada na página especificada no elemento Page pai.
Tarefas Agrupa um conjunto de tarefas para um elemento da Página .
Validador Especifica um validador para o controle de campo especificado no elemento Field pai.
Assistente Especifica a raiz de todos os outros elementos.

Data

Esse elemento agrupa os elementos DataItem individuais em um elemento Page e é nomeado pelo atributo Name .

Informações sobre o elemento

A Tabela 78 fornece informações sobre o elemento Data .

Tabela 78. Informações do Elemento de Dados

Atributo Valor
Número de ocorrências Zero ou mais em cada elemento Page (esse elemento é opcional).
Elementos pai Page, DataItem
Conteúdos DataItem, Setter
Atributos do elemento

A Tabela 79 lista os atributos do elemento Dados e fornece uma descrição de cada um.

Tabela 79. Atributos e valores correspondentes para o elemento de dados

Atributo Descrição
Nome Especifica o nome do elemento Data
Comentários

O atributo Name permite que o código recupere um conjunto específico de dados.

Exemplo

Nenhuma.

Item de Dados

Este elemento agrupa os elementos Setter individuais dentro de um elemento Page . Você pode criar dados hierárquicos incluindo um ou mais elementos Data em um elemento DataItem . Cada elemento DataItem representa um item individual. Por exemplo, uma lista de unidades disponíveis pode ter um DataItem para o nome de exibição e outro elemento DataItem para a letra da unidade correspondente.

Informações sobre o elemento

A Tabela 80 fornece informações sobre o elemento DataItem .

Tabela 80. Informações do Elemento DataItem

Atributo Valor
Número de ocorrências Zero ou mais em cada elemento de dados (esse elemento é opcional).
Elementos pai Dados
Conteúdos Setter de Dados
Atributos do elemento

Esse elemento não tem atributos.

Comentários

Nenhuma.

Exemplo

Nenhuma.

Padrão

Esse elemento especifica um valor padrão para o campo especificado no elemento Field ou RadioGroup pai. O padrão é definido como o valor que este elemento coloca entre colchetes.

Informações sobre o elemento

A Tabela 81 fornece informações sobre o elemento Default .

Tabela 81. Informações do elemento padrão

Atributo Valor
Número de ocorrências Zero ou mais dentro de um elemento Field ou RadioGroup (esse elemento é opcional).
Elementos pai Campo, RadioGroup
Conteúdos Pode ser qualquer conteúdo XML bem formado, mas normalmente é texto padrão
Atributos do elemento

Esse elemento não tem atributos.

Comentários

Nenhuma.

Exemplo

No exemplo a seguir, o padrão do campo TimeZone é definido como "Pacific Standard Time":

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

DLL

Esse elemento especifica uma DLL para o Assistente UDI e o UDI Wizard Designer carregarem e referenciarem.

Informações sobre o elemento

A Tabela 82 fornece informações sobre o elemento DLL .

Tabela 82. Informações do elemento DLL

Atributo Valor
Número de ocorrências Uma ou mais dentro do elemento DLLs
Elemento pai DLLs
Conteúdos Nenhum conteúdo permitido para este elemento
Atributos do elemento

A Tabela 83 lista os atributos do elemento DLL e fornece uma descrição de cada um.

Tabela 83. Atributos e valores correspondentes para o elemento DLL

Atributo Descrição
Nome Especifica o nome da DLL a ser referenciada pelo Assistente UDI e pelo UDI Wizard Designer
Comentários

Nenhuma.

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

DLLs

Esse elemento agrupa os elementos DLL individuais.

Informações sobre o elemento

A Tabela 84 fornece informações sobre o elemento DLLs .

Tabela 84. DLLs Informações do Elemento

Atributo Valor
Número de ocorrências Um
Elementos pai Assistente
Conteúdos DLL
Atributos do elemento

Esse elemento não tem atributos.

Comentários

Nenhuma.

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

Erro

Esse elemento especifica um possível código de erro que uma tarefa pode retornar. O valor do código de erro é retornado e interceptado pelo HRESULT da tarefa para fornecer informações de erro mais específicas.

Informações sobre o elemento

A Tabela 85 fornece informações sobre o elemento Error .

Tabela 85. Informações do elemento de erro

Atributo Valor
Número de ocorrências Zero ou mais dentro de cada elemento ExitCode (esse elemento é opcional).
Elementos pai ExitCodes
Conteúdos Qualquer conteúdo XML bem formado
Atributos do elemento

A Tabela 86 lista os atributos do elemento Error e fornece uma descrição de cada um.

Tabela 86. Informações do elemento de erro

Atributo Descrição
Estado Especifica o estado de retorno de uma tarefa que encontrou um erro. Normalmente, o valor desse atributo é definido como Erro. Esse valor é exibido na coluna Estado na página do assistente no Assistente de UDI.
Text Especifica o texto descritivo sobre a condição de erro que a tarefa encontrou.
Tipo Especifica se esse elemento representa um erro, um aviso ou um êxito. O valor especificado emType deve ser exclusivo em um elemento ExitCodes . A seguir estão os valores válidos para esse elemento:

- **0.**O elemento representa um sucesso.
- 1. O elemento representa um aviso.
- -1. O elemento representa um erro.
Valor Especifica o valor do código que a tarefa retornou como um valor numérico. Especificar o valor de um asterisco (*) indica o elemento padrão para códigos de retorno que não estão listados em outros elementos Error .
Comentários

Nenhuma.

Exemplo

Nenhuma.

Código de saída

Esse elemento especifica um possível código de saída para uma tarefa. Os códigos de saída são códigos de retorno que a tarefa espera. Crie um elemento ExitCode para cada código de saída possível. Caso contrário, você pode especificar um asterisco (*) no atributo Value para lidar com códigos de retorno não listados em outros elementos ExitCode .

Informações sobre o elemento

A Tabela 87 fornece informações sobre o elemento ExitCode .

Tabela 87. Informações do elemento ExitCode

Atributo Valor
Número de ocorrências Zero ou mais dentro de cada elemento ExitCodes (esse elemento é opcional.)
Elementos pai ExitCodes
Conteúdos Pelo menos um elemento ExitCode e zero ou mais elementos Error
Atributos do elemento

A Tabela 88 lista os atributos do elemento ExitCode e fornece uma descrição de cada um.

Tabela 88. Atributos e valores correspondentes para o elemento ExitCode

Atributo Descrição
Estado Especifica o estado de retorno de uma tarefa. O valor desse atributo é exibido na coluna Estado na página correspondente do assistente no Assistente UDI. Você pode usar quaisquer valores para esse atributo que sejam significativos para sua tarefa. A seguir estão os valores típicos usados para esse atributo:

- Sucesso
- Atenção
- Erro
Text Especifica o texto descritivo sobre o código existente da tarefa.
Tipo Especifica se esse elemento representa um erro, um aviso ou um êxito. O valor especificado no tipo deve ser exclusivo dentro de um elemento ExitCodes . A seguir estão os valores válidos para esse elemento:

- 0. O elemento representa um sucesso.
- 1. O elemento representa um aviso.
- -1. O elemento representa um erro.
Valor Especifica o valor do código que a tarefa retornou como um valor numérico. Especificar o valor de um asterisco (*) indica o elemento padrão para códigos de retorno que não estão listados em outros elementos ExitCode .
Comentários

Nenhuma.

Exemplo

Nenhuma.

ExitCodes

Esse elemento agrupa um conjunto de elementos ExitCode e Error para um elemento Task ou Error .

Informações sobre o elemento

A Tabela 89 fornece informações sobre o elemento ExitCodes .

Tabela 89. Informações do elemento ExitCodes

Atributo Valor
Número de ocorrências Um dentro de cada elemento Task
Elementos pai Tarefa
Conteúdos Error, ExitCode
Atributos do elemento

Esse elemento não tem atributos.

Comentários

Nenhuma.

Exemplo

Nenhuma.

Campo

Esse elemento especifica uma instância de um controle em um elemento Page usado para fornecer personalização com XML. Nem todos os controles permitem personalização com XML — apenas controles que usam o elemento Field .

Informações sobre o elemento

A Tabela 90 fornece informações sobre o elemento Field .

Tabela 90. Informações do elemento do campo

Atributo Valor
Número de ocorrências Zero ou mais dentro de cada elemento Field (esse elemento é opcional).
Elementos pai Fields
Conteúdos Padrão, Validador
Atributos do elemento

A Tabela 91 lista os atributos do elemento Field e fornece uma descrição de cada um.

Tabela 91. Atributos e valores correspondentes para o elemento de campo

Atributo Descrição
Enabled Especifica se o campo está habilitado para entrada do usuário (o atributo pode ser definido como Verdadeiro ou Falso).
Nome Especifica o nome do campo
Resumo Especifica o texto descritivo exibido na página do assistente de Resumo para o valor definido por esse campo
VarName Especifica o nome da variável de sequência de tarefas lida ou configurada usando o campo no elemento Field pai
Comentários

Esse elemento pode conter zero ou mais elementos Default e zero ou mais elementos Validator .

Exemplo

Nenhuma.

Campos

Esse elemento agrupa os elementos Field individuais em um elemento Page .

Informações sobre o elemento

A Tabela 92 fornece informações sobre o elemento Fields .

Tabela 92. Campos Informações do Elemento

Atributo Valor
Número de ocorrências Zero ou mais em cada elemento Page (esse elemento é opcional).
Elementos pai Page
Conteúdos Campo, RadioGroup
Atributos do elemento

Esse elemento não tem atributos.

Comentários

Nenhuma.

Exemplo

Nenhuma.

Arquivo

Esse elemento especifica a origem e o destino de uma operação de cópia de arquivo usando o tipo de tarefa Microsoft.Wizard.CopyFilesTask . Você pode incluir um elemento File separado para copiar mais de um arquivo em uma única tarefa.

Informações sobre o elemento

A Tabela 93 fornece informações sobre o elemento File .

Tabela 93. Informações do elemento do arquivo

Atributo Valor
Número de ocorrências Um ou mais para cada tarefa que tenha um tipo de tarefa Microsoft.Wizard.CopyFilesTask
Elementos pai Tarefa
Conteúdos Nenhum
Atributos do elemento

A Tabela 94 lista os atributos do elemento File e fornece uma descrição de cada um.

Tabela 94. Atributos e valores correspondentes para o elemento de arquivo

Atributo Descrição
Dest Especifica o caminho totalmente qualificado ou relativo para a pasta de destino do arquivo especificado no atributo de origem . Variáveis de ambiente são permitidas como parte do caminho.
Fonte Especifica o caminho totalmente qualificado ou relativo para o arquivo de origem que o tipo de tarefa Microsoft.Wizard.CopyFilesTask copia. Esse atributo dá suporte a caracteres curinga para que vários arquivos possam ser copiados usando um único elemento File . Variáveis de ambiente são permitidas como parte do caminho.
Comentários

Nenhuma.

Exemplo

Nenhuma.

Page

Esse elemento especifica uma instância de uma página e inclui todas as definições de configuração da página.

Informações sobre o elemento

A Tabela 95 fornece informações sobre o elemento Page .

Tabela 95. Informações do elemento da página

Atributo Valor
Número de ocorrências Um ou mais dentro de cada elemento Pages
Elementos pai Pages
Conteúdos Dados, Campos, Setter, Tarefas
Atributos do elemento

A Tabela 96 lista os atributos do elemento Page e fornece uma descrição de cada um.

Tabela 96. Atributos e valores correspondentes para o elemento de página

Atributo Descrição
DisplayName Especifica o nome amigável da página do assistente exibida no UDI Wizard Designer. Esse nome geralmente é mais descritivo do que o atributo Name .
Nome Especifica o nome da página do assistente exibida no UDI Wizard Designer.
Tipo Especifica o tipo de página do assistente que se relaciona diretamente a uma página específica do assistente em uma DLL.
Comentários

Nenhuma.

Exemplo

Nenhuma.

PageRef

Esse elemento especifica uma referência a uma instância de uma página em um Stage dentro de um StageGroup.

Informações sobre o elemento

A Tabela 97 fornece informações sobre o elemento PageRef .

Tabela 97. Informações do elemento PageRef

Atributo Valor
Número de ocorrências Um ou mais dentro de um elemento de Palco
Elementos pai Etapa
Conteúdos Nenhum
Atributos do elemento

A Tabela 98 lista o atributo do elemento PageRef e fornece uma descrição dele.

Tabela 98. Atributos e valores correspondentes para o elemento PageRef

Atributo Descrição
Page Especifica a instância de uma página em um Estágio dentro de um StageGroup. Defina esse valor como o atributo Name de um elemento Page .
Comentários

Nenhuma.

Exemplo

Nenhuma.

Páginas

Esse elemento agrupa os elementos individuais de Page .

Informações sobre o elemento

A Tabela 99 fornece informações sobre o elemento Pages .

Tabela 99. Páginas Informações do Elemento

Atributo Valor
Número de ocorrências Um
Elementos pai Assistente
Conteúdos Page
Atributos do elemento

Esse elemento não tem atributos.

Comentários

Nenhuma.

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

Esse elemento especifica um grupo de botões de opção com em um elemento Field .

Informações sobre o elemento

A Tabela 100 fornece informações sobre o elemento RadioGroup .

Tabela 100. Informações do elemento RadioGroup

Atributo Valor
Número de ocorrências Zero ou mais dentro de um elemento Fields (esse elemento é opcional).
Elementos pai Fields
Conteúdos Padrão
Atributos do elemento

A Tabela 101 lista os atributos do elemento RadioGroup e fornece uma descrição de cada um.

Tabela 101. Atributos e valores correspondentes para o elemento RadioGroup

Atributo Descrição
Locked Especifica se o grupo de botões de opção está habilitado para entrada do usuário. O atributo pode ser definido como:

- Verdade. Especifica que os botões de opção estão desabilitados e os usuários não podem selecionar um botão de opção no grupo.
- False. Especifica que os botões de opção estão habilitados e os usuários podem selecionar um botão de opção no grupo.
Nome Especifica o nome do grupo de opções de opção.
Comentários

Nenhuma.

Exemplo

Nenhuma.

StageGroup

Esse elemento especifica um grupo de estágio de implantação.

Informações sobre o elemento

A Tabela 102 fornece informações sobre o elemento StageGroup .

Tabela 102. Informações do elemento StageGroup

Atributo Valor
Número de ocorrências Um ou mais dentro de um elemento StageGroups
Elementos pai Grupos de estágios
Conteúdos Etapa
Atributos do elemento

A Tabela 103 lista os atributos do elemento StageGroup e uma descrição do atributo.

Tabela 103. Atributos e valores correspondentes para o elemento StageGroup

Atributo Descrição
DisplayName Especifica o nome amigável do grupo de estágios exibido no UDI Wizard Designer. Esse nome geralmente é mais descritivo do que o atributo Name .
Comentários

Nenhuma.

Exemplo

Nenhuma.

Grupos de estágios

Esse elemento agrupa um conjunto de grupos de estágio em um arquivo de configuração do UDI Wizard.

Informações sobre o elemento

A Tabela 104 fornece informações sobre o elemento StageGroups .

Tabela 104. Informações do elemento StageGroups

Atributo Valor
Número de ocorrências Zero ou um dentro de um elemento do assistente
Elementos pai Assistente
Conteúdos StageGroup
Atributos do elemento

Esse elemento não tem atributos.

Comentários

Nenhuma.

Exemplo

Nenhuma.

Setter

Esse elemento especifica uma configuração de propriedade para o valor de uma propriedade nomeada na propriedade Property .

Informações sobre o elemento

A Tabela 105 fornece informações sobre o elemento Setter .

Tabela 105. Informações do elemento setter

Atributo Valor
Número de ocorrências Zero ou mais dentro de cada elemento pai (esse elemento é opcional).
Elementos pai Data, DataItem, Page, Style, Task, Validator
Conteúdos Contém um valor de cadeia de caracteres no atributo Property
Atributos do elemento

A Tabela 106 lista o atributo do elemento Setter e fornece uma descrição dele.

Tabela 106. Atributos e valores correspondentes para o elemento setter

Atributo Descrição
Propriedade Especifica o nome da propriedade que está sendo definida. O nome da propriedade é definido como o valor que esse atributo coloca entre parênteses.
Comentários

Nenhuma.

Exemplo

Nenhuma.

Estágio

Este elemento especifica um Stage dentro de um StageGroup e contém um ou mais elementos PageRef .

Informações sobre o elemento

A Tabela 107 fornece informações sobre o elemento Stage .

Tabela 107. Informações do elemento de estágio

Atributo Valor
Número de ocorrências Um ou mais dentro de um elemento StageGroup
Elementos pai StageGroup
Conteúdos PageRef
Atributos do elemento

A Tabela 108 lista os atributos do elemento Stage e fornece uma descrição de cada um.

Tabela 108. Atributos e valores correspondentes para o elemento de estágio

Atributo Descrição
DisplayName Especifica o nome amigável da página do assistente exibida no UDI Wizard Designer. Esse nome geralmente é mais descritivo do que o atributo Name .
Nome Especifica o nome da platina. O valor desse elemento é usado ao iniciar o UDI Wizard com o parâmetro de linha de comando /stage: name .
Comentários

Nenhuma.

Exemplo

Nenhuma.

Style

Esse elemento agrupa os elementos Setter individuais que configuram a aparência do Assistente UDI, incluindo o título mostrado na parte superior do assistente e a imagem da faixa mostrada no Assistente UDI.

Informações sobre o elemento

A Tabela 109 fornece informações sobre o elemento Style.

Tabela 109. Informações do elemento de estilo

Atributo Valor
Número de ocorrências Um
Elementos pai Assistente
Conteúdos Setter
Atributos do elemento

Esse elemento não tem atributos.

Comentários

Nenhuma.

Exemplo
<Style>
  <Setter Property="bannerFilename">UDI_Wizard_Banner.bmp</Setter>
  <Setter Property="title">Operating System Deployment (OSD) Refresh Wizard</Setter>
</Style>

Tarefa

Esse elemento especifica uma tarefa que deve ser executada na página especificada no elemento Page pai.

Informações sobre o elemento

A Tabela 110 fornece informações sobre o elemento Task .

Tabela 110. Informações do elemento da tarefa

Atributo Valor
Número de ocorrências Um ou mais dentro de um elemento Tasks
Elementos pai Tarefas
Conteúdos ExitCodes, File, Setter
Atributos do elemento

A Tabela 111 lista os atributos do elemento Task e fornece uma descrição de cada um.

Tabela 111. Atributos e valores correspondentes para o elemento de tarefa

Atributo Descrição
DependsOn Especifica se a tarefa é dependente de outra tarefa. O valor desse atributo é definido como o atributo Name de outro elemento Task . Observação: Esse atributo não pode ser configurado usando o UDI Wizard Designer. No entanto, você pode adicionar manualmente esse atributo a um elemento Task modificando diretamente o arquivo .xml.
DisplayName Especifica o nome amigável da tarefa exibida no UDI Wizard Designer. Esse nome geralmente é mais descritivo do que o atributo Name .
Nome Especifica o nome da tarefa. Esse nome deve ser exclusivo.
Tipo Especifica o tipo de tarefa para a tarefa a ser executada, que é definido na DLL que contém a tarefa.
Comentários

Nenhuma.

Exemplo

Nenhuma.

Tarefas

Esse elemento agrupa um conjunto de tarefas para um elemento Page .

Informações sobre o elemento

A Tabela 112 fornece informações sobre o elemento Tasks .

Tabela 112. Informações do elemento Tarefas

Atributo Valor
Número de ocorrências Zero ou um dentro de cada elemento Page (Este elemento é opcional.)
Elementos pai Page
Conteúdos Tarefa
Atributos do elemento

A Tabela 113 lista os atributos do elemento Tasks e fornece uma descrição de cada um.

Tabela 113. Atributos e valores correspondentes para o elemento Tarefas

Atributo Descrição
NameTitle Especifica a legenda que aparece na parte superior da coluna que contém o nome das tarefas na página apropriada do assistente.
StatusTitle Especifica a legenda que aparece na parte superior da coluna que contém o status das tarefas na página apropriada do assistente.
Comentários

Nenhuma.

Exemplo

Nenhuma.

Validador

Esse elemento especifica um validador para o controle de campo especificado no elemento Field pai.

Informações sobre o elemento

A Tabela 114 fornece informações sobre o elemento Validator .

Tabela 114. Informações do elemento validador

Atributo Valor
Número de ocorrências Zero ou um dentro de um elemento Field
Elementos pai Field
Conteúdos Setter
Atributos do elemento

A Tabela 115 lista o atributo do elemento Validator e fornece uma descrição dele.

Tabela 115. Atributos e valores correspondentes para o elemento validador

Atributo Descrição
Tipo Especifica o tipo do validador, que é definido na DLL que contém o validador
Comentários

Nenhuma.

Exemplo

Nenhuma.

Assistente

Esse elemento especifica a raiz de todos os outros elementos.

Informações sobre o elemento

A Tabela 116 fornece informações sobre o elemento Wizard .

Tabela 116. Informações do elemento do assistente

Atributo Valor
Número de ocorrências Um
Elementos pai Nenhum
Conteúdos DLLs, Páginas, StageGroups, Estilo
Atributos do elemento

Esse elemento não tem atributos.

Comentários

Nenhuma.

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