Instalação orientada pelo usuário – Guia de desenvolvedores

A UDI (Instalação Controlada pelo Usuário) ajuda a simplificar a implantação de sistemas operacionais cliente Windows®, como Windows 8.1, para computadores que usam o recurso de implantação do sistema operacional (OSD) no Microsoft ® System Center 2012 R2 Configuration Manager. A UDI faz parte do MDT (Kit de Ferramentas de Implantação Microsoft).

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 configurações antes de iniciar a implantação.

A UDI fornece uma interface controlada pelo assistente que permite que você forneça informações de configuração imediatamente antes de executar a implantação. Esse comportamento permite criar sequências de tarefas genéricas do OSD 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 é escrito para os desenvolvedores que criam páginas de assistente personalizadas para o Assistente da UDI e editores de página de assistente personalizados para o Designer de Assistentes da UDI. Este guia pressupõe que você esteja familiarizado com o desenvolvimento de aplicativos Windows usando:

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

  • Microsoft .NET Framework, que é 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

  • Idiomas que o WPF dá suporte, como C#, C++ou Microsoft Visual Basic® .NET, que são usados para criar editores de página de assistente personalizados

Sobre este guia

Este guia fornece as informações de referência necessárias para ajudar você 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 a 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 da UDI em Usando o kit de ferramentas de implantação Microsoft, que está 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 da UDI é necessário quando você deseja coletar informações adicionais que o processo de implantação da UDI consome. Essas informações adicionais geralmente são salvas como variáveis de sequência de tarefas que a sequência de tarefas etapas em uma sequência de tarefas UDI em Configuration Manager leitura.

Arquitetura UDI

O objetivo de alto nível do desenvolvimento da UDI é criar páginas de assistente personalizadas que podem ser exibidas no Assistente da UDI. Ao criar páginas de assistente personalizadas, você pode estender os recursos existentes da UDI para atender aos requisitos técnicos e comerciais da 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 Designer de Assistentes da UDI e o Assistente de UDI.

Figura 1. Relação entre o Assistente da UDI e a Figura 1 do Designer de Assistentes da UDI . Relação entre o Assistente da UDI e o Designer de Assistentes da UDI

Figura 1. Relação entre o Assistente da UDI e o Designer de Assistentes da UDI

Em um nível conceitual, o desenvolvimento da UDI inclui a criação de:

  • Páginas de assistente personalizadas. As páginas do assistente são exibidas no Assistente de UDI e coletam as informações necessárias para concluir o processo de implantação. Você cria páginas de assistente usando C++ em Microsoft Visual Studio®. As páginas de assistente personalizadas são implementadas como DLLs que o Assistente UDI lê. O SDK (kit de desenvolvimento de software) 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 do assistente personalizado. Os editores de página do assistente personalizado são implementados como DLLs que o Designer de Assistentes da UDI lê. Você cria editores de página do assistente usando:

    • WPF versão 4.0

    • Microsoft Prism versão 4.0

    • Microsoft Unity Application Block (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 Designer de Assistentes da UDI. O SDK da UDI inclui um exemplo de como criar editores de página de assistente personalizados.

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

Preparando o Ambiente de Desenvolvimento da UDI

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

  1. Prepare os pré-requisitos do ambiente de desenvolvimento da UDI, conforme descrito em Preparar os pré-requisitos do ambiente de desenvolvimento da 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 da UDI

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

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

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

Preparar os pré-requisitos de hardware do ambiente de desenvolvimento da UDI

Os pré-requisitos de hardware do ambiente de desenvolvimento da UDI são os mesmos requisitos de hardware para a edição de 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 de ambiente de desenvolvimento da 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 (o Windows 7 ou o Windows Server® 2008 R2 é recomendado.)

    Você precisará de um sistema operacional Windows que dê suporte à arquitetura do processador para a qual deseja desenvolver. Você pode executar o desenvolvimento da UDI de 32 bits e 64 bits usando um sistema operacional de 64 bits. Você só faz 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

    Não há suporte para versões do IntelItanium (IA-64) do sistema operacional Windows para ambientes de desenvolvimento da UDI.

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

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

  • Linguagem C++ (o idioma usado na extensão de páginas do Assistente de UDI)

  • Outros idiomas que o WPF dá suporte, como C#, Visual Basic .NET ou C++/Common Language Infrastructure, que são usados para estender editores de página de 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 o idioma C# se você quiser usar o código-fonte de exemplo.

Configurar o Ambiente de Desenvolvimento da UDI

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

  1. Instale o Visual Studio 2010.

    Verifique se você instala o idioma C++ e qualquer outro idioma compatível com o WPF.

    Observação

    O código-fonte de exemplo para as páginas do editor do Designer de Assistentes da UDI é escrito em C#. Instale o idioma C# se você 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, consulte a seção "Instalando ou atualizando para MDT", no documento MDT Usando o kit de ferramentas de implantação Microsoft.

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

  4. Copie a pasta installation_folder\SDK para local_folder (em que 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 Arquivos de Programa, que não pode ser gravada sem permissões elevadas. Copiar a pasta SDK para outro local permite que você modifique os arquivos na pasta SDK sem exigir permissões elevadas.

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

  6. Renomeie a pasta local_folder\Tools como local_folder\OSDSetupWizard(em que local_folder é a pasta que você criou anteriormente no processo).

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

    Figura 2. Estrutura de pasta 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 da 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 da UDI está configurado corretamente determinando se:

Verificar se o projeto samplepage cria corretamente

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

Para verificar se o projeto SamplePage é criado corretamente

  1. Inicie o Visual Studio 2010.

  2. Abra o projeto SamplePage.

    O projeto SamplePage reside na pasta local_folder\SDK\UDI\SamplePage (em que local_folder é a pasta que você criou anteriormente no processo).

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

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

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

  5. Nas propriedades 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 da Propriedade SamplePage , acesse Propriedades de Configuração/Eventos de Build/Evento pós-build.

  9. Nas propriedades evento pós-build, 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 da Propriedade SamplePage , clique em OK.

  11. Salve o projeto.

  12. No menu Depuração , clique em Iniciar Depuração.

    A caixa de diálogo Microsoft Visual Studioaparece indicando que a origem está desatualizada e pergunta se você deseja criar o projeto.

  13. Na caixa de diálogo Microsoft Visual Studio, clique em Sim.

    A caixa de diálogo Sem Informações de Depuração aparece 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 , clique em Sim.

    O Assistente de UDI é aberto com a página de assistente personalizada exibida.

  15. Verifique se você pode selecionar um valor em Escolher sua localização.

  16. No assistente com o formulário de página de exemplo , clique em Cancelar.

    A caixa de diálogo Cancelar Assistente é exibida.

  17. Na caixa de diálogo Cancelar Assistente , clique em Sim.

  18. Feche o Visual Studio 2010.

Verifique se o projeto SampleEditor é criado corretamente

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

Para verificar se o projeto SampleEditor é criado corretamente

  1. Inicie o Visual Studio 2010.

  2. Abra o projeto SampleEditor.

    O projeto SampleEditor reside na pasta local_folder\SDK\UDI\SampleEditor (em que local_folder é a pasta que você criou anteriormente no processo).

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

  4. No menu Projeto , clique em Adicionar Referência.

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

  5. Na caixa de diálogo Adicionar Referência , clique na guia Procurar .

  6. Na guia Procurar , vá para installation_folder\Bin (em que installation_folder é a pasta na qual você instalou o MDT). Selecione os seguintes arquivos e clique em 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 segurando a tecla CTRL enquanto clica nos arquivos.

  7. Em Gerenciador de Soluções, vá para SampleEditor/References.

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

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

    A caixa de diálogo Páginas de Propriedade SampleEditor é exibida.

  10. Na caixa de diálogo Páginas da Propriedade SampleEditor , clique na guia Depuração .

  11. Na guia Depuração , clique em Iniciar programa externo.

  12. Em Iniciar programa externo, digiteinstallation_folder\Bin\UDIDesigner.exe (em que installation_folder é a pasta na qual você instalou o MDT) e clique em OK.

    Dica

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

  13. No menu Arquivo , clique em Salvar Tudo.

  14. Copie o arquivo local_folder\SDK\SamplePage\SamplePage.dll.config para a pasta installation_folder\Bin\Config (em que local_folder é a pasta que você criou 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 Depuração , clique em Iniciar Depuração.

    O Designer de Assistentes da UDI é iniciado.

  16. No Designer de Assistentes da UDI, na Faixa de Opções, clique em Abrir.

    A caixa de diálogo Abrir é exibida.

  17. Na caixa de diálogo Abrir , abra o arquivo local_folder\SDK\SamplePage\SamplePage\Config.xml (em que local_folder é a pasta que você criou 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, clique na guia Configurar .

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

    • Botão Desbloqueado, com o qual você habilita ou desabilita a caixa Localização

    • Caixa de valor padrão, na qual você insere um valor padrão a ser exibido na caixa Localização

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

    • Caixa de lista de localização, que inclui uma lista de possíveis locais

  20. Feche o Designer de Assistentes da UDI.

  21. Feche o Visual Studio 2010.

Revisar os exemplos de SDK da 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 ajudar você a criar suas próprias páginas de assistente personalizadas da UDI e editores de página de assistente.

Confira os exemplos do SDK da UDI examinando:

Examinar o conteúdo da pasta SDK

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

Tabela 1. Pastas no SDK da 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 de UDI
Libs 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 link estático. Nota: As versões do Itanium das bibliotecas (IA-64) não estão disponíveis.
SampleEditor Um projeto do Visual Studio para criar um editor personalizado usado para editar a página SamplePage no Designer de Assistentes da UDI, que é escrita em C #
SamplePage Um projeto do Visual Studio para criar uma página de assistente de UDI personalizada, que é escrita no Visual C++

Examinar a solução do Visual Studio da Página de Exemplo

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 da 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 personalizado, você precisa substituir esses métodos com seu 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 de página do assistente

Method Descrição
OnWindowCreated Esse método é chamado uma vez, após a criação da janela da página.

Para esse método, escreva um código que inicializa a página pela primeira vez e só precisa ser executado uma vez. Por exemplo, use esse método para inicializar campos ou para ler informações de configuração dos elementos Setter no arquivo de configuração do Assistente de UDI.
OnWindowShown Esse método é chamado sempre que a página é exibida (mostrada) no Assistente da UDI. Ele é chamado na primeira vez que a página é exibida e cada vez que você navega até a página clicando em 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 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 uma criança (normalmente, controles comuns).

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

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

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

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

Examinar o Exemplo de Página de Exemplo

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 de UDI carrega as DLLs necessárias para cada página de assistente listada no arquivo de configuração do Assistente da UDI, conforme descrito na Etapa 2: o assistente UDI carrega a DLL para a Página do Assistente Personalizado.

  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 da 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 clicar em Avançar para prosseguir para o próximo assistente, conforme descrito na Etapa 4: o botão Próximo é clicado na página 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 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 reside na pasta Scripts no pacote Arquivos MDT para configuração.

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

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

  • Elemento DLLs

  • Elemento Style

  • Elemento Pages

  • Elemento StageGroups

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

    O Assistente de UDI examina o elemento DLLs que procura os arquivos .dll a serem carregados. No exemplo, dois arquivos .dll estão listados: SamplePage.dll e SharedPages.dll. Esses arquivos .dll devem residir na mesma pasta que OSDSetupWizard.exe— a pasta Ferramentas\plataforma (em que a plataforma é 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 que procura 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 da página personalizada.

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

  • Seu nome de organização no lugar de Microsoft.

  • Seu nome do projeto no lugar de SamplePage.

  • O nome da página do assistente personalizado no local de LocationPage.

Etapa 2: o assistente UDI carrega a DLL para a página assistente personalizado

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

A função RegisterFactories é usada para registrar a classe factory da página do assistente com o registro de fábrica de classes 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, o 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 Type do elemento Page para a página assistente personalizada.

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 do nome fornecido usando o modelo de função Register deve implementar a interface iClassFactory . A Classe ClassFactoryImpl manipula 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 personalizadas ou validadores e, portanto, não registra tarefas personalizadas ou validadores.

Etapa 3: o assistente UDI exibe a página assistente personalizada

A página assistente personalizada 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 que uma página tem. 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, confira Classes auxiliares de página do assistente

  • Interfaces para as classes de modelo de página do assistente, confira Interfaces de Página do Assistente

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

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

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

    • AddField. Esse método relaciona o controle de caixa IDC_COMBO_LOCATION no recurso IDD_LOCATION_PAGE com o elemento Data chamado Local 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

      Verifique se você chama 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 é passado, que se refere à página atual.

      Observação

      Para dar suporte ao uso desse 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 que não sejam controles de caixa de texto e caixa de seleção. No exemplo, o método SetFieldDefault define o índice inicial do controle da caixa de combinação com base no valor padrão especificado no elemento Padrão 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.

  • OnNextClicked. Este método executa as seguintes tarefas:

    • Atualizações a 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 próximo botão é clicado na página assistente personalizado

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

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

  1. InitSection. Esse método inicializa o cabeçalho (legenda do rótulo) para os 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 valores de campo para variáveis de sequência de tarefas e para os dados exibidos na página Resumo .

Examine a solução SampleEditor Visual Studio

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

Examine a Arquitetura do Designer de Assistentes da UDI

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

Quando você edita as configurações de uma página de assistente, o Designer de Assistentes da UDI carrega o editor de página personalizado que corresponde ao tipo de página do assistente. Os editores de página de assistente personalizados são desenvolvidos como controles de usuário WPF. As páginas personalizadas do editor de páginas do assistente 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 (interface do usuário; 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 Designer de Assistentes da UDI 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, confira Injetar alguma vida em seus aplicativos: Conhecer o Bloco de Aplicativos do Unity.

Examinar componentes configuráveis de uma página do Assistente de UDI

À medida que você cria sua página de assistente personalizado, algumas das configurações podem ser definidas em código e não podem ser alteradas depois de compilar a página. No entanto, para outras configurações, você precisará permitir que essas configurações sejam alteradas usando o Designer de Assistentes da UDI.

Normalmente, as configurações que você deseja configurar usando o Designer de Assistentes da UDI 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 Descoberta de Aplicativo e o tipo de página assistente applicationPage usam.

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

  • Campo. Os campos de uso permitem que os usuários forneçam entrada. Os campos aparecem como elementos field no arquivo de configuração do Assistente de UDI (UDIWizard_Config.xml), que contém as configurações para cada campo. O editor de página do assistente correspondente precisa fornecer um método para editar as configurações 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 você deseja definir. Edite as propriedades usando o SetterControl e configure outros elementos Setter usando outros controles.

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

    O editor de página do assistente personalizado que você cria deve ser capaz de gerenciar essas configurações.

Examinar o Exemplo da Página do Editor

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

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

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

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

  • Código de suporte para os outros componentes

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

  1. Examine como o editor de página assistente SampleEditor é carregado e inicializado no Designer de Assistentes da UDI, conforme descrito no Editor de Páginas do Assistente de Revisão Carregamento e Inicializaçã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 Examinar a Interface do Usuário Usada para Configurar a Caixa de Combinação de Localização.

  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 Examinar a interface do usuário usada para modificar a lista de locais possíveis.

  4. Examine o código usado para gerenciar informações de configuração salvas no arquivo de configuração do Assistente de UDI, conforme descrito em Examinar o Código Usado para Gerenciar Informações de Configuração.

Revisar Carregamento e Inicialização do Editor de Página do Assistente

Editores de página de assistente personalizados são carregados conforme exigido pelo Designer de Assistentes da UDI. Os arquivos de configuração do Designer de Assistente da UDI são carregados quando o Designer de Assistentes da UDI é iniciado. O Designer de Assistentes da UDI verifica a pasta install_folder\Bin\Config (em que install_folder é o nome da pasta em que o MDT está instalado) para arquivos que têm 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 o Designer de Assistentes da UDI, o arquivo SamplePage.dll.confg é encontrado e carregado.

O Designer de Assistentes da UDI usa os seguintes atributos do elemento Page no arquivo SamplePage.dll.confg para carregar e inicializar o exemplo do 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 (em que install_folder é o nome da pasta na qual o MDT está instalado).

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

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

  • Dll. Use esse atributo para configurar o elemento DLL no arquivo de configuração do Assistente da UDI, que o Designer de Assistentes da UDI 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 Designer de Assistentes da UDI, que é usado para adicionar a página do assistente à "Biblioteca de Páginas".

  • DisplayName. Use esse atributo para fornecer o nome da página de assistente personalizada exibida no Designer de Assistentes da UDI. O valor desse atributo é mostrado na caixa de diálogo Adicionar Nova Página no Designer de Assistentes da UDI, que é usado para adicionar a página do assistente à "Biblioteca de Páginas".

    No exemplo, o tipo da página assistente personalizado SamplePage é Microsoft. SamplePage.LocationPage, que é salvo no arquivo Config.xml. O arquivo Config.xml reside na pasta local_folder\SDK\SamplePage\SamplePage para (em que local_folder é a pasta que você criou no computador de desenvolvimento anteriormente no processo de configuração).

Examinar a interface do usuário usada para configurar a caixa de combinação de localização

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

Se você examinar a interface do usuário na guia Design e o código na guia XAML , você poderá ver a relação entre a interface do usuário gráfica e os elementos e atributos na XAML (Linguagem extensível de marcação de aplicativo).

Por exemplo, se você revisar 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 Valor padrão com o elemento Padrão no arquivo de configuração do assistente 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 no XAML.

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

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

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

Examinar botões de faixa de opções e menus sensíveis ao contexto para modificar a lista de locais

Quando você clica com o botão direito do mouse na caixa de lista que contém a lista de locais, um menu sensível ao contexto é exibido. A Faixa de Opções tem botões correspondentes que permitem que você execute as mesmas tarefas. O elemento de controle Views:CollectionsTControl no arquivo LocationPageEditor.xaml define os métodos chamados com base na ação tomada e nas propriedades que você define da seguinte maneira:

  • SelectedItem. Essa propriedade vinculada a dados é ativada quando o usuário seleciona um item da 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 ao editar ou remover um item existente.

  • AddItemAction. Essa ação é executada quando o usuário clica na opção Adicionar Item no menu sensível ao contexto ou nos 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 clica na opção Editar Item no menu sensível ao contexto. 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 clica na opção Remover Item do menu sensível ao contexto. 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, uma mensagem será exibida 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 o 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 clicou em OK.)

    • Um botão Cancelar , que define o status de retorno 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 clicou em Cancelar.)

  • Um elemento WPF que contém:

    • Um rótulo, que você configura usando o atributo Content

    • Uma caixa de texto, que está vinculada ao elemento Data com o nome Local no arquivo de configuração UDI (o arquivo Config.xml no exemplo)

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

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

  • Config.xml arquivo no exemplo fornecido com o SDK da UDI (este arquivo contém apenas as configurações do exemplo.)

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

    No exemplo SampleEditor, a rotina Locais 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 de UDI. Especificamente, a lista retornada contém um item para cada elemento DataItem no arquivo de configuração do Assistente de UDI.

Criando páginas personalizadas do Assistente de 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 desejados (campos) no formulário.

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

    1. Inicialize o formulário.

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

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

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

    2. Atualize os controles com base nas informações lidas quando a página é 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 clicar em Avançar no Assistente de UDI (substituições para o método OnNextClicked ), incluindo as seguintes etapas:

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

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

  7. Crie a solução.

    Verifique se a versão da DLL que você cria é a mesma plataforma de processador que a instalação do MDT, especificamente, a plataforma de processador do Windows Preinstallation Environment (Windows PE). O Assistente de 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 dá 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 você planeja usar.

  8. Copie a DLL para sua página de assistente personalizada para a pasta de plataforma installation_folder\Templates\Distribution\Tools\ (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).

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

Criando editores de página do assistente personalizado

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

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

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

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

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

  5. Adicione instâncias do controle CollectionTControl conforme necessário 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 da UDI com base nas configurações a serem configuradas usando o editor de página do assistente personalizado.

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

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

  10. Crie a solução.

    Observação

    Verifique se a versão da DLL que você cria é 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 arquivo de configuração do Designer de Assistentes da UDI para carregar as DLLs necessárias e mapear o editor de página do assistente com a página de 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ágina do assistente, consulte o elemento DesignerMappings, elementos filho e atributos correspondentes.

  12. Copie o arquivo de configuração do Designer de Assistentes da UDI que você criou na etapa anterior para a pasta installation_folder\Bin\Config (em que installation_folder é a pasta na qual você instalou a versão do MDT).

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

Criando tarefas personalizadas de UDI

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

Observação

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

Para criar tarefas personalizadas de UDI

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

    • Init. Esse método é chamado para inicializar sua tarefa.

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

  2. Escreva o código que registra a fábrica de classes de tarefas personalizada com o registro de fábrica.

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

    Observação

    Verifique se a versão da DLL que você cria é 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 sua tarefa UDI personalizada.

  4. Crie um elemento Task no elemento TaskLibrary no arquivo de configuração do Designer de Assistentes da UDI 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 da tarefa devem incluir o parâmetro BitmapFilename . Especifique todos os outros parâmetros conforme a tarefa requer. Por exemplo, no trecho anterior, o parâmetro de log é usado para especificar um parâmetro para o local de um arquivo de log.

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

  6. Copie a DLL para sua tarefa personalizada para a pasta de plataforma installation_folder\Templates\Distribution\Tools\ (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).

Criando validadores de UDI personalizados

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

Para criar validadores UDI personalizados

  1. O código de gravação 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.

    • IsValid. O controlador de formulário chama esse método para ver se o controle contém texto válido. Veja a seguir um exemplo do método IsValid para um validador que valida que 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 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 desmarcá-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 com o registry factory.

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

    Observação

    Verifique se a versão da DLL que você cria é 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 sua tarefa UDI personalizada.

  4. Crie um elemento Validador no elemento ValidatorLibrary no arquivo de configuração do Designer de Assistentes da UDI 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 Mensagem . 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 arquivo de configuração UDI Wizard Designer criado na etapa anterior para a pasta installation_folder\Bin\Config (em que installation_folder é a pasta na qual você instalou o MDT).

  6. Copie a DLL para sua tarefa personalizada para a pasta de plataforma installation_folder\Templates\Distribution\Tools\ (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).

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.

Criando instâncias de componente

O Assistente de UDI usa fábricas de classes 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 da 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 do WizardPageImpl, você pode criar uma nova instância de um WmiRepoistory como esta:

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

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

Componentes cretáveis

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 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 componente para componentes (o nome do componente é o mesmo que a ID, mas sem a ID_ inicial) registrada com o registro de fábrica (definido em OSDSetupWizard) é mostrada na Tabela 3.

Tabela 3. IDs de componente

ID Descrição
ID_ACPowerTask (ITask, IWizardComponent) Uma tarefa de pré-vôo que garante que seu computador não esteja sendo executado apenas na 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ê não precisará criar uma instância por conta própria, pois sua página recebe sua própria instância
ID_InvalidCharactersValidator (IValidator) Garante que nenhum campo de texto contenha caracteres de uma lista fornecida ao validador
ID_Logger (ILogger) Você não precisará criar uma instância por conta própria, pois sua página recebe um ponteiro para a instância compartilhada
ID_NonEmptyValidator (IValidator) Um validador que garante que nenhum campo esteja vazio
ID_PasswordValidator (IValidator) Um validador que garante que nenhum dos dois campos de texto tenha o mesmo conteúdo
ID_Regex (IRegEx) Avalia expressões regulares, procurando correspondências
ID_RegExValidator (IValidator) Um validador que valida em uma expressão regular ou 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 de sua página por meio do método Form
ID_TaskManager (ITaskManager, IBackgroundCallback, IWizardComponent) Gerencia a execução de um conjunto de tarefas e da 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 ler e escrever 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. Definido SharedPages.dll

ID Descrição
ID_ADHelper (IADHelper) Fornece uma fachada para um conjunto limitado de recursos no AD DS (Active Directory® Domain Services)
ID_CpuInfo (ICpuInfo) Determina se sua CPU tem 32 ou 64 bits
ID_DomainJoinValidator (IDomainJoinValidator) Tem 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 em seu computador
ID_WiredNetworkTask (ITask) Uma tarefa que verifica se você está conectado à rede com um adaptador de rede com fio rígido (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

Tipos de controle de caixa de diálogo Descrição
CONTROL_CHECK_BOX (ICheckBox) Uma fachada para trabalhar com controles de caixa de seleção
CONTROL_COMBO_BOX (IComboBox) Uma fachada para controles de caixa de combinação
CONTROL_GENERIC (IControl) Permite que você trabalhe 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 rádio
CONTROL_STATIC_TEXT (IStaticText) Uma fachada que fornece permissão de leitura/gravação para o texto de um controle, como uma caixa de texto ou rótulo
CONTROL_TREE_VIEW (ItreeView) Uma fachada para trabalhar com um controle de exibição de á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 por meio do 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 caracteres desta 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 relata falha se a caixa de texto (ou qualquer outro controle compatível com IStaticText) tiver um valor de cadeia de caracteres vazio.

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 funciona com dois controles de texto diferentes (controles que dão suporte a IStaticText) e relata 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 semelhante a esta:

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 Senha . Dessa forma, se o controlador de formulário desabilitar o controle Senha , ele também desabilitará o controle Confirmar Senha . Em seguida, adicione um validador de senha ao formulário. Por fim, forneça o validador de senha com a interface para o controle Confirmar Senha .

Devido ao requisito de dois controles, você deve usar o 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 (aquele que dá suporte a IStaticText) a 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. Setters de padrão nomeados

Padrão de Descrição
Nome de usuário Verifica se o texto é do domínio do formulário\usuário ou user@domain
Computername 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 FactoryRegistry

Esse 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 classes 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 do logger

Esse componente está disponível para sua página por meio do método Logger (implementado pelo WizardPageImpl). Você usa 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 podem ter executando o Assistente de UDI.

Componente PropertyBag

O saco de propriedades é um contêiner para variáveis de memória. Ele está disponível em sua página usando Contêiner()->Propriedades(). 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 que você leia e escreva variáveis de sequência de tarefas. Ele mantém os valores na memória até que o usuário clique em Concluir (por padrão). Você pode acessar o saco 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 resultados por meio da interface IWmiIterator .

Classes auxiliares de página do assistente

Você pode criar páginas de assistente UDI personalizadas 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
Classe ClassFactoryImpl Essa é uma classe base útil para criar uma fábrica de classes que você pode registrar no registro de fábrica.
Classe 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 a contagem de referência para o gerenciamento de tempo de vida em componentes COM. É importante liberar interfaces quando você terminar com elas. Essa classe de modelo manipula o tempo de vida automaticamente.
Classe PUnknown Essa classe é um ponteiro inteligente especificamente 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 subinterface Essa classe base facilita a implementação de um componente que dá suporte a uma interface herdada 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 de assistente, como criação de componentes e log.
Classe de modelo WizardPageImpl Essa classe base deve ser usada como a classe base para todas as páginas de assistente personalizadas

Classe ClassFactoryImpl

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

A seguir está 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 está um trecho do arquivo LocationPage.cpp na página assistente de exemplo usada para definir o factory de classe para a página.

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

Classe 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 classes base que dá suporte ao IFieldCalback e às interfaces que o WizardPageImpl dá suporte (que por acaso é 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 a este método:

static inline std::wstring GetModuleFilename(HINSTANCE hModule)  

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

static inline std::wstring GetDirectoryName(LPCWSTR fullName)  

. . . ou apenas o caminho durante a remoção do 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ência para o gerenciamento de tempo de vida, é importante que você sempre libere interfaces quando terminar com elas. Microsoft fornece uma classe de modelo que manipula 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 retornará o endereço do ponteiro interno. Depois de recuperar um ponteiro como este, a instância do Ponteiro chama Release para você quando a variável sai do escopo. Microsoft recomenda que você use ponteiros inteligentes em vez de chamar AddRef e Liberar manualmente.

Além disso, a classe ponteiro inteligente Ponteiro 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 especificamente 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 cadeias de caracteres ao ignorar o caso (consulte Tabela 9).

Tabela 9. Classe auxiliar StringUtil

Retorna Descrição
0 Cadeias de caracteres correspondem, ignorando caso
<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 .NET Microsoft no sentido de que os parâmetros estão na forma de {0}. No entanto, eles 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)  

Estes são wrappers ao redor 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 subinterface

Essa classe base facilita a implementação de um componente que dá suporte a uma interface herdada de outra interface. Por exemplo, a interface ICheckBox herda do 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 manipula 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 de assistente, como criação de componentes e log.

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. Usar o WizardComponent significa que seu componente dá suporte à interface fornecida (ITask neste exemplo) e 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 acesso de componente aos serviços de assistente.

Classe de modelo WizardPageImpl

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

class LocationPage :public WizardPageImpl<IDD_LOCATION_PAGE>  

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

Interfaces da Página do Assistente

O Assistente de UDI usa interfaces para acessar os diferentes controles em sua página. Em 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 eles 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 logger 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; verificar logs para obter detalhes
HRESULT HasAccess(nome de usuário LPCTSTR, senha LPCTSTR, domínio LPCTSTR, LPCTSTR computerName, LPCTSTR accountDomain)

Esse método verifica se um conjunto de credenciais tem acesso de leitura/gravação ao objeto do 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. As tarefas são qualquer classe que dê suporte à interface ITask .

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

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

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

Tabela 12. HRESULT Init

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 Concluído 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 Finish , que é chamado sempre que uma tarefa termina em execução; a chamada para o método Concluído 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 Houve um problema ao iniciar o thread.
S_OK O thread foi iniciado.
BOOL Running()

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

Espera HRESULT(DWORD waitMilliseconds)

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

Terminação HRESULT(DWORD exitCode)

Esse método mata o thread que está em execução (consulte Tabela 14 e 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. HRESULT encerrar código de saída

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

Tabela 15. Códigos de término

Retorna Descrição
E_FAIL A chamada para encerrar falhou.
S_OK A solicitação para encerrar o thread 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 Tabela 16).

Tabela 16. Códigos de resultado

Parâmetro Descrição
pCode Ponteiro para um DWORD que será definido no retorno ou nullptr se você não precisar do valor retornado. Na saída, esse parâmetro será 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 Encerrar se você chamar esse método.
pHresult Ponteiro para um HRESULT que será definido no retorno ou nullptr se você não precisar do valor HRESULT .
HRESULT Close(void)

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

ICheckBox Interface

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

Defina o estado verificado da caixa de seleção. Quando o método é TRUE, a caixa de seleção é selecionada; quando o método é FALSE, a caixa de seleção é limpa.

BOOL IsButtonChecked()

Esse método relata o estado de verificação atual de uma caixa de 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 tiver uma fonte de dados que implemente a interface IBindableList . A caixa de lista inicializa o conteúdo com as legendas desta lista.

HRESULT Select(índice int)

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

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(habilitação BOOL)

Habilite ou desabilite o controle.

BOOL IsEnabled(void)

Retornará TRUE se o controle estiver habilitado, FALSE se não estiver.

HRESULT SetVisible(BOOL visível)

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 relata se a CPU tem 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 só está relatando a largura da CPU (não do 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 ID_Directory, fornece uma fachada para trabalhar com diretórios no sistema de arquivos.

BOOL FileExists(nome LPCWSTR)

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

NOME BOOL FindFirst([in] LPCWSTR)

Esse método encontra uma primeira correspondência para o nome que você fornece. 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, FALSE caso contrário.

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 do arquivo ou diretório encontrado mais recente. Você pode usar o código da seguinte maneira para testar se ele é um diretório:

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

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

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 de instância

Parâmetro Descrição
pLogger A instância do logger, que está disponível para sua página por meio do método Logger da página
pContainer Passa os resultados do método contêiner da sua página
pUsername 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 será ingressado no domínio
HRESULT IsUsernameValid(LPCWSTR domainName)

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

BOOL CanModifyComputerAdEntry(LPCWSTR domainName)

Verifique se o usuário tem direitos de modificar a entrada do computador. A maior parte do trabalho é feita por IADHelper-HasAccess>. Se esse método retornar FALSE, verifique 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 outros componentes. Você precisará criar um novo WmiRepository antes de chamar esse método.

HRESULT SetWhereClause(LPCTSTR whereClause)

Esse método permite adicionar texto que será exibido como uma cláusula "onde" na consulta. Por exemplo, a linha a seguir retorna apenas unidades USB:

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

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

HRESULT Update(void)

Execute a consulta. A lista de unidade 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 Atualização. 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 inteiro, começando com 0
DISKQUERY_LOGICALDISK VolumeName O rótulo de volume
size_t Count(void)

O número de registros que a consulta retorna. Chame Atualização antes de chamar esse método.

HRESULT GetProperty(índice size_t, propName LPCTSTR, valor LPVARIANT)

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 resultados
Propname Nome da propriedade, como "Size"
Valor No retorno, esse parâmetro contém um valor variante da propriedade
HRESULT GetCaption(índice size_t, pCaption LPBSTR)

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(largura int, altura int, sinalizadores UINT)

Crie uma nova lista de imagens, que esse componente gerencia. 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 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] Texto LPCTSTR)

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

int AddColumn(largura int, [in] Texto LPCTSTR)

Adicione uma nova coluna à exibição de lista.

HRESULT SetSubItem(índice int, coluna int, [in] texto LPCTSTR)

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 a seguir são definidas com este método
text A cadeia de caracteres a ser exibida 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 que você defina estilos estendidos na caixa de listagem, por exemplo:

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

Esse método retorna o índice do item de exibição de lista selecionado no momento.

HRESULT SelectItem(índice int)

Defina o item selecionado na lista como esse índice.

BOOL IsItemChecked(índice int)

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

int GetItemCount(void)

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

HRESULT CreateImageList(largura int, altura int, sinalizadores UINT)

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

int AddImage(HINSTANCE hInstance, int resourceId)

Adicione uma imagem à lista de imagens do modo de exibição de lista. Primeiro, você precisa chamar CreateImageList.

HRESULT SetImage(índice int, int imageIndex)

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

HRESULT Clear(void)

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(posição int)

Defina 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 rádio que devem ser tratados como um grupo. Chame esse método antes de chamar CheckRadio.

void CheckRadio(id int)

Defina o botão de rádio específico para ser o botão único no grupo de botões de rádio selecionados. Chame SetGroup antes de chamar esse método.

BOOL IsButtonChecked(id int)

Esse método retornará TRUE se o botão de rádio estiver selecionado no momento, FALSE caso contrário.

void EnableRadio(id int, habilitar BOOL)

Esse método habilita ou desabilita um botão de rádio.

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] PText LPCTSTR)

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 desejar que seu componente esteja disponível como uma tarefa na página de pré-vô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 pré-vôo, chame esse método para inicializar sua tarefa. O arquivo .config contém XML que pode ser semelhante a este:

<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 de setter, enquanto o parâmetro pTaskSettings fornece acesso ao elemento Task e às crianças. A maioria das tarefas só precisa ler dados do parâmetro pProperties .

Executar
HRESULT Execute(LPDWORD pReturnCode)  

Aqui é onde você grava o código que executa a tarefa. Esse método deve retornar S_OK se não houver erros e retornar outro HRESULT se ocorrer um erro durante a execução da tarefa. Valores diferentes de S_OK que esse método retorna são correspondidos a <elementos de erro> na <seção ExitCodes> se você estiver usando a página de pré-vôo.

O parâmetro pReturnCode deve ser atualizado com um número que relata o estado da tarefa. Esses valores são correspondidos pela página de pré-vôos 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 seleção no controle de exibição de árvore definindo o estilo TVS_CHECKBOXES .

HRESULT CreateImageList(largura int, altura int, sinalizadores UINT)

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(texto LPCTSTR, HTREEITEM hParent = NULL)

Adicione um nó à exibição da á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 em que você deseja que o novo item seja adicionado. Esse método retorna o identificador para o novo item.

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

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

void Clear(void)

Remova todos os itens da exibição da árvore.

BOOL SetFirstVisible(item HTREEITEM)

Verifique se o item de exibição de árvore está visível. A exibição da árvore será rolada se necessário para tornar este item visível.

BOOL SelectItem(item HTREEITEM)

Defina o item selecionado no momento 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(item HTREEITEM, UINT checkState)

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

Tabela 22.void CheckItem Image List Default

Checkstate Descrição
0 Em branco
1 Limpo
2 Selecionado
HTREEITEM SelectedItem(void)

Esse método retorna o identificador do item de exibição de árvore selecionado no momento.

int SetItemHeight(ALTURA CURTA)

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(item HTREEITEM, habilitação BOOL)

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

void Expand(HTREEITEM hItem, BOOL expand)

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

HTREEITEM GetChild(HTREEITEM hParent)

Esse método retorna o primeiro filho de um item 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 em 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ó de exibição de árvore não estiver selecionado e 1 se for.

BOOL IsEnabled(item HTREEITEM)

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

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

Esse método é somente para uso interno.

HRESULT SetEventHandler(ITreeViewEvent *pEventHandler)

Chame esse método se quiser receber a notificação quando o item selecionado for alterado ou o usuário alterar o estado de verificação de um item 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 de segundo plano usada para o item selecionado.

IWmiIteration Interface

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

Normalmente, você usa essa interface, juntamente com o IWmiRepository, ao trabalhar com chamadas WMI. A interface IWmiIteration permite iterar por meio dos valores que uma consulta retorna.

HRESULT Next(void)

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

Tabela 23. HRESULT Next(void) Query Returns

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(propriedade LPCTSTRName, [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 no retorno contém o valor da propriedade

Tabela 25. Resultado do 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 que não sejam aqueles listados na Tabela 25. Os valores listados são os resultados comuns que são 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(NamespaceName LPCWSTR)

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á raiz\cimv2. Esse método sempre retorna S_OK.

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

Execute uma consulta no conjunto de namespace WMI 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 para a consulta WMI que você deseja executar
ppIterator Passe um ponteiro para um ponteiro de interface, que no retorno será preenchido com uma interface, dando acesso aos resultados da consulta

Tabela 27. Resultado da consulta HRESULT

HRESULT Descrição
S_OK Consulta bem-sucedida
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 da UDI tem seu próprio controlador de formulário que implementa essa interface. Você usa 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 manipula muitos dos detalhes para você.

Configurando o Formulário

Geralmente, 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 sua página que é uma ID
AddRadioGroup Usado para conectar um botão de rádio a um grupo e um controle na caixa de diálogo
AddToGroup Permite controles "filho" habilitados ou desabilitados junto com o pai ou com base no botão de rádio selecionado
InitFields Chame depois de chamar todos os métodos Add para configurar o formulário
Validate Executa a validação inicial
Eventos de Formulário de Processamento

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 ao formulário.

Salvar dados de formulário

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

Tabela 29. Método OnNextClicked

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

Normalmente, você chama esse método perto do 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 passar, o controlador de formulário exibirá uma mensagem de aviso e desabilitará o botão Avançar e, em seguida, interromperá o processamento de 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 seleção ou botão de rádio, 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 seleção ou botão de rádio que controlará o estado de habilitação do controle filho
Controlado A ID do controle que você deseja adicionar quando criança
UpdateCheckGroup
HRESULT UpdateCheckGroup(int groupControlId)  

Esse método atualiza o status habilitar ou desabilitar os 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 chama isso 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 de habilitação/desabilitar para controles que não estão cobertos com validação de formulário e você precisa desabilitar a validação para um controle. Em outras palavras, normalmente você 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 para 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, pois o InitFields usa essas informações. Esse método sempre retorna S_OK.

Tabela 32. HRESULT AddField

Parâmetro Descrição
Fieldname Nome do campo como ele aparece no XML da sua página
Controlid A ID do controle no modelo da 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 rádio nomeado, conforme mostrado na Tabela 33. Você deve chamar isso 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 rádio no grupo. Grupos de rádio podem ser bloqueados, por exemplo, para que todos os botões de rádio sejam desabilitados, mas os controles filho estão habilitados ou desabilitados com base apenas no botão de rádio 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 rádio nesta página
radioControlId A ID de um único botão de rádio para adicionar a esse grupo
EnableRadioGroup
HRESULT EnableRadioGroup(LPCWSTR groupName, BOOL enable)  

Esse método permite habilitar ou desabilitar um grupo de botões de rádio inteiro. Desabilitar um grupo de rádio desabilita todos os controles de botão de rádio no grupo, bem como todos os filhos desses botões de rádio que foram adicionados ao AddToGroup. Consulte Tabela 34 e Tabela 35.

Tabela 34. EnableRadioGroup

Parâmetro Descrição
Groupname Nome de um grupo de botões de rádio que você definiu já com uma chamada para AddRadioGroup
Enable Defina como TRUE para habilitar o grupo de botões de rádio 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 rádio 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ê for for fornecido, o controlador de formulários 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 defina-o no controle por conta própria.

SaveFields
HRESULT SaveFields(IFieldCallback *pFieldCallback = nullptr)  

Esse método salva valores de campo para variáveis de sequência de tarefas e para os dados de resumo que serão mostrados na página Resumo . Fornecer um ponteiro no pFieldCallback permite que você lide com valores de economia 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 OnNextClicked 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 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 adicionar itens de resumo à página Resumo acima e além desses itens definidos com o XML. Consulte Tabela 37.

Tabela 37. HRESULT AddSummaryItem

Parâmetro Descrição
Primeira A legenda do 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 resumo. Normalmente, você não precisará chamar esse método por conta própria, pois o controlador de formulário faz isso para todos os campos. Consulte 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
summaryCaption A legenda na página Resumo desse valor
LoadText
HRESULT LoadText(int controlId, LPCWSTR tsVariableName)  

Este método lê o valor de uma variável de sequência de tarefas e define a caixa de texto como 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 retornará FALSE. Em outras palavras, ele retornará TRUE somente se todos os controles na 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 Tabela 39.

Tabela 39. HRESULT Init

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ários chama esse método para inicializar validadores que ele cria com base no XML da página. Consulte Tabela 40.

Tabela 40. Método HRESULT Init

Parâmetro Descrição
Pcontrol O controle que seu validador deve validar
pContainer Caso o validador precise de acesso ao logger ou precise criar outros componentes
pProperties Fornece acesso às propriedades (elementos setter) para 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 regular de expressão.

BOOL MatchesRegex(entrada LPCTSTR, regex LPCTSTR)

Esse método executa a expressão regular no 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, FALSE caso contrário.

HRESULT GetMatch(índice size_t, PValue LPBSTR)

Esse método permite que você recupere as correspondências da chamada MatchesRegex mais recente. Observe que não há processamento de erro neste método e que ele retorna S_OK ou gera 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 deve precisar 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 deve precisar 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)

Este 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 depois que você clica em Concluir no Assistente de 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 tenta recuperá-lo da sequência de tarefas.

HRESULT SuppressLogValue([in] LPCTSTR variableName)

Sempre que variáveis de sequência de tarefas são escritas, como quando você clica em Concluir no Assistente de UDI, os nomes e 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 por TSVariableBag para ler e escrever 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 clicar em Concluir ou Cancelar no Assistente de UDI. O Assistente de UDI contém uma tarefa Concluir que salva variáveis de sequência de tarefas quando você clica em Concluir. Se você cancelar o assistente, a tarefa só definirá a variável de sequência de tarefas OSDSetupWizCancelled como TRUE e não salvará 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, pCaption LPBSTR)

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 Configurações .

Os dados no XML de uma página podem ser semelhantes a este

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

Chamar Configurações()->GetDataNode(L"Network", &pData) fornece uma instância IDataNodes com dois itens de dados (cada um deles, por sua vez, tem duas propriedades).

contagem de size_t()

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 ao 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 associação de dados. A caixa de combinação conteria itens Public e Dev Team como itens.

HRESULT GetProperty(índice size_t, propriedade LPCTSTRName, [out] propriedade LPBSTRValue)

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

Tabela 41. DataItem GetProperty

Parâmetro Descrição
Índice O valor do í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 No retorno, contém o valor de cadeia de caracteres de uma propriedade

Tabela 42. HRESULT GetProperty

HRESULT Descrição
S_OK A propriedade foi recuperada.
E_INVALIDARG O índice já passou do final da matriz.
ÍNDICE HRESULT GetNode(size_t, [out] ISettingsProperties **ppNode)

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

Tabela 43. HRESULT GetNode

Parâmetro Descrição
Índice O valor do í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 envolve o nó DataItem

Tabela 44. Resultados de GetNode do HRESULT

HRESULT Descrição
S_OK O nó foi recuperado.
E_INVALIDARG O índice já passou do 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 o 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 classes com o registro. Consulte Tabela 45.

Tabela 45. Registro nulo IClassFactory

Parâmetro Descrição
Tipo Uma cadeia de caracteres que identifica a fábrica que você está registrando; geralmente, 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 classes
HRESULT LoadAndRegister(LPCTSTR dllName, ILogger *pLogger)

Esse método é somente para uso interno.

BOOL Contains(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 que você recupere a fábrica de classes. Normalmente, você chamaria CreateInstance. No entanto, se você vai criar um grande número do mesmo componente, é mais eficiente recuperar a fábrica e pedir que ela crie as instâncias para você.

HRESULT CreateInstance(tipo LPCTSTR, IUnknown **ppInstance)

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

HRESULT SetContainer(IWizardPageContainer *pContainer)

Esse método é somente para uso interno.

HRESULT RegisterService(REFGUID iid, IUnknown *pService)

Os serviços são instâncias individuais de um componente que pode ser usado em vários lugares. Você pode usar esse método para registrar um serviço em uma página e recuperar essa 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 de 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 /locale command-line para o Assistente de UDI. O método retorna um dos seguintes valores:

  • Valor do identificador de idioma fornecido com o parâmetro /locale command-line

  • 0, se você não forneceu o parâmetro /locale command-line

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 façam log de 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 "nível" que representa mensagens de erro, normais, verbosas ou 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 seja 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 é somente para uso interno.

MoveLog
HRESULT MoveLog(LPCWSTR logFilename)  

Esse método é somente para uso interno.

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

Esse método é somente para uso interno.

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

Esse método é somente para uso interno.

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

Chame esse método para registrar informações sobre um erro. Consulte 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
Error2
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á "mensagem" 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 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 parâmetros.

Detalhado
HRESULT Verbose(LPCTSTR component, LPCTSTR message)  

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

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

Esse método registra uma mensagem verbosa. Consulte a descrição do método Error2 para 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 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 é somente para uso interno.

Fechar
HRESULT Close(void)  

Esse método é somente 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 é somente 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 é somente 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 de página, use o método Configurações() da página.

HRESULT GetAttribute(atributo LPCTSTRName, atributo LPBSTRValue)

Esse método permite que você recupere os valores de atributos no nó principal, que é o nó Página quando você estiver usando o método Configurações() da página.

IStringProperties * Propriedades()

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

HRESULT SelectNodes(LPCTSTR xPath, IXMLDOMNodeList **ppList)

Chame esse método se você 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 conseguir acessar nós de outra maneira.

HRESULT SelectSingleNode(LPCTSTR xPath, IXMLDOMNode **ppNode)

Chame esse método se você 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 conseguir chegar a 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ó de dados 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 a verificação de erro:

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. Essa interface está disponível para as propriedades de uma página usando Configurações()->Propriedades().

HRESULT Get(propriedade LPCTSTRName, [out] LPBSTR pPropValue)

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

Tabela 47. IHRESULT Obter Valor da Propriedade

Parâmetro Descrição
propertyName Nome da propriedade que você deseja ler
pPropValue Na saída, contém o valor da propriedade como uma cadeia de caracteres (esse valor será nullptr se não houver essa propriedade.)

Tabela 48. IHRESULT obter resultados do valor da propriedade

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

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 pré-vôo. Você pode usar a página de pré-vôo diretamente, que é o que você faz na maior parte do tempo, ou criar sua própria página, permitindo que esse componente faça 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 Tabela 49.

Tabela 49. HRESULT Init

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 clicar para executar as tarefas novamente
pPageInfo Um wrapper em torno do XML da página (TaskManager carrega o conjunto de tarefas a serem executadas a partir deste XML.)
Pcallback Pode ser nulo (se esse parâmetro não for nulo, TaskManager chamará o método Started quando iniciar uma tarefa e o método Concluído para cada tarefa que terminar de executar.)
HRESULT SetFailMessage(mensagem LPCWSTR)

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

Início do HRESULT(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 é somente 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 para uma tarefa. A Tabela 50 mostra os tipos disponíveis.

Tabela 50. HRESULT GetResultType

Tipo Descrição
0 Representa uma tarefa que foi bem-sucedida
1 Representa uma tarefa que retornou um aviso
-1 Representa uma tarefa com falha

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

HRESULT GetProperty(índice size_t, propriedade LPCTSTRName, valor LPBSTR)

Esse método é usado pelas páginas de progresso e pré-vôo para recuperar a propriedade setter BitmapFilename para que ele possa exibir uma imagem ao lado da mensagem para a tarefa que você realça. Em outras palavras, você pode adicionar um setter personalizado ao XML da tarefa e 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ê quiser recuperar informações adicionais sobre a tarefa (consulte Método GetProperty ) a ser exibida para a tarefa selecionada. As páginas de progresso e pré-vôo usam esse método para exibir uma imagem para a tarefa selecionada.

Espera HRESULT(DWORD waitMilliseconds)

Esse método ajuda principalmente com testes de unidade para que o teste possa garantir que as tarefas sejam concluídas antes da saída do teste de unidade. Normalmente, você não chamaria esse método. Ele retorna quando todas as tarefas terminam de ser executadas ou o tempo de espera passa.

size_t FailedCount(void)

Esse método retorna o número de tarefas marcadas como falha no momento.

size_t WarningCount(void)

Esse método retorna o número de tarefas marcadas atualmente 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 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 eventos necessários.

void EnableButtons(habilitação BOOL)

Esse método é somente para uso interno.

IWizardComponent Interface

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

Normalmente, você não implementará essa interface diretamente, mas sim por meio da classe de modelo WizardComponent . Se o componente implementar essa interface e você tiver registrado uma fábrica de classes com o registro, seu componente receberá um ponteiro para a instância IWizardPageContainer quando ela é criada. 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 é somente 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 é somente 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 NextClicked(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 pelo WizardPageImpl, portanto, normalmente, você 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 pelo WizardPageImpl) e oferece acesso a vários serviços do assistente.

ILogger * Logger(void)

Use esse 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 de 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, pois ela é fortemente tipada.

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

Esse método permite que você recupere 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(fonte LPCTSTR, [out] PDest LPBSTR)

Esse método manipula o trabalho com variáveis dentro de valores de cadeia de caracteres. Ele dá suporte aos 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 esse 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 estiver presente.
2. Use o valor de uma variável de ambiente, se estiver presente.
3. Caso contrário, remova esse texto da cadeia de caracteres.

Tabela 52. Parâmetro HRESULT

Parâmetro Descrição
Fonte A cadeia de caracteres de entrada, que pode conter qualquer combinação de $ variáveis ou % nenhuma
pDest No 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 OnNextClicked em sua página. Além disso, o comportamento desse método está sujeito a alterações, portanto, use-o por sua conta e risco.

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

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

BOOL InPreview(void)

Esse método retornará TRUE se você iniciou o assistente no modo "versão prévia" fornecendo o comutador /preview . No modo de visualização, o botão Avançar nunca é desabilitado. Esse método permite ignorar o código no modo de visualização, por exemplo, que 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 do aplicativo assistente UDI é projetada para que você nunca trabalhe diretamente com identificadores 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 pelo 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 facilita muito a gravação de testes para sua página, pois 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 para sua página. Geralmente, você não deve precisar de acesso a esse identificador de janela.

HWND GetControl(int itemId)

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

HRESULT Show (void)

Esse método é somente para uso interno.

HRESULT Hide(void)

Esse método é somente para uso interno.

HRESULT Focus(int itemId)

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

IWizardPage * Page(void)

Esse método é somente para uso interno.

IFormController * Formulário(void)

Esse método é somente para uso interno.

HRESULT FocusWizardButton(botão WizardButtons)

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

HRESULT SetEnable(botão WizardButtons, habilitar BOOL)

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

void ShowWarningMessage(mensagem LPCTSTR)

Esse método exibe uma mensagem de aviso na parte inferior da área de conteúdo da página. Essa mensagem pode ser qualquer texto desejado.

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 no C++.

HRESULT Load(nome de arquivo LPCTSTR)

Esse método carrega um documento XML de um arquivo externo. Ele retornará S_OK se o arquivo foi carregado sem erros ou S_FALSE se ocorreu um erro. Quando houver um erro, você pode obter 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 origem para ler o XML, o comportamento é o mesmo que o método Load .

HRESULT Save(nome de 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 carregar o documento XML, se houver. Ele sempre retorna S_OK.

HRESULT SelectNodes(LPCTSTR xpath, IXMLDOMNodeList **ppNodes)

Esse método permite que você use 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 de 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 fornecido é 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 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 esse 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 uma criança a outro nó chamando o método appendChild do pai.

Funções auxiliares

Função CreateInstance Template

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

Essa função é definida no IWizardPageContainer.h e fornece um wrapper com segurança de tipo 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 no IWizardPageContainer.h e fornece um wrapper com segurança de tipo 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 , em vez disso.)

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

Esse arquivo é consumido pelo Designer de Assistentes da UDI. 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 (em que installation_folder é a pasta na qual você instalou o MDT).

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

Tabela 54. Elementos no arquivo de configuração do designer de assistente da 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 de página
Page Especifica um editor de página do assistente a ser carregado no Designer de Assistentes da UDI, que é usado para editar as configurações 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 Assistente da UDI Observação: os atributos para esse elemento são diferentes se o pai for o elemento Task ou Validator .
Tarefa Especifica uma tarefa na biblioteca de tarefas
Item de tarefa Especifica um grupo de parâmetros que são passados para a tarefa
TaskLibrary Agrupa um conjunto de elementos de tarefa
Validador Especifica um validador dentro da biblioteca de validadores
ValidatorLibrary Agrupa um conjunto de elementos validadores

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: esse elemento é necessário.
Elementos pai Nenhum
Conteúdos DesignerMappings, TaskLibrary, ValidatorLibrary
Atributos de 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 este arquivo de configuração do Designer de Assistentes da UDI.)
Elementos pai DesignerConfig
Conteúdos Page
Atributos de 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 do assistente a ser carregado no Designer de Assistentes da UDI, que por sua vez é usado para editar as configurações de uma página do assistente.

Informações sobre o elemento

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

Tabela 57. Informações do elemento page

Atributo Valor
Número de ocorrências Uma ou mais páginas de assistente definidas no elemento DesignerMappings
Elementos pai DesignerMappings
Conteúdos Qualquer conteúdo XML bem formado
Atributos de 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 page

Atributo Descrição
Descrição Especifica texto que fornece informações sobre o parâmetro, que é exibido no Designer de Assistentes da UDI
DesignerAssembly Especifica o nome do arquivo .dll associado ao editor de páginas do assistente (o arquivo .dll deve existir na pasta installation_folder\Bin (em que 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 (este é o tipo .NET Microsoft para o editor de páginas do assistente, com o namespace do .NET Microsoft totalmente qualificado).)
DisplayName Especifica o nome amigável do editor de página, que é exibido no Designer de Assistentes da UDI
Dll Especifica o nome do arquivo .dll associado à página 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.) Nota: 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 assistente.
Imagem Especifica o nome de uma imagem da página que está no formato PNG (Portable Network Graphics) (O arquivo .png deve existir na pasta installation_folder\Bin\Images (em que installation_folder é a pasta na qual você instalou o MDT.)
Tipo Especifica o editor de página do assistente e deve corresponder ao nomeado usado quando a página personalizada foi registrada
Comentários

O Designer de Assistentes da UDI usa o elemento Page como um modelo para criar o XML inicial para um novo assistente. O Designer de Assistentes da UDI 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 assistente da UDI e as informações que o Designer de Assistentes da UDI precisa para editar e criar páginas desse tipo usando um editor de página personalizado.

Exemplo

Nenhuma.

Param

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 Assistente UDI.

Observação

Os atributos para esse 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 Param

Atributo Valor
Número de ocorrências Um ou mais para cada elemento pai TaskItem ou Validador
Elementos pai TaskItem, Validador
Conteúdos Qualquer conteúdo XML bem formado
Atributos de 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 Param

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

Nenhuma.

Exemplo

Nenhuma.

Tarefa

Esse elemento especifica uma tarefa na biblioteca de tarefas.

Informações sobre o elemento

A Tabela 61 fornece informações sobre o elemento Task .

Tabela 61. Informações do elemento de 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 TaskLibrary
Conteúdos Item de tarefa
Atributos de 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 texto que fornece informações sobre a tarefa, que é exibida no Designer de Assistentes da UDI
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 é exibida na página assistente UDI apropriada e no Designer de Assistentes da UDI
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 de 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 da UDI. Um elemento XML será criado que corresponde ao valor desse atributo. Por exemplo, se o valor desse atributo for Arquivo, um elemento File será criado no arquivo de configuração do Assistente da UDI.

Atualmente, os únicos valores com suporte são:

- Arquivo, que requer dois elementos filho param (um elemento filho param com o atributo Name definido como Origem e outro elemento filho param com o atributo Name definido como Dest)
- Setter, que requer um elemento filho param
Comentários

Nenhuma.

Exemplo

Nenhuma.

TaskLibrary

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 este arquivo de configuração do Designer de Assistentes da UDI.)
Elementos pai DesignerConfig
Conteúdos Tarefa
Atributos de 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 na biblioteca do validador.

Informações sobre o elemento

A Tabela 66 fornece informações sobre o elemento Validador .

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

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

Tabela 67. Atributos e valores correspondentes para o elemento Validador

Atributo Descrição
Descrição Especifica texto que fornece informações sobre o validador, que é exibido no Designer de Assistentes da UDI
DisplayName Especifica o nome amigável do validador exibido no Designer de Assistentes da UDI (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 assistente UDI apropriada e no Designer de Assistentes da UDI
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 Validador .

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 este arquivo de configuração do Designer de Assistentes da UDI.)
Elementos pai DesignerConfig
Conteúdos Validador
Atributos de 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 determinados 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 de assistente da UDI

Controles

Os controles usados para criar editores de página de assistente personalizados para uso no Designer de Assistentes da UDI são instâncias WPF UserControl . 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

Controle 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 está 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 Dados 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 está vinculado a um controle TextBox na página .xaml.

Exemplo

O seguinte trecho de um arquivo .xaml ilustra o uso do FieldElementControl para configurar o valor padrão de um campo em uma página do 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
FieldData

Essa propriedade de cadeia de caracteres contém informações para conectar o FieldElementControl ao XML subjacente para o campo. A conexão é feita com uma propriedade da interface do editor de página. 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 na propriedade DataContext.Location da interface do editor de página ControlRoot . DataContext é um modelo de exibição que aponta para o elemento Page dentro do arquivo de configuração do Assistente de UDI. O local é uma propriedade da exibição que retorna uma lista dos possíveis locais e é definida por um elemento Data dentro do arquivo de configuração do Assistente de UDI. Cada local é definido por um elemento DataItem no arquivo de configuração do Assistente da 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 em negrito e laranja exibido imediatamente acima do controle.

Instructiontext

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 configurar o campo afeta a página de assistente correspondente.

HideEnableButton

Essa propriedade booliana permite controlar a visibilidade do botão que altera o estado entre Desbloqueado e Bloqueado (habilitado ou desabilitado). Se definido como:

  • True, o botão não está visível

  • False, o botão está visível (este é o valor padrão.)

HideDefaultTab

Essa propriedade booliana 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á nenhuma guia no FieldElementControl , mas sim uma seção que possa ser ocultada. Se definido como:

  • True, a seção não está visível

  • False, a seção é visível (este é o valor padrão.)

HideBorder

Essa propriedade booliana permite controlar a visibilidade da borda ao redor do controle de campo. Se definido como:

  • True, a borda não está visível

  • False, a borda está visível (este é o valor padrão.)

HideImage

Essa propriedade booliana permite controlar a visibilidade da imagem configurada pela propriedade FieldImageSource . Se definido como:

  • True, a imagem não está visível

  • False, a imagem está visível (este é o valor padrão.)

HideValidationTab

Essa propriedade booliana 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á nenhuma guia no FieldElementControl , mas sim uma seção que possa ser ocultada. Se definido como:

  • True, a seção não está visível

  • False, a seção é visível (este é o valor padrão.)

HideSummaryTab

Essa propriedade booliana permite controlar a visibilidade da seção na qual você configura a legenda de 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á nenhuma guia no FieldElementControl , mas sim uma seção que possa ser ocultada. Se definido como:

  • True, a seção não está visível

  • False, a seção é visível (este é o valor padrão.)

HideTaskSequenceTab

Essa propriedade booliana 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á nenhuma guia no FieldElementControl , mas sim uma seção que possa ser ocultada. Se definido como:

  • True, a seção não está visível

  • False, a seção é 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 associar isso a uma propriedade do seu modo de exibição ou modelo de exibição que se conecta ao setter. Fazer isso é semelhante à forma como você se associaria a um campo, conforme descrito para o FieldElementControl.

HeaderText

Essa propriedade permite definir o texto que será exibido no cabeçalho do controle. Pense nessa propriedade como um título para o controle; por padrão, ele aparece como texto em negrito e laranja.

Instructiontext

Defina essa propriedade como o texto que você deseja aparecer abaixo do cabeçalho — normalmente, texto de instrução que informa ao usuário do seu 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 Data no arquivo de configuração do Assistente de UDI.
IMessageBoxService Essa interface fornece acesso aos métodos que você pode usar para exibir caixas de mensagens.

IDataService

Essa interface contém várias propriedades e métodos, mas há apenas uma propriedade que você gosta 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 para a 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 de UDI
CurrentPage
XElement CurrentPage { get; set; }  

Essa propriedade fornece acesso ao XML para a página atual. Você nunca deve definir essa propriedade, mas é livre para modificar o XML para 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 aos métodos que você pode usar para exibir caixas de mensagens. Talvez você esteja se perguntando por que precisa de uma interface para exibir uma caixa de mensagens. A realidade é que você não usa: Microsoft usa essa interface no código, pois ajuda na gravação de testes automatizados para páginas de designer.

No entanto, o uso desses métodos fornece um benefício útil: as caixas de diálogo sempre têm o "proprietário" definido como assistente de 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 mensagens 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 caixa de diálogo.
ShowWizardWindow Use esse método para exibir um editor personalizado dentro de uma caixa de diálogo que inclui botões Avançar e Voltar para navegação.
Showmessagebox

Esse método exibe uma caixa de mensagens que é filho do editor de páginas do assistente personalizado. Esse 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 mensagens 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 mensagens 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);  

Este método exibe uma caixa de mensagem com um botão OK . Consulte Tabela 74.

Tabela 74. Parâmetros para o método ShowMessageBox(Mensagem de cadeia de caracteres, legenda de cadeia de caracteres, ícone MessageBoxImage)

Parâmetro Descrição
message A mensagem a ser exibida na área de conteúdo da caixa de mensagens
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 mensagens
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 mensagens com o conjunto de botões que você deseja mostrar e relata qual botão você clicou. Consulte 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 mensagens
caption O texto a ser exibido na barra de título da caixa de diálogo
botão Quais botões mostrar
icon O tipo de ícone a ser exibido na caixa de mensagens
ShowMessageBox(exceção de exceção)
void ShowMessageBox(Exception exception);  

Esse método exibe uma caixa de mensagens que relata informações sobre uma exceção. Esta caixa de mensagem tem um único botão OK . Consulte 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 como 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 que você fornece no parâmetro viewType . O Designer de UDI cria uma nova instância desse tipo e a encapsula em uma caixa de diálogo que tem botões OK e Cancel .

Você passa dados para o controle usando o parâmetro dialogPayload. A solução SampleEditor no diretório SDK tem um exemplo de como usar essa funcionalidade.

ShowWizardWindow
void ShowWizardWindow(Type viewType, DialogInteraction dialogPayload);  

Esse método permite exibir um editor personalizado dentro de uma caixa de diálogo que inclui botões Avançar e Voltar para navegação. Microsoft não forneceu um exemplo de como usar esse método.

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

Esse arquivo é consumido pelo Assistente de UDI e configurado pelo Designer de Assistentes da UDI. Este arquivo é usado para configurar o:

  • Páginas do assistente exibidas no Assistente de UDI

  • A sequência das páginas do assistente no Assistente de UDI

  • Configurações para os campos em cada página do assistente

  • StageGroups disponíveis no Designer de Assistentes da UDI

  • Estágios disponíveis em cada assistente de implantação no Designer de Assistentes da UDI

    77 lista os elementos no Arquivo de Configuração do Assistente da UDI e suas descrições. O elemento Assistente é 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 .
Dataitem 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 de unidade correspondente.
Padrão Especifica um valor padrão para o campo especificado no elemento Campo pai ou RadioGroup . 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 Designer de Assistentes da UDI.
Dlls Agrupa os elementos de DLL individuais.
Erro Especifica um possível código de erro que pode retornar uma tarefa. O valor do código de erro é retornado pelo HRESULT da tarefa e é preso por esse elemento para fornecer informações de erro mais específicas.
Exitcode Especifica um possível código de saída para uma tarefa. Os códigos de saída são códigos de retorno esperados pela tarefa. Crie um elemento ExitCode para cada código de saída possível. Caso contrário, você pode especificar um asterisco (*) no atributo Valor para lidar com códigos de retorno não listados em outros elementos do ExitCode .
Exitcodes Agrupa um conjunto de elementos ExitCode e Error para um elemento Task ou um elemento Error .
Campo Especifica uma instância de um controle em um elemento Page que é usado para fornecer personalização com XML. Nem todos os controles permitem a personalização com XML , apenas controles que usam o elemento Field .
Fields Agrupa os elementos de Campo individuais em um elemento Page .
Arquivo Especifica a origem e o destino de uma operação de cópia de arquivo usando o Microsoft. Tipo de tarefa 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 configurações da página.
PageRef Especifica uma referência a uma instância de uma página dentro de um Estágio dentro de um StageGroup.
Pages Agrupa os elementos de página individuais.
RadioGroup Especifica um grupo de botões de rádio dentro de um elemento Field .
StageGroup Especifica um grupo de um ou mais estágios.
StageGroups Agrupa um conjunto de grupos de estágio em um arquivo de configuração do Assistente de UDI.
Setter Especifica uma configuração de propriedade de um valor para uma propriedade nomeada na propriedade Property .
Etapa Especifica um estágio dentro de um StageGroup e contém um ou mais elementos PageRef .
Estilo Agrupa os elementos de setter individuais que configuram a aparência e a aparência do Assistente de UDI, incluindo o título mostrado na parte superior do assistente e a imagem de faixa mostrada no Assistente de UDI.
Tarefa Especifica uma tarefa que deve ser executada na página especificada no elemento Página pai.
Tarefas Agrupa um conjunto de tarefas para um elemento Page .
Validador Especifica um validador para o controle de campo especificado no elemento Campo pai.
Assistente Especifica a raiz para todos os outros elementos.

Dados

Esse elemento agrupa os elementos DataItem individuais dentro de 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 sobre elementos de dados

Atributo Valor
Número de ocorrências Zero ou mais em cada elemento Page (esse elemento é opcional.)
Elementos pai Página, DataItem
Conteúdos DataItem, Setter
Atributos de elemento

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

Tabela 79. Atributos e valores correspondentes para o elemento Data

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.

Dataitem

Esse 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 de 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 Data (esse elemento é opcional.)
Elementos pai Dados
Conteúdos Data, Setter
Atributos de 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 Campo pai ou RadioGroup . O padrão é definido como o valor que esse elemento colchetes.

Informações sobre o elemento

A Tabela 81 fornece informações sobre o elemento Padrão .

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 Field, RadioGroup
Conteúdos Pode ser qualquer conteúdo XML bem formado, mas normalmente é um texto padrão
Atributos de elemento

Esse elemento não tem atributos.

Comentários

Nenhuma.

Exemplo

No exemplo a seguir, o padrão para o campo TimeZone é definido como "Hora Padrão do Pacífico":

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

Dll

Esse elemento especifica uma DLL para o Assistente de UDI e o Designer de Assistentes da UDI para carregar e fazer referência.

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 Um ou mais dentro do elemento DLLs
Elemento pai Dlls
Conteúdos Nenhum conteúdo permitido para esse elemento
Atributos de 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 para referência do Assistente de UDI e do Designer de Assistentes da UDI
Comentários

Nenhuma.

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

Dlls

Esse elemento agrupa os elementos de DLL individuais.

Informações sobre o elemento

A Tabela 84 fornece informações sobre o elemento DLLs .

Tabela 84. Informações do elemento DLLs

Atributo Valor
Número de ocorrências Um
Elementos pai Assistente
Conteúdos Dll
Atributos de elemento

Esse elemento não tem atributos.

Comentários

Nenhuma.

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

Error

Esse elemento especifica um possível código de erro que uma tarefa pode retornar. O valor do código de erro é retornado e preso 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 Erro .

Tabela 85. Informações do elemento error

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

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

Tabela 86. Informações do elemento error

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 assistente no Assistente da UDI.
Texto Especifica o texto descritivo sobre a condição de erro encontrada pela tarefa.
Tipo Especifica se esse elemento representa um erro, aviso ou êxito. O valor especificado emTipo deve ser exclusivo dentro de um elemento ExitCodes . Veja a seguir valores válidos para este 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 retornados que não estão listados em outros elementos de erro .
Comentários

Nenhuma.

Exemplo

Nenhuma.

Exitcode

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 esperados pela tarefa. Crie um elemento ExitCode para cada código de saída possível. Caso contrário, você pode especificar um asterisco (*) no atributo Valor para lidar com códigos de retorno não listados em outros elementos do 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 em cada elemento ExitCodes (esse elemento é opcional.)
Elementos pai Exitcodes
Conteúdos Pelo menos um elemento ExitCode e zero ou mais elementos de erro
Atributos de 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 assistente correspondente no Assistente da UDI. Você pode usar todos os valores para esse atributo que sejam significativos para sua tarefa. Veja a seguir valores típicos usados para este atributo:

-Sucesso
-Aviso
-Erro
Texto Especifica o texto descritivo sobre o código existente da tarefa.
Tipo Especifica se esse elemento representa um erro, aviso ou êxito. O valor especificado no tipo deve ser exclusivo dentro de um elemento ExitCodes . Veja a seguir valores válidos para este 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 retornados que não estão listados em outros elementos do ExitCode .
Comentários

Nenhuma.

Exemplo

Nenhuma.

Exitcodes

Esse elemento agrupa um conjunto de elementos ExitCode e Error para uma Tarefa ou um elemento 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 Erro, ExitCode
Atributos de 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 a 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 field

Atributo Valor
Número de ocorrências Zero ou mais em cada elemento Field (esse elemento é opcional.)
Elementos pai Fields
Conteúdos Padrão, Validador
Atributos de 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 field

Atributo Descrição
Enabled Especifica se o campo está habilitado para entrada do usuário (o atributo pode ser definido como True ou False.)
Nome Especifica o nome do campo
Resumo Especifica o texto descritivo exibido na página Assistente de Resumo para o valor que este campo define
Varname Especifica o nome da variável de sequência de tarefas lido ou configurado usando o campo no elemento Campo pai
Comentários

Esse elemento pode conter zero ou mais elementos Padrão e zero ou mais elementos validadores .

Exemplo

Nenhuma.

Campos

Esse elemento agrupa os elementos de Campo individuais dentro de um elemento Page .

Informações sobre o elemento

A Tabela 92 fornece informações sobre o elemento Fields .

Tabela 92. Informações do elemento Fields

Atributo Valor
Número de ocorrências Zero ou mais em cada elemento Page (esse elemento é opcional.)
Elementos pai Page
Conteúdos Field, RadioGroup
Atributos de 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 Microsoft. Tipo de tarefa 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 Arquivo .

Tabela 93. Informações do elemento file

Atributo Valor
Número de ocorrências Uma ou mais para cada tarefa que tem um tipo de tarefa de Microsoft. Wizard.CopyFilesTask
Elementos pai Tarefa
Conteúdos Nenhum
Atributos de 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 file

Atributo Descrição
Dest Especifica o caminho totalmente qualificado ou relativo para a pasta de destino do arquivo especificado no atributo 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 Microsoft. Cópias do tipo de tarefa Wizard.CopyFilesTask. 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 configurações da página.

Informações sobre o elemento

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

Tabela 95. Informações do elemento page

Atributo Valor
Número de ocorrências Um ou mais em cada elemento Pages
Elementos pai Pages
Conteúdos Dados, Campos, Setter, Tarefas
Atributos de 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 page

Atributo Descrição
DisplayName Especifica o nome amigável do assistente exibido no Designer de Assistentes da UDI. Esse nome geralmente é mais descritivo do que o atributo Name .
Nome Especifica o nome da página de assistente exibida no Designer de Assistentes da UDI.
Tipo Especifica o tipo de página do assistente que se relaciona diretamente com uma página de assistente específica em uma DLL.
Comentários

Nenhuma.

Exemplo

Nenhuma.

PageRef

Esse elemento especifica uma referência a uma instância de uma página dentro de um Estágio 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 Stage
Elementos pai Etapa
Conteúdos Nenhum
Atributos de 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 dentro de um Estágio em 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 de página individuais.

Informações sobre o elemento

A Tabela 99 fornece informações sobre o elemento Pages .

Tabela 99. Informações do elemento Pages

Atributo Valor
Número de ocorrências Um
Elementos pai Assistente
Conteúdos Page
Atributos de 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 rádio 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 de 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 rádio está habilitado para entrada do usuário. O atributo pode ser definido como:

- É verdade. Especifica que os botões de rádio estão desabilitados e os usuários não podem selecionar um botão de rádio no grupo.
- False. Especifica que os botões de rádio estão habilitados e os usuários podem selecionar um botão de rádio no grupo.
Nome Especifica o nome do grupo de opções de rádio.
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 StageGroups
Conteúdos Etapa
Atributos de 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ágio exibido no Designer de Assistentes da UDI. Esse nome geralmente é mais descritivo do que o atributo Name .
Comentários

Nenhuma.

Exemplo

Nenhuma.

StageGroups

Esse elemento agrupa um conjunto de grupos de estágio em um arquivo de configuração do Assistente de UDI.

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 Wizard
Elementos pai Assistente
Conteúdos StageGroup
Atributos de 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 Dados, DataItem, Página, Estilo, Tarefa, Validador
Conteúdos Contém um valor de cadeia de caracteres no atributo Propriedade
Atributos de 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 definido. O nome da propriedade é definido como o valor que esse atributo colchetes.
Comentários

Nenhuma.

Exemplo

Nenhuma.

Etapa

Esse elemento especifica um Estágio 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 de 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 stage

Atributo Descrição
DisplayName Especifica o nome amigável do assistente exibido no Designer de Assistentes da UDI. Esse nome geralmente é mais descritivo do que o atributo Name .
Nome Especifica o nome do estágio. O valor desse elemento é usado ao iniciar o Assistente de UDI com o parâmetro /stage: linha de comando de nome .
Comentários

Nenhuma.

Exemplo

Nenhuma.

Estilo

Esse elemento agrupa os elementos setter individuais que configuram a aparência e a aparência do Assistente de UDI, incluindo o título mostrado na parte superior do assistente e a imagem de faixa mostrada no Assistente de UDI.

Informações sobre o elemento

A Tabela 109 fornece informações sobre o elemento Style.

Tabela 109. Informações do elemento Style

Atributo Valor
Número de ocorrências Um
Elementos pai Assistente
Conteúdos Setter
Atributos de 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 de 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 de 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 depende de outra tarefa. O valor desse atributo é definido como o atributo Name de outro elemento Task . Nota: Esse atributo não pode ser configurado usando o Designer de Assistentes da UDI. No entanto, você pode adicionar manualmente esse atributo a um elemento Task modificando diretamente o arquivo .xml.
DisplayName Especifica o nome amigável do usuário da tarefa exibida no Designer de Assistentes da UDI. 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 é definida 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 Tarefas .

Tabela 112. Informações do elemento Tasks

Atributo Valor
Número de ocorrências Zero ou um em cada elemento Page (esse elemento é opcional.)
Elementos pai Page
Conteúdos Tarefa
Atributos de elemento

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

Tabela 113. Atributos e valores correspondentes para o elemento Tasks

Atributo Descrição
NameTitle Especifica a legenda que aparece na parte superior da coluna que contém o nome das tarefas na página assistente apropriada.
StatusTitle Especifica a legenda que aparece na parte superior da coluna que contém o status das tarefas na página assistente apropriada.
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 Validador .

Tabela 114. Informações do elemento validador

Atributo Valor
Número de ocorrências Zero ou um dentro de um elemento Field
Elementos pai Campo
Conteúdos Setter
Atributos de elemento

A Tabela 115 lista o atributo do elemento Validador 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 Assistente .

Tabela 116. Informações do elemento Wizard

Atributo Valor
Número de ocorrências Um
Elementos pai Nenhum
Conteúdos DLLs, Páginas, Grupos de Estágios, Estilo
Atributos de elemento

Esse elemento não tem atributos.

Comentários

Nenhuma.

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