Compartilhar via


Instalação Orientada pelo Utilizador – Guia para Programadores

A Instalação Orientada pelo Utilizador (UDI) ajuda a simplificar a implementação de sistemas operativos cliente Windows®, como Windows 8.1, em computadores que utilizam a funcionalidade de implementação do sistema operativo (OSD) no Microsoft® System Center 2012 R2 Configuration Manager. A UDI faz parte do Microsoft Deployment Toolkit (MDT).

Introdução

Normalmente, ao implementar sistemas operativos com a funcionalidade OSD, tem de fornecer todas as informações necessárias para implementar o sistema operativo. As informações são configuradas em ficheiros de configuração ou em bases de dados (como o ficheiro de CustomSettings.ini ou a base de dados MDT [MDT DB]). Tem de fornecer todas as definições de configuração antes de poder iniciar a implementação.

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

Público-alvo

Este guia é escrito para os programadores que criam páginas de assistente personalizadas para o Assistente de UDI e editores de páginas do assistente personalizado para o Assistente de UDI Designer. Este guia pressupõe que está familiarizado com o desenvolvimento de aplicações windows com:

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

  • Microsoft .NET Framework, que é utilizado para criar editores de páginas de assistente personalizados

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

  • Idiomas suportados pelo WPF, como C#, C++, ou Microsoft Visual Basic® .NET, que são utilizados para criar editores de páginas de assistente personalizados

Acerca deste Guia

Este guia fornece as informações de referência necessárias para o ajudar a personalizar o UTI para a sua organização. Este guia não aborda tópicos administrativos ou operacionais, como instalar o MDT (que inclui a UDI), configurar a UDI para implementar sistemas operativos e aplicações ou efetuar implementações com o Assistente de UDI. Para obter mais informações sobre esses tópicos, veja os tópicos da UDI em Utilizar o Microsoft Deployment Toolkit, que está incluído no MDT.

Descrição Geral do Desenvolvimento da UDI

O desenvolvimento da UDI permite-lhe expandir as funcionalidades fornecidas pela UDI. Normalmente, o desenvolvimento da UDI é necessário quando pretende recolher informações adicionais que o processo de implementação da UDI consome. Normalmente, estas informações adicionais são guardadas como variáveis de sequência de tarefas que a sequência de tarefas efetua numa sequência de tarefas UDI no Configuration Manager ler.

Arquitetura da UDI

O objetivo de alto nível do desenvolvimento da UDI é criar páginas personalizadas do assistente que podem ser apresentadas no Assistente de UDI. Ao criar páginas personalizadas do assistente, pode expandir as funcionalidades existentes da UDI para cumprir os requisitos técnicos e empresariais da sua organização. Uma página de assistente personalizada recolhe informações para além ou em vez das páginas do assistente que a UDI fornece.

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

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

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

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

  • Páginas personalizadas do assistente. As páginas do assistente são apresentadas no Assistente de UDI e recolhem as informações necessárias para concluir o processo de implementação. Pode criar páginas do assistente com C++ no Microsoft Visual Studio®. As páginas personalizadas do assistente são implementadas como DLLs que o Assistente de UDI lê. O kit de desenvolvimento de software UDI (SDK) inclui um exemplo de como criar páginas de assistente personalizadas.

  • Editores de páginas personalizados do assistente. Utilize editores de páginas do assistente para configurar o comportamento da página do assistente personalizado. Os editores de páginas do assistente personalizado são implementados como DLLs que o Assistente de UDI Designer lê. Pode criar editores de páginas do assistente com:

    • WPF versão 4.0

    • Microsoft Prism versão 4.0

    • Microsoft Unity Application Block (Unity) versão 2.1

      O MDT inclui todas as assemblagens necessárias para criar um editor de páginas do assistente personalizado para utilização no Assistente de UDI Designer. O SDK da UDI inclui um exemplo de como criar editores de páginas de assistente personalizados.

    Além disso, o Assistente de UDI Designer consome ficheiros de configuração do editor de páginas do assistente de suporte. Pode criar os ficheiros de configuração do editor de páginas do assistente como parte do processo para criar as páginas personalizadas do assistente e os editores de páginas do assistente personalizado. O Assistente de UDI Designer cria as informações XML necessárias no ficheiro de configuração do Assistente de UDI e no ficheiro de .app correspondente.

Preparar o Ambiente de Desenvolvimento da UDI

Antes de começar a criar as suas próprias páginas de assistente personalizadas e editores de páginas do assistente, execute os seguintes passos 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 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 os seguintes passos:

  1. Prepare os requisitos de hardware do ambiente de desenvolvimento UDI, conforme descrito em Preparar os Pré-requisitos de Hardware do Ambiente de Desenvolvimento da UDI.

  2. Prepare os requisitos de software do ambiente de Desenvolvimento da UDI, conforme descrito em Preparar os Pré-requisitos de Software do 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 UDI são os mesmos requisitos de hardware para a edição do Microsoft Visual Studio que está a utilizar. Para obter mais informações sobre estes requisitos, veja os requisitos de sistema para cada edição na Documentação do Visual Studio.

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

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

  • Recomenda-se qualquer sistema operativo Windows suportado pelo Visual Studio 2010 (Windows 7 ou Windows Server ® 2008 R2).)

    Precisará de um sistema operativo Windows que suporte a arquitetura do processador para a qual pretende desenvolver. Pode executar o desenvolvimento UDI de 32 bits e 64 bits com um sistema operativo de 64 bits. Só faz desenvolvimento de UDI de 32 bits em sistemas operativos de 32 bits. Por este motivo, deve utilizar um sistema operativo de 64 bits.

    Observação

    As versões IntelItanium (IA-64) do sistema operativo Windows não são suportadas para ambientes de desenvolvimento UDI.

    Para obter mais informações sobre os sistemas operativos suportados pelo Visual Studio 2010, consulte os requisitos de sistema para cada edição na Documentação do Visual Studio.

  • Microsoft .NET Framework versão 4.0 (necessária para o Visual Studio 2010)

  • Idioma C++ (o idioma utilizado na expansão das páginas do Assistente de UDI)

  • Outros idiomas suportados pelo WPF, como C#, Visual Basic .NET ou C++/Common Language Infrastructure, que são utilizados para expandir o Assistente de UDI Designer editores de páginas do assistente

    Observação

    O código fonte de exemplo do Assistente de Designer editores de páginas do assistente de UDI é escrito em C#. Instale a linguagem C# se quiser utilizar o código fonte de exemplo.

Configurar o Ambiente de Desenvolvimento da UDI

Depois de cumprir os pré-requisitos do ambiente de desenvolvimento da UDI, execute os seguintes passos para configurar o ambiente de desenvolvimento da UDI:

  1. Instale o Visual Studio 2010.

    Certifique-se de que instala o idioma C++ e qualquer outro idioma suportado pelo WPF.

    Observação

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

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

  2. Instale o MDT.

    Para obter mais informações sobre como instalar o MDT, consulte a secção "Installing or Upgrading to MDT" (Instalar ou Atualizar para o MDT) no documento MDT Using the Microsoft Deployment Toolkit (Utilizar o Microsoft Deployment Toolkit).

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

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

    Copia a pasta do SDK para outra localização porque o MDT está instalado na pasta Ficheiros do Programa, que não pode ser escrita sem permissões elevadas. Copiar a pasta do SDK para outra localização permite-lhe modificar os ficheiros na pasta do SDK sem precisar de permissões elevadas.

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

  6. Mude o nome da pasta local_folder\Tools para local_folder\OSDSetupWizard(onde local_folder é a pasta que criou anteriormente no processo).

    Quando concluída, a estrutura de pastas abaixo local_folder deve ter um aspeto semelhante à estrutura de pastas ilustrada na Figura 2 (em que local_folder é a pasta que criou anteriormente no processo e é apresentada como UDIDevelopment na figura).

    Figura 2. Estrutura de pastas para desenvolvimento 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 UDI estiver configurado, verifique se o ambiente de desenvolvimento da UDI está configurado corretamente ao garantir que os projetos de exemplo são criados corretamente no Visual Studio 2010.

Verifique se o ambiente de desenvolvimento da UDI está configurado corretamente ao determinar se:

Verifique se o Projeto samplePage é compilado 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, veja Rever a SamplePage Visual Studio Solution.

Para verificar se o projeto SamplePage é compilado corretamente

  1. Inicie o Visual Studio 2010.

  2. Abra o projeto SamplePage.

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

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

    É apresentada a caixa de diálogo Páginas de Propriedades de SamplePage .

  4. Na caixa de diálogo Páginas de Propriedades da Página de Exemplo, aceda a Propriedades de Configuração/Depuração.

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

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

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

  8. Na caixa de diálogo Páginas de Propriedades da Página de Exemplo, aceda a Propriedades de Configuração/Criar Eventos/Evento Pós-Compilação.

  9. Nas propriedades evento pós-criação, em Linha de Comandos, escreva o seguinte:

    copy /y "$(ProjectDir)..\..\..\..\OSDSetupWizard\x86\*.*" "$(TargetDir)"
    xcopy /y /i "$(ProjectDir)..\..\..\..\OSDSetupWizard\x86\en-us" "$(TargetDir)en-us"
    copy /y "$(ProjectDir)..\..\..\..\OSDSetupWizard\OSDResults\Images\UDI_Wizard_Banner.bmp" "$(ProjectDir)header.bmp"
    copy /y "$(ProjectDir)Config.xml" "$(TargetDir)"
    copy /y "$(ProjectDir)header.bmp" "$(TargetDir)header.bmp"
    
  10. Na caixa de diálogo Páginas de Propriedades da Página de Exemplo, selecione OK.

  11. Guarde o projeto.

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

    É apresentada a caixa de diálogo Microsoft Visual Studioa indicar que a origem está desatualizada e pergunta se pretende criar o projeto.

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

    A caixa de diálogo Sem Informações de Depuração é apresentada informando-o de que não existem informações de depuração disponíveis para OSDSetupWizard.exe.

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

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

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

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

    É apresentada a caixa de diálogo Cancelar Assistente .

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

  18. Feche o Visual Studio 2010.

Verifique se o Projeto SampleEditor é compilado corretamente

O projeto SampleEditor fornece um exemplo de como criar um editor de páginas de assistente personalizado para o Assistente de UDI Designer. Para obter mais informações sobre o projeto SampleEditor, veja Rever a SamplePage Visual Studio Solution.

Para verificar se o projeto SampleEditor é compilado corretamente

  1. Inicie o Visual Studio 2010.

  2. Abra o projeto SampleEditor.

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

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

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

    É aberta a caixa de diálogo Adicionar Referência .

  5. Na caixa de diálogo Adicionar Referência , selecione o separador Procurar .

  6. No separador Procurar , aceda a installation_folder\Bin (onde installation_folder é a pasta na qual instalou o MDT). Selecione os seguintes ficheiros e, em seguida, selecione OK:

    • Microsoft.Enterprise.UDIDesigner.Common.dll

    • Microsoft.Enterprise.UDIDesigner.DataService.dll

    • Microsoft.Enterprise.UDIDesigner.Infrastructure.dll

    • Microsoft.Practices.Prism.dll

    • Microsoft.Practices.ServiceLocation.dll

    • Microsoft.Practices.Unity.dll

    • RibbonControlsLibrary.dll

    Observação

    Pode selecionar vários ficheiros no separador Procurar ao manter premida a tecla CTRL enquanto seleciona os ficheiros.

  7. Em Gerenciador de Soluções, aceda a SampleEditor/References.

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

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

    É apresentada a caixa de diálogo Páginas de Propriedades do SampleEditor .

  10. Na caixa de diálogo Páginas de Propriedades do SampleEditor , selecione o separador Depurar .

  11. No separador Depurar , selecione Iniciar programa externo.

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

    Dica

    Pode selecionar o botão de reticências (...) para navegar para a pasta e selecionar UDIDesigner.exe.

  13. No menu Ficheiro , selecione Guardar Tudo.

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

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

    O Assistente de UDI Designer é iniciado.

  16. No Assistente de UDI Designer, no Friso, selecione Abrir.

    A caixa de diálogo Abrir é exibida.

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

    O ficheiro Config.xml é aberto e o Grupo de Palco Personalizado é apresentado no painel de detalhes.

  18. No painel de detalhes, selecione o separador Configurar .

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

    • Botão Desbloqueado, com o qual ativa ou desativa a caixa Localização

    • Caixa valor predefinido, na qual introduz um valor predefinido a apresentar na caixa Localização

    • Nome a apresentar amigável visível na página de resumo, na qual introduz o legenda para as informações apresentadas na página Resumo

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

  20. Feche o Assistente de UDI Designer.

  21. Feche o Visual Studio 2010.

Rever os Exemplos do SDK da UDI

Antes de iniciar o desenvolvimento, reveja os exemplos fornecidos no SDK da UDI. Utilize as informações neste guia e o código fonte nos exemplos para o ajudar a criar as suas próprias páginas de assistente personalizadas da UDI e editores de páginas do assistente.

Veja os exemplos do SDK da UDI ao rever:

Rever o Conteúdo da Pasta do SDK

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

Tabela 1. Pastas no SDK da UDI

Folder Esta pasta contém
Inclui Os ficheiros de cabeçalho C++ necessários para criar páginas de assistente personalizadas para o Assistente de UDI
Libs Os ficheiros de biblioteca C++ que serão ligados à sua página personalizada; Existem versões de 32 bits e 64 bits das bibliotecas de ligações estáticas. Nota: As versões itanium das bibliotecas (IA-64) não estão disponíveis.
SampleEditor Um projeto do Visual Studio para criar um editor personalizado utilizado para editar a página SamplePage no Assistente da UDI Designer, que está escrito em C#
Página de Exemplo Um projeto do Visual Studio para criar uma página do assistente de UDI personalizada, escrita no Visual C++

Reveja a Solução SamplePage do Visual Studio

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

Rever o Ciclo de Vida da Página do Assistente

Uma página do assistente de UDI tem métodos que correspondem a cada fase (ou fase) do ciclo de vida da página. Como parte da criação da página do assistente personalizado, tem de substituir estes métodos pelo seu código. A Tabela 2 lista os métodos que terá de substituir e fornece uma breve descrição de cada método, incluindo quando utilizar o método no ciclo de vida da página do assistente.

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

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

Para este método, escreva código que inicialize a página pela primeira vez e só precisa de ser executado uma vez. Por exemplo, utilize este método para inicializar campos ou para ler informações de configuração dos elementos Setter no ficheiro de configuração do Assistente de UDI.
OnWindowShown Este método é chamado sempre que a página é apresentada (apresentada) no Assistente de UDI. É denominada a primeira vez que a página é apresentada e sempre que navegar para a página, selecione Seguinte ou Anterior no assistente.

Para este método, escreva código que prepara a página para ser apresentada , por exemplo, ler variáveis de memória, variáveis de sequência de tarefas ou variáveis de ambiente e, em seguida, atualizar a página com base em quaisquer alterações a essas variáveis.
OnCommonControlEvent Este método pode ser chamado sempre que a página do assistente é apresentada e recebe uma mensagem de WM_NOTIFY de um menor (normalmente, controlos comuns).

Para este método, escreva código que processa WM_NOTIFY com base na mensagem de notificação. Por exemplo, poderá querer responder a eventos de um controlo comum, como responder a eventos de seleção ou duplo clique para um controlo TreeView .
OnUnhandledEvent Este método é chamado sempre que ocorre uma mensagem de janela não processada para a sua página do assistente. Este método proporciona a oportunidade de intercetar e processar estas mensagens de janela não processadas.

Para este método, escreva código que processe as mensagens da janela que são pertinentes para a página do assistente. Normalmente, não terá de substituir este método.
OnNextSelected Este método é chamado quando seleciona Seguinte no assistente.

Para este método, escreva código que efetue as ações necessárias antes de passar para a página do assistente seguinte, por exemplo, efetuar a validação que pode demorar muito tempo. Se a validação falhar, pode cancelar o pedido Seguinte e apresentar uma mensagem.
OnWindowHidden Este método é chamado sempre que a página é ocultada quando a página do assistente anterior ou seguinte é apresentada.

Para este método, escreva código que efetue quaisquer ações antes de a página ser ocultada, antes de ser apresentada outra página. Normalmente, não terá de substituir este método.

Veja o Exemplo de Página de Exemplo

Reveja o exemplo samplePage com a seguinte lista, 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 ficheiro de configuração do Assistente de UDI no exemplo (o ficheiro Config.xml), conforme descrito no Passo 1: O Assistente de UDI (OSDSetupWizard.exe) Lê o Ficheiro de Config.xml.

  2. O Assistente de UDI carrega as DLLs necessárias para cada página do assistente listada no ficheiro de configuração do Assistente de UDI, conforme descrito no Passo 2: O Assistente de UDI Carrega a DLL para a Página do Assistente Personalizado.

  3. O Assistente de UDI apresenta a página do assistente personalizado e permite a interação de controlo pretendida, conforme descrito no Passo 3: O Assistente de UDI apresenta a Página do Assistente Personalizado.

  4. Quando a página do assistente personalizado recolher as informações, execute todas as tarefas necessárias antes de selecionar Seguinte para avançar para o assistente seguinte, conforme descrito no Passo 4: O Botão Seguinte Está Selecionado na Página do Assistente Personalizado.

Passo 1: o Assistente de UDI (OSDSetupWizard.exe) Lê o Ficheiro de Config.xml

Quando o Assistente de UDI (OSDSetupWizard.exe) é iniciado, por predefinição, lê o ficheiro de configuração do Assistente de UDI, que é o ficheiro de UDIWizard_Config.xml — o ficheiro de configuração principal do Assistente de UDI.

Observação

O exemplo utiliza o ficheiro Config.xml como o ficheiro de configuração. No MDT, o ficheiro de configuração predefinido é o ficheiro UDIWizard_Config.xml, que reside na pasta Scripts no pacote ficheiros MDT para configuração.

Pode substituir o ficheiro de configuração predefinido que o Assistente de UDI utiliza ao modificar o passo de sequência de tarefas do Assistente de UDI para utilizar o parâmetro /definition . Para obter mais informações sobre como substituir o ficheiro de configuração predefinido que o Assistente de UDI utiliza, consulte "Substituir o Ficheiro de Configuração utilizado pelo Assistente de UDI".

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

  • Elemento DLLs

  • Elemento de estilo

  • Elemento Páginas

  • Elemento StageGroups

    Para obter mais informações sobre o esquema do ficheiro de configuração do Assistente de UDI e cada um destes elementos, veja Referência do Esquema de Ficheiro de Configuração do Assistente UDI.

    O Assistente de UDI analisa o elemento DLLs que procura os ficheiros .dll a carregar. No exemplo, estão listados dois ficheiros .dll: SamplePage.dll e SharedPages.dll. Estes ficheiros .dll têm de residir na mesma pasta que OSDSetupWizard.exe — a pasta Tools\platform (onde a plataforma é x86 para a versão de 32 bits ou x64 para a versão de 64 bits).

    O Assistente de UDI analisa o elemento Páginas à procura das páginas que estão definidas. No exemplo, são definidas duas páginas: Custom e SummaryPage. O atributo Tipo do elemento Page é definido no ficheiro PageClassIDs.h e define exclusivamente o tipo da sua página personalizada.

    No exemplo, o tipo definido é Microsoft.SamplePage.LocationPage. Para a sua página personalizada, substitua o seguinte para evitar potenciais conflitos com outras páginas que possa criar no futuro:

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

  • O nome do projeto no lugar de SamplePage.

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

Passo 2: o Assistente de UDI Carrega a DLL para a Página do Assistente Personalizado

Quando o Assistente de UDI carrega a DLL, chama a função RegisterFactories , que tem de ser implementada no ficheiro .dll. No exemplo, esta função é implementada no ficheiro dllmain.ccp. Cada página do assistente que criar tem de implementar a função RegisterFactories .

A função RegisterFactories é utilizada para registar a classe de fábrica da página do assistente no registo de fábrica da classe do Assistente de UDI. As 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 transmite essa classe para o registo de fábrica de classes do Assistente de UDI, o que disponibiliza essa classe de fábrica ao assistente. O Assistente de UDI procura uma classe de fábrica registada com um ID que corresponda ao atributo Tipo do elemento Página da página do assistente personalizado.

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

Pode criar uma função com o modelo de função Register_nome para simplificar a criação de uma nova instância de fábrica e registar a instância recém-criada. O valor de nome fornecido com o modelo de função Registar tem de implementar a interface iClassFactory . A Classe ClassFactoryImpl processa a maioria dos detalhes para implementar uma fábrica de classes.

Também pode utilizar a função RegisterFactories para registar tipos de tarefas e tipos de validação. Para obter mais informações, confira o seguinte:

Observação

O exemplo contém e regista apenas a página de um assistente personalizado. O exemplo não inclui tarefas ou validadores personalizados, pelo que não regista tarefas ou validadores personalizados.

Passo 3: o Assistente de UDI apresenta a página do Assistente Personalizado

A página do assistente personalizado no exemplo é definida no ficheiro 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 personalizadas do assistente. Implemente a Classe de Modelo WizardPageImpl como a classe base da página do assistente personalizado.

Para obter uma lista dos disponíveis:

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

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

    A página do assistente personalizado no exemplo deriva da Classe de Modelo WizardPageImpl e implementa a Interface IWizardPage. Além disso, a página do assistente personalizado implementa a interface IFieldCallback . Ambas são implementadas no ficheiro LocationPage.cpp.

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

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

    • AddField. Este método relaciona o controlo de caixa de IDC_COMBO_LOCATION no recurso IDD_LOCATION_PAGE com o elemento Dados denominado Localização no ficheiro Config.xml.

      Além do método AddField , pode utilizar os métodos AddRadioGroup e AddToGroup para suportar outros controlos e comportamentos.

      Observação

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

    • InitFields. Utilize este método para inicializar os campos (controlos) que adicionou ao formulário. O ponteiro da página é um parâmetro. No exemplo, este ponteiro é transmitido, que se refere à página atual.

      Observação

      Para suportar a utilização deste ponteiro, tem de implementar a interface IFieldCallback para além das interfaces suportadas pela Classe de Modelo WizardPageImpl .

      A interface IFieldCallback chama o método SetFieldDefault, que é utilizado para definir os valores predefinidos para controlos que não os controlos de caixa de texto e marcar caixa. No exemplo, o método SetFieldDefault define o índice inicial do controlo da caixa de combinação com base no valor predefinido especificado no elemento Predefinido para o elemento Campo no ficheiro Config.xml.

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

  • InitLocations. Este método preenche a caixa de combinação da lista de localizações no ficheiro Config.xml. Os elementos Data e DataItem subordinados do ficheiro Confg.xml fornecem a lista de valores possíveis.

  • OnNextSelected. 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 com o método SaveFields

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

Passo 4: O Botão Seguinte Está Selecionado na Página do Assistente Personalizado

Quando o utilizador conclui os campos na página do assistente personalizado, seleciona Seguinte, que chama o método OnNextSelected . O método OnNextSelected efetua todas as tarefas necessárias antes de avançar para a página do assistente seguinte, como registar quaisquer alterações de configuração efetuadas na página do assistente personalizado.

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

  1. InitSection. Este método inicializa o cabeçalho (etiqueta legenda) para os dados de resumo apresentados na página Resumo. Normalmente, pode definir este valor com a função DisplayName( ). Os dados associados a este legenda são guardados com o método SaveFields.

  2. SaveFields. Este método guarda valores de campo em variáveis de sequência de tarefas e nos dados apresentados na página Resumo .

Reveja a Solução SampleEditor do Visual Studio

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

Rever o Assistente de UDI Designer Arquitetura

O Assistente de UDI Designer foi desenvolvido com o WPF, Prism e Unity. A Designer UDI é utilizada para editar o ficheiro de configuração do Assistente de UDI (UDIWizard_Config.xml), que o Assistente de UDI (OSDSetupWizard.exe) lê no runtime. O elemento Páginas no ficheiro de configuração do Assistente de UDI contém uma lista de páginas que tem um elemento Página separado para cada página do assistente.

Quando edita as definições de configuração de uma página de assistente, o Assistente de UDI Designer carrega o editor de páginas personalizado que corresponde ao tipo de página do assistente. Os editores de páginas do assistente personalizado são desenvolvidos como controlos de utilizador WPF. As páginas personalizadas do editor de páginas do assistente utilizam o padrão de design Model-View-ViewModel (MVVM) para WPF.

O padrão de estrutura MVVM ajuda a separar a interface de utilizador (IU; apresentação) dos dados que estão a ser apresentados. Os dados são uma fachada sobre o elemento Página no ficheiro de configuração do Assistente de UDI (o ficheiro Config.xml no exemplo), que é acedido com a propriedade CurrentPage da interface IDataService .

O Assistente de UDI Designer utiliza o DependencyAttribute para obter acesso à classe DataService com base na arquitetura de injeção de dependências no Unity. Para obter mais informações sobre a arquitetura de interjeição de dependências no Unity, veja Injetar Alguma Vida nas Suas Aplicações — Conhecer o Bloco de Aplicações do Unity.

Rever Componentes Configuráveis de uma Página do Assistente de UDI

À medida que cria a página do assistente personalizado, algumas das definições de configuração podem ser definidas no código e não podem ser alteradas depois de compilar a página. No entanto, para outras definições de configuração, terá de permitir que essas definições de configuração sejam alteradas com o Assistente de UDI Designer.

Normalmente, as definições de configuração que pretende configurar com o Assistente de UDI Designer são guardadas no ficheiro de configuração do Assistente de UDI (o ficheiro Config.xml no exemplo). No entanto, também pode criar o seu próprio ficheiro de configuração separado, se necessário. Um exemplo de utilização de um ficheiro de configuração separado é o ficheiro UDIWizard_Config.xml.app, que a tarefa de Deteção de Aplicações e o tipo de página do assistente ApplicationPage utilizam.

Segue-se uma lista das definições de configuração típicas que pode gerir com o Assistente de UDI Designer:

  • Campo. Utilizar campos permite que os utilizadores forneçam entradas. Os campos são apresentados como Elementos de campo no ficheiro de configuração do Assistente de UDI (UDIWizard_Config.xml), que contém as definições de configuração de cada campo. O editor de páginas do assistente correspondente tem de fornecer um método para editar as definições de configuração do campo com o FieldElementControl.

  • Propriedades. Os setters ajudam a criar propriedades para entidades na página, como páginas no elemento Página , campos no elemento Campo ou dados nos elementos Dados ou DataItem . Pode configurar propriedades nos elementos Setter . Adicione um elemento Setter separado para cada propriedade que pretende definir. Pode editar as propriedades com o SetterControl e configurar outros elementos setter com outros controlos.

  • Dados. Os dados são utilizados para armazenar informações para utilização pela página do assistente e outros componentes. Pode definir dados para páginas ou campos com os elementos Dados ou DataItem . Os dados podem ser definidos numa estrutura simples ou hierárquica através da utilização adequada dos elementos Dados ou DataItem . O Config.xml no exemplo no SDK mostra como criar estruturas de dados simples.

    O editor de páginas do assistente personalizado que criar tem de conseguir gerir estas definições de configuração.

Veja o Exemplo de Página do Editor

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

  • IU para configurar as definições da caixa de combinação Localização

  • IU para adicionar ou editar uma localização na lista de possíveis localizações, que são apresentadas na caixa de combinação Localização

  • Definições de configuração lidas e guardadas no ficheiro de configuração do Assistente de UDI

  • Código de suporte para os outros componentes

    Reveja o exemplo do EditorPage no Visual Studio ao executar os seguintes passos:

  1. Reveja como o editor de páginas do assistente SampleEditor é carregado e inicializado no Assistente de UDI Designer conforme descrito em Rever Página do Assistente Editor Carregamento e Inicialização.

  2. Reveja a IU utilizada para editar a caixa de combinação Localização nos ficheiros LocationPageEditor.xaml e LocationPageEditor.xaml.cs, conforme descrito em Rever a Interface de Utilizador Utilizada para Configurar a Caixa de Combinação de Localização.

  3. Reveja a IU utilizada para adicionar ou editar localizações à lista nos ficheiros AddEditLocationView.xaml e AddEditLocationView.xaml.cs, conforme descrito em Rever a Interface de Utilizador Utilizada para Modificar a Lista de Localizações Possíveis.

  4. Reveja o código utilizado para gerir as informações de configuração guardadas no ficheiro de configuração do Assistente de UDI, conforme descrito em Rever o Código Utilizado para Gerir Informações de Configuração.

Assistente de Revisão de Editor Carregamento e Inicialização

Os editores de páginas do assistente personalizado são carregados conforme exigido pelo Assistente de Designer da UDI. O Assistente de UDI Designer ficheiros de configuração são carregados quando o Assistente de UDI Designer é iniciado. O Assistente de UDI Designer analisa a pasta install_folder\Bin\Config (em que install_folder é o nome da pasta onde o MDT está instalado) para ficheiros que tenham uma extensão de ficheiro .config.

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

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

  • DesignerAssembly. Este atributo determina o nome da DLL a carregar. Esta DLL tem de ser colocada na mesma pasta que o ficheiro de UDIDesigner.exe, que é a pasta install_folder\Bin (onde install_folder é o nome da pasta na qual o MDT está instalado).

  • DesignerType. Este atributo é o nome do tipo .NET da classe que contém o controlo de utilizador WPF.

  • Escreva. Utilize este atributo para configurar o tipo de página da página do assistente personalizado, que o Assistente de UDI carrega. O Assistente de UDI Designer utiliza este atributo para localizar o elemento Page adequado no ficheiro de configuração do Assistente de UDI.

  • Dll. Utilize este atributo para configurar o elemento DLL no ficheiro de configuração do Assistente de UDI, que o Assistente de UDI Designer criar.

  • Descrição. Utilize este atributo para fornecer informações sobre o editor de páginas do assistente. O valor deste atributo é apresentado na caixa de diálogo Adicionar Nova Página no assistente da UDI Designer, que é utilizado para adicionar a página do assistente à "Biblioteca de Páginas".

  • DisplayName. Utilize este atributo para fornecer o nome da página do assistente personalizado que é apresentada no Assistente de UDI Designer. O valor deste atributo é apresentado na caixa de diálogo Adicionar Nova Página no assistente da UDI Designer, que é utilizado para adicionar a página do assistente à "Biblioteca de Páginas".

    No exemplo, o tipo da página do assistente personalizado SamplePage é Microsoft.SamplePage.LocationPage, que é guardado no ficheiro Config.xml. O ficheiro Config.xml reside na pasta local_folder\SDK\SamplePage\SamplePage para (onde local_folder é a pasta que criou no computador de desenvolvimento no início do processo de configuração).

Reveja a Interface de Utilizador Utilizada para Configurar a Caixa de Combinação de Localização

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

Se examinar a IU no separador Estrutura e o código no separador XAML , pode ver a relação entre a IU gráfica e os elementos e atributos na Linguagem XAML (Extensible Application Markup Language).

Por exemplo, se rever o elemento Controls:FieldElementControl no XAML, pode ver como está relacionado com o esquema da IU correspondente. Utilize o elemento Controls:FieldElementControl para definir o controlo FieldElementControl .

Os parâmetros enlace no ficheiro XAML vinculam os campos no editor de páginas de exemplo com as informações no ficheiro de configuração do assistente UDI. Por exemplo, o código seguinte liga a caixa de texto Valor predefinido ao elemento Predefinido no ficheiro de configuração do assistente UDI (Config.xml no exemplo):

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

Para obter mais informações, veja How to: Make Data Available for Binding in XAML (Como: Disponibilizar Dados para Enlace em XAML).

Utilize o elemento Views:CollectionTControl.ColumnCollectionView no XAML para editar a lista de localizações disponíveis na vista de grelha. Utilize o controlo CollectionTControl para apresentar a vista de grelha e vincular a vista de grelha ao elemento Dados com o nome Localização no ficheiro de configuração UDI.

Reveja a Interface de Utilizador Utilizada para Modificar a Lista de Localizações Possíveis

A IU para modificar a lista de possíveis localizações consiste em:

Rever o Menu sensível ao contexto e os Botões do Friso para Modificar a Lista de Localizações

Quando clica com o botão direito do rato na caixa de listagem que contém a lista de localizações, é apresentado um menu sensível ao contexto. O Friso tem botões correspondentes que lhe permitem realizar as mesmas tarefas. O elemento de controlo Views:CollectionsTControl no ficheiro LocationPageEditor.xaml define os métodos chamados com base na ação tomada e nas propriedades que definiu da seguinte forma:

  • SelectedItem. Esta propriedade vinculada a dados é ativada quando o utilizador seleciona um item da lista. Esta propriedade está associada à propriedade CurrentLocation no modelo de vista, que está localizada no ficheiro LocationPageEditorViewModel.cs e utilizada pelo controlo CollectionTControl para transmitir o item selecionado quando edita ou remove um item existente.

  • AddItemAction. Esta ação é efetuada quando o utilizador seleciona a opção Adicionar Item no menu sensível ao contexto ou nos botões correspondentes no Friso. Existe um enlace de dados a uma propriedade no modelo de vista que devolve o objeto AddLocationAction . Este objeto é o método AddLocationCallback , localizado no ficheiro LocationPageEditorViewModel.cs, e apresenta a caixa de diálogo no ficheiro AddEditLocationView.xaml.

  • EditItemAction. Esta ação é executada quando o utilizador seleciona a opção Editar Item no menu sensível ao contexto. Existe um enlace de dados a uma propriedade no modelo de vista que devolve o objeto EditLocationAction . Este objeto é o método EditLocationCallback , localizado no ficheiro LocationPageEditorViewModel.cs, e apresenta a caixa de diálogo no ficheiro AddEditLocationView.xaml.

  • RemoveAction. Esta ação é executada quando o utilizador seleciona a opção Remover Item no menu sensível ao contexto. Existe um enlace de dados a uma propriedade no modelo de vista que devolve o objeto RemoveAction . Este objeto é o método EditLocationCallback , localizado no ficheiro LocationPageEditorViewModel.cs, e mostra uma mensagem que confirma a eliminação da localização.

Reveja a Caixa de Diálogo para Adicionar ou Editar Localizações

Se adicionar uma nova localização à lista de localizações ou editar uma localização existente, é apresentada uma mensagem que se encontra no ficheiro AddEditLocationView.xaml. A mensagem é apresentada com o método de janela ShowDialogWindow no ficheiro LocationPageEditorViewModel.cs.

A IU no ficheiro AddEditLocationView.xaml consiste em:

  • Uma moldura de caixa de diálogo com o nome DialogFrame, que inclui os seguintes elementos:

    • Um título, que configura com o atributo DialogTitle da moldura da caixa de diálogo

    • Um botão OK, que define o status de retorno como para a propriedade Aprovado como Verdadeiro (a status de devolução é verificada no método AddLocationCallback no ficheiro LocationPageEditorViewModel.cs para determinar se o utilizador selecionou OK.)

    • Um botão Cancelar, que define a status de devolução como para a propriedade Aprovado como Falso (a status de devolução é verificada no método AddLocationCallback no ficheiro LocationPageEditorViewModel.cs para determinar se o utilizador selecionou Cancelar.)

  • Um elemento WPF que contém:

    • Uma etiqueta, que configura com o atributo Content

    • Uma caixa de texto, vinculada ao elemento Dados com o nome Localização no ficheiro de configuração da UDI (o ficheiro de Config.xml no exemplo)

Rever o Código Utilizado para Gerir Informações de Configuração

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

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

  • UDIWizard_Config.xml ficheiro fornecido com MDT, armazenado na pasta installation_folder\Templates\Distribution\Scripts (em que installation_folder é a pasta na qual instalou o MDT); este ficheiro contém as definições de configuração para todas as páginas e fases incorporadas do assistente

    No exemplo SampleEditor, a rotina Localizações ajuda a gerir as informações de configuração e está localizada no ficheiro LocationPageEditorViewModel.cs. A rotina Localizações devolve uma lista das localizações do ficheiro de configuração do Assistente de UDI. Especificamente, a lista devolvida contém um item para cada elemento DataItem no ficheiro de configuração do Assistente de UDI.

Criar Páginas do Assistente de UDI Personalizadas

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

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

  2. Coloque os controlos (campos) pretendidos no formulário.

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

    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 ficheiro XML (como propriedades do Setter ).

  4. Escreva qualquer código para executar as tarefas adequadas quando a página for apresentada (substituições para o método OnWindowShown ), incluindo os seguintes passos:

    1. Ative ou desative os controlos com base nas informações lidas quando a página é carregada no passo 3.

    2. Atualize os controlos com base nas informações lidas quando a página é carregada no passo 3, como a população de controlos com base nas informações lidas.

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

  6. Escreva qualquer código para efetuar as tarefas adequadas quando o utilizador selecionar Seguinte no Assistente de UDI (substituições do método OnNextSelected ), incluindo os seguintes passos:

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

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

  7. Crie a solução.

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

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

    • Windows PE no computador de destino. O Windows PE não suporta a execução de aplicações de 32 bits numa versão de 64 bits do Windows PE. Por isso, precisa de ter criado uma versão para a página do assistente para cada arquitetura de processador do Windows PE que planeia utilizar.

  8. Copie a DLL da página do assistente personalizado para installation_folder\Modelos\Distribuição\Ferramentas\ pasta da plataforma (onde installation_folder é a pasta na qual 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 os passos para criar o editor de páginas personalizado.

Criar Editores de Páginas do Assistente Personalizado

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

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

  2. Crie a IU do editor de páginas primária num ficheiro .xaml.

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

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

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

  6. Adicione a interface IDataService .

  7. Escreva o código adequado para atualizar o ficheiro de configuração do Assistente de UDI com base nas definições de configuração a configurar com o editor de páginas do assistente personalizado.

  8. Crie caixas de diálogo subordinadas num ficheiro .xaml e chame-as a partir do editor de páginas primária através da interface IMessageBoxService , conforme exigido pela página do assistente a configurar.

  9. Adicione as interfaces adequadas ao Assistente de UDI Designer Friso com base nos requisitos da página do assistente a configurar.

  10. Crie a solução.

    Observação

    Certifique-se de que a versão da DLL que cria é a mesma plataforma de processador que a instalação do MDT. Por exemplo, se instalar a versão de 64 bits do MDT, crie uma versão de 64 bits do editor de páginas personalizado.

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

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

  12. Copie o Assistente de UDI Designer ficheiro de configuração que criou no passo anterior para a pasta installation_folder\Bin\Config (onde installation_folder é a pasta na qual instalou a versão do MDT).

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

Criar Tarefas UDI Personalizadas

As tarefas UDI são DLLs escritas em C++ que implementam a interface ITask. Pode registar a DLL na biblioteca de tarefas do Assistente de UDI Designer ao criar um Assistente de UDI Designer ficheiro de configuração (ficheiro .config) e colocá-lo na pasta installation_folder\Bin\Config (onde installation_folder é a pasta na qual instalou o MDT).

Observação

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

Para criar tarefas UDI personalizadas

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

    • Init. Este método é chamado para inicializar a sua tarefa.

    • Execute. Este método é chamado para executar a sua tarefa.

  2. Escreva o código que regista a fábrica da classe de tarefas personalizada no registo de fábrica.

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

    Observação

    Certifique-se de que a versão da DLL que cria é a mesma plataforma de processador que a instalação do MDT. Por exemplo, se 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 Tarefa no elemento TaskLibrary no Assistente da UDI Designer ficheiro de configuração semelhante ao seguinte excerto:

    <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 excerto anterior, o parâmetro de registo é utilizado para especificar um parâmetro para a localização de um ficheiro de registo.

  5. Copie o Assistente de UDI Designer ficheiro de configuração criado no passo anterior para a pasta installation_folder\Bin\Config (em que installation_folder é a pasta na qual instalou o MDT).

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

Criar Validadores de UDI Personalizados

Os validadores UDI são DLLs escritos em C++ que implementam a interface IValidator . Pode registar a DLL na biblioteca de validação do Assistente de UDI Designer ao criar um assistente de UDI Designer ficheiro de configuração (ficheiro .config) e colocá-lo na pasta installation_folder\Bin\Config (onde installation_folder é a pasta na qual instalou o MDT).

Para criar validadores UDI personalizados

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

    • Init(IControl *pControl, IWizardPageContainer *pContainer, IStringProperties *pProperties). O controlador de formulário chama o membro Init para inicializar o validador. Este método tem de chamar o método Init para a classe BaseValidator . Normalmente, lê quaisquer propriedades definidas para o validador a partir do ficheiro de configuração do Assistente de UDI. Por exemplo, o validador InvalidCharactersValidator obtém o valor da propriedade InvalidChars com este método.

    • IsValid. O controlador de formulário chama este método para ver se o controlo contém texto válido. Segue-se 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 este membro para cada batimento de teclas e outros eventos para que o validador possa validar o conteúdo do controlo e as mensagens atualizadas na parte inferior da página do assistente (ou limpá-los).

      Normalmente, estes são os únicos métodos que precisa de substituir. No entanto, dependendo do validador, poderá ter de substituir outros métodos na subclasse da classe BaseValidator que criar. Para obter mais informações sobre estes outros métodos, veja a classe BaseValidator .

  2. Escreva o código que regista a classe de tarefas personalizada na fábrica de registo.

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

    Observação

    Certifique-se de que a versão da DLL que cria é a mesma plataforma de processador que a instalação do MDT. Por exemplo, se 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 Validator no elemento ValidatorLibrary no Assistente de UDI Designer ficheiro de configuração semelhante ao seguinte excerto:

    <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 excerto anterior, o parâmetro NamedPattern é utilizado para especificar um parâmetro para o nome de um padrão de expressão regular predefinido.

  5. Copie o Assistente de UDI Designer ficheiro de configuração criado no passo anterior para a pasta installation_folder\Bin\Config (em que installation_folder é a pasta na qual instalou o MDT).

  6. Copie a DLL da sua tarefa personalizada para a pasta da plataforma installation_folder\Templates\Distribution\Tools\ (em que installation_folder é a pasta na qual 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 de UDI

Componentes de Página do Assistente

Pode utilizar qualquer um dos vários componentes pré-criados para criar as suas páginas personalizadas.

Criar Instâncias de Componentes

O Assistente de UDI utiliza fábricas de classes para criar novas instâncias de objetos. Estas fábricas estão registadas num registo de fábrica, utilizando uma cadeia como chave para a fábrica. Por exemplo, o componente WmiRepository é identificado pela cadeia "Microsoft.Wizard.WmiRepository", que está disponível no ficheiro de cabeçalho IWmiRepository como ID_WmiRepository.

Partindo do princípio de que escreveu a sua página como uma subclasse do WizardPageImpl, pode criar uma nova instância de um WmiRepoistory da seguinte forma:

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

A função CreateInstance é uma função de modelo segura para criar novas instâncias de componentes. O PWmiRepository é um ponteiro inteligente, pelo que processa a contagem de referências por si.

Componentes Criáveis

Existe um conjunto de componentes que pode registar no registo. O primeiro conjunto de componentes é sempre registado, porque o ficheiro executável do Assistente de main UDI fornece-o. Os outros dois conjuntos de componentes são fornecidos em DLLs "opcionais". Para que estes componentes estejam disponíveis, a DLL tem de estar listada na secção DLLs do .config ficheiro XML. O código não precisa de saber que executável contém um componente específico.

A lista de IDs de componentes (o nome do componente é igual ao ID, mas sem o ID_ inicial) registados no registo de fábrica (definido em OSDSetupWizard) é apresentada na Tabela 3.

Tabela 3. IDs de componentes

ID Descrição
ID_ACPowerTask (ITask, IWizardComponent) Uma tarefa de verificação prévia que garante que o computador não está a ser executado apenas com a bateria
ID_AppDiscoveryTask (ITask, IWizardComponent) Uma tarefa especializada para detetar os itens de software que instalou no computador
ID_BackgroundTask (IBackgroundTask, IWizardComponent) Pode ser utilizado para executar uma tarefa noutro thread
ID_CopyFilesTask (ITask, IWizardComponent) Uma tarefa para copiar um ou mais ficheiros
ID_FormController (IFormController) Vai gostar mais de não ter de criar uma instância, uma vez que a sua página recebe a sua própria instância
ID_InvalidCharactersValidator (IValidator) Garante que nenhum campo de texto contém carateres de uma lista fornecida ao validador
ID_Logger (ILogger) Irá gostar mais de não ter de criar uma instância manualmente, uma vez que a sua página recebe um ponteiro para a instância partilhada
ID_NonEmptyValidator (IValidator) Um validador que garante que nenhum campo está vazio
ID_PasswordValidator (IValidator) Um validador que garante que não existem dois campos de texto com o mesmo conteúdo
ID_Regex (IRegEx) Avalia expressões regulares, à procura de correspondências
ID_RegExValidator (IValidator) Um validador que valida uma expressão regular ou um padrão conhecido
ID_SimpleStringProperties (IStringProperties, ISimpleStringProperties) Fornece uma forma simples de enviar propriedades para tarefas sem utilizar XML
ID_ShellExecuteTask (ITask, IWizardComponent) Executar um programa externo
ID_SummaryBag (ISummaryBag) Disponível indiretamente a partir da sua página através do método Formulário
ID_TaskManager (ITaskManager, IBackgroundCallback, IWizardComponent) Gere a execução de um conjunto de tarefas e a IU
ID_WmiRepository (IWmiRepository, IWizardComponent) Permite-lhe executar consultas do Windows Management Instrumentation (WMI)
ID_IXmlDocument (IXmlDocument) Fornece uma fachada para ler e escrever documentos XML

Os OSDRefreshWizard.dll definidos, páginas partilhadas e outros componentes de controlo são apresentados na Tabela 4 e na Tabela 5.

Tabela 4. Controlos de Diretório

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

Tabela 5. SharedPages.dll definidos

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

Componentes de Controlo

Interage com os controlos na sua página através da função de modelo GetControlWrapper , que fornece acesso a um dos tipos de componentes listados na Tabela 6.

Tabela 6. Componentes

Tipos de controlo de caixa de diálogo Descrição
CONTROL_CHECK_BOX (ICheckBox) Uma fachada para trabalhar com controlos de caixa marcar
CONTROL_COMBO_BOX (IComboBox) Uma fachada para controlos de caixa de combinação
CONTROL_GENERIC (IControl) Permite-lhe trabalhar com a maioria dos tipos de controlos para controlar o estado de ativação e visível
CONTROL_LIST_VIEW (IListView) Uma fachada que fornece acesso às funcionalidades de um controlo de vista de lista
CONTROL_PROGRESS_BAR (IProgressBar) Uma fachada para trabalhar com a posição de um controlo de barra de progresso
CONTROL_RADIO_BUTTON (IRadioButton) Uma fachada para trabalhar com controlos de botão de opção
CONTROL_STATIC_TEXT (IStaticText) Uma fachada que fornece permissão de leitura/escrita para o texto de um controlo, como uma etiqueta ou caixa de texto
CONTROL_TREE_VIEW (ItreeView) Uma fachada para trabalhar com um controlo de vista de árvore

Componente da Lista de Imagens

Este componente é uma fachada para um controlo ImageList na sua página. Pode criar uma lista de imagens através da interface IListView ou ITreeView .

Componente FormController

O assistente cria este componente por si e transmite-o à sua página. Pode aceder à mesma a partir da sua página através do método Formulário , que a classe base WizardPageImpl implementa.

Componente InvalidCharacterValidator

Este é um tipo de validador que pode incluir numa página. O ID é ID_InvalidCharactersValidator (definido em IValidator.h), que tem um valor de texto de "Microsoft.Wizard.Validation.InvalidChars".

Este validador procura uma única propriedade (um elemento Setter no ficheiro .config) denominada InvalidChars, que é uma lista de carateres que não são permitidos. Verifica os carateres numa caixa de texto; se o texto contiver carateres desta lista, o componente comunica uma falha.

Componente NonEmptyValidator

Este é um tipo de validador que pode incluir numa página. O ID é ID_NonEmptyValidator (definido em IValidator.h), que tem um valor de texto de "Microsoft.Wizard.Validation.NonEmpty".

Este validador comunica uma falha se a caixa de texto (ou qualquer outro controlo que suporte IStaticText) tiver um valor de cadeia vazio.

Componente PasswordValidator

Este é um tipo de validador que pode incluir numa página. O ID é ID_PasswordValidator (definido em IValidator.h), que tem um valor de texto de "Microsoft.Wizard.Validation.Password".

Este validador funciona com dois controlos de texto diferentes (controlos que suportam IStaticText) e comunica falhas se não contiverem os mesmos valores. Por outras palavras, falha se as caixas de texto Palavra-passe e Confirmar Palavra-passe não corresponderem.

Uma vez que este validador necessita de dois controlos, precisa de mais configuração do que outros validadores. A configuração pode ter um aspeto semelhante ao seguinte:

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, define o controlo Confirmar Palavra-passe como um "subordinado" do controlo Palavra-passe . Desta forma, se o controlador de formulário desativar o controlo Palavra-passe , também desativará o controlo Confirmar Palavra-passe . Em seguida, adicione um validador de palavra-passe ao formulário. Por fim, forneça o validador de palavras-passe com a interface do controlo Confirmar Palavra-passe .

Devido ao requisito de dois controlos, tem de utilizar código para configurar este validador em vez do ficheiro XML .config.

Componente RegExValidator

Este é um tipo de validador que pode incluir numa página. O ID é ID_RegExValidator (definido em IValidator.h), que tem um valor de texto de "Microsoft.Wizard.Validation.RegEx".

Este validador compara o conteúdo de um controlo de texto (um que suporta IStaticText) a uma expressão regular e falha se o texto não corresponder à expressão normal.

Em alternativa, pode utilizar este validador com um padrão nomeado predefinido. Para utilizar uma expressão regular, o XML tem de conter uma propriedade setter chamada Padrão. Se quiser utilizar um padrão com nome, utilize 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 de formulário\utilizador ou user@domain
ComputerName O nome tem de ter entre 1 e 15 carateres e não pode incluir um conjunto de carateres (como : e ?)
Workgroup O nome tem de ter entre 1 e 15 carateres e não pode conter um conjunto de carateres (como =, +, e ?)

Componente FactoryRegistry

Este componente controla todas as fábricas e serviços de classe. Implementa a interface IFactoryRegistry e está disponível indiretamente através do Método de contentor da sua página. Além disso, o registo carrega DLLs de extensão. Depois de carregar uma DLL, o registo procura uma função exportada chamada RegisterFactories. Tem de implementar esta função e, na mesma, registar as fábricas de classes para as suas páginas, tarefas e validadores (e quaisquer outras fábricas de classe que pretenda registar). Eis um exemplo do projeto de exemplo:

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

Componente logger

Este componente está disponível para a sua página através do método Logger (implementado pelo WizardPageImpl). Utilize este método para escrever entradas no ficheiro de registo. Os conteúdos do ficheiro de registo são úteis para diagnosticar problemas que os utilizadores possam ter a executar o Assistente de UDI.

Componente PropertyBag

O pacote de propriedades é um contentor para variáveis de memória. Está disponível na sua página com Container()->Properties(). As variáveis de memória são úteis para transmitir dados temporários entre páginas diferentes.

Componentes TSVariableBag e TSRepository

O componente TSVariableBag permite-lhe ler e escrever variáveis de sequência de tarefas. Mantém os valores na memória até que o utilizador selecione Concluir (por predefinição). Pode aceder ao saco TSVariable através do método TSVariables da página (implementado pela classe base WizardPageImpl ). Estes componentes registam todas as leituras e escritas de variáveis de sequência de tarefas.

Componente WmiRepository

Este componente fornece uma fachada para trabalhar com consultas WMI. Pode chamar a função auxiliar CreateInstance com ID_WmiRepository para obter uma instância deste componente, que suporta a interface IWmiRepository . Este componente devolve registos de resultados através da interface IWmiIterator .

Classes auxiliares de página do assistente

Pode criar páginas personalizadas do assistente de UDI com classes auxiliares incorporadas fornecidas com o SDK da UDI. A Tabela 8 lista as classes auxiliares que pode utilizar para criar páginas personalizadas do assistente.

Tabela 8. Classes auxiliares

Classe auxiliar Descrição
ClasseFactoryImpl Esta é uma classe base útil para criar uma fábrica de classes que pode registar no registo de fábrica.
Classe de Modelo de Interface Utilize esta classe de modelo quando quiser criar um componente que implemente mais do que uma interface.
Classe Auxiliar de Caminho Esta classe fornece operações de ficheiro/diretório comuns.
Classe de Modelo de Ponteiro Esta classe fornece a contagem de referências para a gestão de duração em componentes COM. É importante lançar interfaces quando terminar de as utilizar. Esta classe de modelo processa a duração automaticamente.
Classe PUnknown Esta classe é um ponteiro inteligente especificamente para a interface IUnknown. Para todas as outras interfaces, utilize a classe de modelo Ponteiro.
Classe De Programa Auxiliar StringUtil Esta classe fornece métodos auxiliares que facilitam o trabalho com cadeias de carateres.
Classe de Modelo de Subinterface Esta classe base facilita a implementação de um componente que suporta uma interface que herda a partir de outra interface.
Classe de Modelo UnknownImpl Esta classe processa a maioria dos detalhes da criação de um componente COM.
WizardComponent Template Class Esta classe base é utilizada para criar componentes que precisam de acesso aos serviços do assistente, como a criação e o registo de componentes.
WizardPageImpl Classe de Modelo Esta classe base deve ser utilizada como a classe base para todas as páginas personalizadas do assistente

ClasseFactoryImpl

Esta é uma classe base útil para criar uma fábrica de classes que pode registar no registo de fábrica.

Segue-se um excerto do ficheiro LocationPage.h no projeto de exemplo para definir a classe ClassFactoryImpl .

#pragma once

#include "ClassFactoryImpl.h"

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

Segue-se um excerto do ficheiro LocationPage.cpp na página do assistente de exemplo utilizada para definir a fábrica de classes da página.

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

Classe de Modelo de Interface

Utilize esta classe de modelo quando quiser criar um componente que implemente mais do que uma interface, por exemplo:

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

Este código cria uma cadeia de classes base que suporta o IFieldCalback e as interfaces suportadas pelo WizardPageImpl (que por acaso é IWizardPage).

Classe Auxiliar de Caminho

Esta classe fornece operações de ficheiro/diretório comuns:

static inline std::wstring GetModulePath(HINSTANCE hModule)

Também devolve o caminho completo para o ficheiro .exe ou .dll com o identificador de instância que fornecer a este método:

static inline std::wstring GetModuleFilename(HINSTANCE hModule)

A classe devolve o caminho completo e o nome de ficheiro do ficheiro .exe e .dll com o identificador de instância que fornecer a este método:

static inline std::wstring GetDirectoryName(LPCWSTR fullName)

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

static inline std::wstring GetFileName(LPCWSTR fullName)

Tendo em conta um caminho com um nome de ficheiro, a classe auxiliar de caminho devolve apenas o nome do ficheiro:

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

Por fim, a classe devolve uma nova cadeia de carateres que é o caminho combinado e o nome do ficheiro (ou outro caminho).

Classe de Modelo de Ponteiro

Esta classe é definida em Pointer.h. Uma vez que os componentes COM utilizam a contagem de referências para a gestão de duração, é importante que liberte sempre interfaces quando terminar. A Microsoft fornece uma classe de modelo que processa a duração automaticamente. Por exemplo, se quiser um ponteiro inteligente para uma interface XML, pode escrever algo semelhante ao seguinte:

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

A primeira linha define o ponteiro inteligente. A segunda linha mostra a obtenção de um ponteiro inteligente através de outra chamada. O operador & liberta sempre uma interface existente se esta contiver uma e devolve o endereço do ponteiro interno. Depois de obter um ponteiro como este, a instância do Ponteiro chama a opção Libertar quando a variável ficar fora do âmbito. A Microsoft recomenda que utilize ponteiros inteligentes em vez de chamar o AddRef e o Release manualmente.

Além disso, a classe ponteiro de ponteiro inteligente chama QueryInterface para obter outras interfaces por si. Por exemplo, quando o registo de fábrica cria uma nova instância de um componente, tem um código semelhante ao seguinte:

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

A primeira linha chama QueryInterface nos bastidores para pedir a interface IWizardComponent . O ponteiro inteligente resultante será igual a nulo se o componente não suportar essa interface.

Classe PUnknown

Esta classe é um ponteiro inteligente especificamente para a interface IUnknown . Para todas as outras interfaces, utilize a classe de modelo Ponteiro .

Classe De Programa Auxiliar StringUtil

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

static inline int CompareIgnore(LPCWSTR first, LPCWSTR second)

Este método compara duas cadeias de carateres ao ignorar maiúsculas e minúsculas (veja Tabela 9).

Tabela 9. Classe De Programa Auxiliar StringUtil

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

Veja um exemplo:

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

Estes métodos são um pouco semelhantes aos métodos microsoft .NET Format no sentido em que os parâmetros estão na forma de {0}. No entanto, não efetuam qualquer 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 à volta do StringCchPrintf que devolvem um wstring para que não tenha de alocar memória para cadeias ou memórias intermédias.

Classe de Modelo de Subinterface

Esta classe base facilita a implementação de um componente que suporta uma interface que herda a partir de outra interface. Por exemplo, a interface ICheckBox herda do IControl. Eis como esta classe é utilizada 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

Esta classe é definida em UnknownImpl.h e processa a maioria dos detalhes da criação de um componente COM. Eis um exemplo de como utilizaria esta classe base:

classDirectory :public UnknownImpl<IDirectory>

Este código define uma classe que suporta a interface IDirectory .

WizardComponent Template Class

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

Por exemplo, eis como o componente CopyFilesTask é definido:

classCopyFilesTask :public WizardComponent<ITask>
{
    ...

O parâmetro para esta classe de modelo é a interface "main" que pretende utilizar para o seu componente, que no caso das tarefas é O ITask. Utilizar o WizardComponent significa que o componente suporta a interface fornecida (ITask neste exemplo) e IWizardComponent.

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

WizardPageImpl Classe de Modelo

Utilize esta classe como classe base para as suas páginas personalizadas, por exemplo:

class LocationPage :public WizardPageImpl<IDD_LOCATION_PAGE>

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

Interfaces de Página do Assistente

O Assistente de UDI utiliza interfaces para aceder aos diferentes controlos na sua página. Na sua página, utiliza a função GetControlWrapper para obter um wrapper de controlo. Veja um exemplo:

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

Aqui, o PStaticText é um ponteiro inteligente para a interface IStaticText . Os ponteiros inteligentes chamam automaticamente o método COM Release() quando ficam fora do âmbito ou 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 este componente, transmitindo-o para o logger para que possa registar informações.

HRESULTValidLogon(LPCTSTR userName, palavra-passe LPCTSTR, domínio LPCTSTR)

Este 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; marcar registos para obter detalhes
HRESULT HasAccess(LPCTSTR username, LPCTSTR password, LPCTSTR domain, LPCTSTR computerName, LPCTSTR accountDomain)

Este método verifica se um conjunto de credenciais tem acesso de leitura/escrita ao objeto de computador no AD DS, conforme mostrado na Tabela 11.

Tabela 11. HResult HasAccess

HRESULT Descrição
S_OK O utilizador tem acesso
E_FAIL O utilizador não tem acesso. Verifique o ficheiro de registo 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 utiliza esta classe para executar tarefas num thread separado. Também pode utilizar esta classe sempre que quiser efetuar operações num thread separado. As tarefas são qualquer classe que suporte a interface ITask .

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

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

Esta 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 pretende executar noutro thread
Id Um número que pode utilizar no método Concluído da chamada de retorno para saber que tarefa terminou a execução; útil se iniciar várias tarefas com o mesmo método de chamada de retorno
pCallback Uma classe que implementa o método Concluído , que é chamado sempre que uma tarefa termina em execução; a chamada para o método Concluído estará no thread de fundo e não no thread da IU
void Start(void)

Este método inicia a tarefa num thread de fundo e devolve os elementos apresentados na Tabela 13.

Tabela 13. Devolver Thread de Fundo

Retorna Descrição
E_INVALIDARG A tarefa já está em execução, pelo que não pode iniciá-la neste momento.
E_FAIL Ocorreu um problema ao iniciar o tópico.
S_OK O tópico foi iniciado.
Execução bool()

Este método devolve VERDADEIRO se a tarefa em segundo plano estiver atualmente em execução e FALSO se não estiver em execução.

HrESULT Wait(DWORD waitMilliseconds)

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

HrESULT Terminate(DWORD exitCode)

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

Tabela 14. HRESULT Terminar Código de Saída

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

Tabela 15. Códigos de Terminação

Retorna Descrição
E_FAIL A chamada para terminar falhou.
S_OK O pedido para terminar o thread foi concluído com êxito.
HRESULT GetExitCode(LPDWORD pCode, HRESULT *pHresult)

Utilize este 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 nulo se não precisar do valor devolvido. Ao sair, este parâmetro é definido como STILL_ACTIVE se o thread estiver em execução, o código devolvido pelo método Execute da tarefa ou o valor transmitido para o método Terminate se tiver chamado esse método.
pHresult Ponteiro para um HRESULT que será definido no retorno ou nulo se não precisar do valor HRESULT .
HRESULT Close(void)

Este método liberta o thread em segundo plano. Devolve E_INVALIDARG se o thread estiver atualmente em execução e S_OK caso contrário.

ICheckBox Interface

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

Defina o estado verificado da caixa de marcar. Quando o método é VERDADEIRO, a caixa de marcar é selecionada; quando o método é FALSO, a caixa de marcar é desmarcada.

BOOL IsButtonChecked()

Este método comunica o estado de marcar atual de uma caixa de marcar.

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

Esta interface é implementada pelo componente CheckBoxWrapper . Obtém uma instância deste componente com a função auxiliar GetControlWrapper com o tipo CONTROL_COMBO_BOX.

HRESULT Bind([in] IBindableList *pList)

Utilize este método quando tiver uma origem de dados que implemente a interface IBindableList . A caixa de listagem inicializa os conteúdos com as legendas desta lista.

HRESULT Select(índice int)

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

int Selected(void)

Este método devolve o índice do item selecionado ou -1 se nada estiver selecionado.

void Add([in] LPCTSTR legenda)

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

HRESULT GetText([out, retval] LPBSTR pText)

Obtenha a cadeia do item atualmente selecionado 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

Esta interface é implementada pelo componente ControlWrapper . Obtém uma instância deste componente com a função auxiliar GetControlWrapper com o tipo CONTROL_GENERIC.

HRESULT SetEnable(ATIVAÇÃO BOOL)

Ativar ou desativar o controlo.

BOOL IsEnabled(void)

Devolve VERDADEIRO se o controlo estiver ativado, FALSO se não estiver.

HRESULT SetVisible(BOOL visível)

Mostrar ou ocultar o controlo.

ICpuInfo Interface

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

Obtém esta interface ao criar um novo componente ID_CpuInfo . O método único comunica se a CPU é de 32 ou 64 bits. Tenha em atenção que, se tiver um sistema operativo de 32 bits num computador de 64 bits, este método devolve VERDADEIRO, uma vez que está apenas a comunicar a largura da CPU (e não o sistema operativo).

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 cria com ID_Directory, fornece uma fachada para trabalhar com diretórios no sistema de ficheiros.

BooL FileExists(nome LPCWSTR)

Este método devolve TRUE se existir um ficheiro com o nome fornecido.

BooL FindFirst([in] LPCWSTR name)

Este método localiza uma primeira correspondência para o nome que fornecer. Suporta carateres universais e devolve nomes de ficheiros e diretórios. O método devolve VERDADEIRO se for encontrada uma correspondência, caso contrário, FALSO.

HRESULT FoundName([out, retval] LPBSTR name)

Este método obtém o nome do ficheiro encontrado com uma chamada para FindFirst ou FindNext.

DWORD FoundAttributes(void)

Este método devolve o atributo para o ficheiro ou diretório encontrado mais recentemente. Pode utilizar o código da seguinte forma para testar se é um diretório:

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

Localize o seguinte. Este método devolve VERDADEIRO se tiver sido encontrada outra correspondência, caso contrário, FALSO.

void FinishFind(void)

Este método liberta os recursos utilizados 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

Obtém uma instância desta interface com 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âncias

Parâmetro Descrição
pLogger A instância do logger, que está disponível para a sua página através do método Logger da página
pContainer Transmite os resultados do método Contentor da sua página
pUsername A caixa de texto que contém o nome de utilizador a validar
pPassword A caixa de texto que contém a palavra-passe a validar
PComputerName A caixa de texto que contém o nome do computador que será eventualmente associado ao domínio
HRESULT IsUsernameValid(LPCWSTR domainName)

Este método utiliza o método IADHelper-ValidLogon> para fazer o trabalho. Veja este método para obter detalhes.

BOOL CanModifyComputerAdEntry(LPCWSTR domainName)

Verifique se o utilizador tem direitos para modificar a entrada do computador. A maior parte do trabalho é feito por IADHelper-HasAccess>. Se este método devolver FALSE, marcar o ficheiro de registo 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 este método antes de chamar outros componentes. Terá de criar um novo WmiRepository antes de chamar este método.

HRESULT SetWhereClause(LPCTSTR whereClause)

Este método permite-lhe adicionar texto que será apresentado como uma cláusula "where" na consulta. Por exemplo, a linha seguinte devolve apenas unidades USB:

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

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

Atualização HRESULT(nulo)

Execute a consulta. A lista de unidades disponível depois de chamar este método é ordenada por letra de unidade.

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

Este método adiciona os nomes de propriedades adicionais que pretende disponibilizar nos resultados da consulta. Chame este método antes de chamar Atualizar. 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
DISKQUERY_DISKPARTITION DiskIndex O número do disco como um número inteiro, começando por 0
DISKQUERY_LOGICALDISK VolumeName A etiqueta do volume
Contagem de size_t(nulo)

O número de registos devolvidos pela consulta. Chame Atualizar antes de chamar este método.

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

Este método obtém o valor de uma propriedade a partir dos resultados da consulta, conforme mostrado na Tabela 19.

Tabela 19. HRESULT GetProperty

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

Este método obtém o legenda para um registo que é o mesmo que a propriedade Legenda.

IImageList Interface

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

Esta interface é implementada pelo componente ImageList . Obtém uma instância deste componente a partir da interface IListView .

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

Crie uma nova lista de imagens, que este componente gere. Chame este método apenas uma vez.

HImageList GetImageList(void)

Este método devolve a alça da lista de imagens caso precise de realizar outras operações na lista de imagens.

int AddImage(HInstance hInstance, int resourceId)

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

Tabela 20. HRESULT IImageList Interface

Parâmetro Descrição
hInstance Identificador de instância do módulo que contém o recurso de mapa de bits
resourceId ID do recurso a carregar para a 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

Esta interface é implementada pelo componente ControlWrapper . Obtém uma instância deste componente com a função auxiliar GetControlWrapper com o tipo CONTROL_LIST_VIEW.

int AddItem([in] Texto LPCTSTR)

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

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

Adicione uma nova coluna à vista de lista.

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

Defina o texto numa 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 pretende modificar
coluna O índice da coluna que pretende atualizar; a primeira coluna é definida com AddItem, as colunas duas e as seguintes são definidas com este método
text A cadeia a mostrar na coluna
int GetWidth(void)

Este método devolve a largura de toda a caixa de texto.

void SetExtendedStyle(estilo DWORD)

Este método permite-lhe definir estilos expandidos na caixa de listagem, por exemplo:

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

Este método devolve o índice do item de vista de lista atualmente selecionado.

HRESULT SelectItem(índice int)

Defina o item selecionado na lista para este índice.

BOOL IsItemChecked(índice int)

Este método devolve VERDADEIRO se um item na lista estiver selecionado. Este método requer que chame SetExtendedStyle para definir o estilo da caixa de marcar.

int GetItemCount(void)

Este método devolve o número de itens na vista de lista.

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

Crie uma nova lista de imagens e anexe-a à vista de lista.

int AddImage(HINSTANCE hInstance, int resourceId)

Adicione uma imagem à lista de imagens da vista de lista. Primeiro, tem de chamar CreateImageList.

HRESULT SetImage(índice int, int imageIndex)

Defina a imagem que será apresentada no lado esquerdo para um item de vista de lista específico.

HRESULT Clear(void)

Remova todos os itens da vista de lista.

IProgressBar Interface

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

Esta interface é implementada pelo componente ProgressBarWrapper . Obtém uma instância deste componente com a função auxiliar GetControlWrapper com o tipo CONTROL_PROGRESS_BAR.

HRESULT SetPercentage(posição int)

Defina a posição da barra de progresso com um número entre 0 e 100. Por predefinição, as novas barras de progresso win32® têm um intervalo máximo de 100.

int GetPercentage(void)

Este método devolve 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

Esta interface é implementada pelo componente RadioButtonWrapper . Obtém uma instância deste componente com a função auxiliar GetControlWrapper com o tipo CONTROL_RADIO_BUTTON.

void SetGroup(int firstId, int lastId)

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

void CheckRadio(int id)

Defina o botão de opção específico para ser o botão único no grupo de botões de opção selecionados. Chame SetGroup antes de chamar este método.

BooL IsButtonChecked(id int)

Este método devolve VERDADEIRO se o botão de opção estiver atualmente selecionado, caso contrário, FALSO.

void EnableRadio(int id, BOOL enable)

Este método ativa ou desativa um botão de opção.

IStaticText Interface

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

Esta interface é implementada pelo componente StaticTextWrapper . Obtém uma instância deste componente com a função auxiliar GetControlWrapper com o tipo CONTROL_STATIC_TEXT.

HRESULT SetText([in] LPCTSTR pText)

Defina o texto para o controlo.

HRESULT GetText([out, retval] LPBSTR pText)

Este método devolve o valor atual do texto para o controlo.

ITask Interface

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

Implemente esta interface se pretender que o componente esteja disponível como uma tarefa na página de verificação prévia ou se quiser utilizar o componente BackgroundTask para realizar trabalhos num thread em segundo plano.

Eis 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 estiver a escrever uma tarefa para a página de verificação prévia, chame este método para inicializar a sua tarefa. O ficheiro .config contém XML que pode ter um aspeto semelhante ao seguinte:

<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 Tarefa e subordinados. A maioria das tarefas só precisa de ler dados do parâmetro pProperties .

Executar
HRESULT Execute(LPDWORD pReturnCode)

Aqui é onde escreve o código que executa a tarefa. Este método deve devolver S_OK se não existirem erros e poderá devolver outro HRESULT se ocorrer um erro enquanto a tarefa estava em execução. Valores que não S_OK que este método devolve correspondem a <Elementos de erro> na <secção ExitCodes> se estiver a utilizar a página de verificação prévia.

O parâmetro pReturnCode tem de ser atualizado com um número que reporte o estado da tarefa. Estes valores são correspondidos pela página de verificação prévia 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

Esta interface é implementada pelo componente TreeViewWrapper . Obtém uma instância deste componente com a função auxiliar GetControlWrapper com o tipo CONTROL_TREE_VIEW.

void EnableCheckboxes(void)

Este método ativa marcar caixas no controlo de vista de árvore ao definir o estilo de TVS_CHECKBOXES.

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

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

int AddImage(HINSTANCE hInstance, int resourceId)

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

HTREEITEM AddItem(texto LPCTSTR, HTREEITEM hParent = NULL)

Adicione um nó à vista de árvore. O novo nó será adicionado ao nível superior se hParent for NULL. Caso contrário, forneça o identificador para o item principal onde pretende adicionar o novo item. Este método devolve a alça ao novo item.

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

Defina a imagem a utilizar para um item de vista de árvore. Pode definir a imagem normal e expandida.

void Clear(void)

Remova todos os itens da vista de árvore.

BooL SetFirstVisible(item HTREEITEM)

Certifique-se de que o item de vista de árvore está visível. A vista de árvore irá deslocar-se, se necessário, para tornar este item visível.

BooL SelectItem(item HTREEITEM)

Defina o item atualmente selecionado para o item que fornecer. Pode chamar SetFirstVisible depois disto para garantir que o item recentemente selecionado está visível.

void CheckItem(item HTREEITEM, UINT checkState)

Basicamente, o método define a imagem que será apresentada para a caixa de marcar na vista de árvore. Estas imagens estão num controlo ImageList separado que a vista de árvore gere. Por predefinição, esta lista de imagens tem três imagens, apresentadas na Tabela 22.

Tabela 22.void CheckItem Lista de Imagens Predefinida

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

Este método devolve a alça do item de vista de árvore atualmente selecionado.

int SetItemHeight(altura CURTA)

Este método define a altura de todos os itens no controlo de vista de árvore em píxeis. Devolve a altura anterior em píxeis.

HRESULT EnableItem(item HTREEITEM, ativação BOOL)

Este método ativa ou desativa um único item na árvore. Desativar um item com crianças não desativará as crianças.

void Expand(HTREEITEM hItem, BOOL expand)

Este método expande ou fecha um nó na árvore.

HTREEITEM GetChild(HTREEITEM hParent)

Este método devolve o primeiro subordinado de um item de vista de árvore ou NULL se não existirem subordinados.

HTREEITEM GetParent(HTREEITEM hNode)

Este método devolve a alça do principal de um nó na vista de árvore ou NULO se o nó estiver no nível superior.

HTREEITEM GetNextItem(HTREEITEM hPrevious)

Pode chamar este método com um identificador que GetChild devolve para iterar através de todos os subordinados de um nó. Este método devolve o elemento colateral seguinte na árvore que partilha o mesmo elemento principal.

UINT IsChecked(item HTREEITEM)

Este método devolve 0 se o nó de vista de árvore não estiver selecionado e 1 se estiver.

BooL IsEnabled(item HTREEITEM)

Este método devolve VERDADEIRO se o nó de vista de árvore estiver ativado, caso contrário, FALSO.

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

Este método destina-se apenas a utilização interna.

HRESULT SetEventHandler(ITreeViewEvent *pEventHandler)

Chame este método se quiser receber uma notificação quando o item selecionado for alterado ou o utilizador alterar o estado marcar de um item de vista de árvore. Tem de implementar o ITreeViewEvent no seu componente para receber estas chamadas de retorno.

void SetSelectedBackColor(COLORREF color)

Defina a cor de fundo utilizada para o item selecionado.

IWmiIteration Interface

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

Normalmente, utiliza esta interface, juntamente com o IWmiRepository, ao trabalhar com chamadas WMI. A interface IWmiIteration permite-lhe iterar através dos valores devolvidos por uma consulta.

HRESULT Seguinte(vazio)

Ir para o item seguinte nos resultados da consulta, conforme mostrado na Tabela 23.

Tabela 23. HRESULT Next(void) Query Returns

HRRESULT Descrição
S_OK Movido para o resultado seguinte; pode utilizar GetProperty para obter as propriedades desse resultado.
S_FALSE Não existem mais itens na lista.
E_NOT_SET Não existem resultados de consulta
HRESULT GetProperty(LPCTSTR propertyName, [out] LPVARIANT pValue)

Este método obtém o valor de uma propriedade a partir do registo de resultados atual, conforme mostrado na Tabela 24 e tabela 25.

Tabela 24. HRESULT GetProperty

Parâmetro Descrição
propertyName Nome da propriedade que pretende obter
pValue Aponta para uma estrutura VARIANT que, em devolução, contém o valor da propriedade

Tabela 25. HRESULT GetProperty Result

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

Observação

O método GetProperty pode devolver outros códigos de erro WMI que não os listados na Tabela 25. Os valores listados são os resultados comuns que são devolvidos.

IWmiRepository Interface

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

Esta interface é implementada pelo componente WmiRepository (ID_WmiRepository).

HRESULT SetNamespace(LPCWSTR namespaceName)

Este método define o espaço de nomes WMI que será utilizado para a consulta. Chame este método antes de chamar o ExecQuery. Se não chamar este método, o espaço de nomes será root\cimv2. Este método devolve sempre S_OK.

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

Execute uma consulta no conjunto de espaços de nomes WMI com uma chamada para SetNamespace, conforme mostrado na Tabela 26 e Tabela 27.

Tabela 26. HRESULT ExecQuery

Parâmetro Descrição
Query A cadeia da consulta WMI que pretende executar
ppIterator Passe um ponteiro para um ponteiro de interface, que em troca será preenchido com uma interface, dando-lhe 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, devolve 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 de UDI tem o seu próprio controlador de formulário que implementa esta interface. Utilize este controlador para ligar os dados de campo no ficheiro XML .config aos controlos na sua página. Em seguida, o controlador de formulário processa muitos dos detalhes por si.

Configurar o Formulário

Geralmente, configure o controlador de formulário no método OnWindowCreated da sua página. Geralmente, fazê-lo envolve chamar os métodos apresentados na Tabela 28.

Tabela 28. Método OnWindowCreated

Method Descrição
Inicialização Inicializa o controlador de formulário
AddField Fornece uma ligação entre um campo no .config ficheiro XML que é um nome de cadeia e um controlo na caixa de diálogo da sua página que é um ID
AddRadioGroup Utilizado para ligar um botão de opção a um grupo e a um controlo na caixa de diálogo
AddToGroup Permite-lhe controlos "subordinados" que estão ativados ou desativados juntamente com o respetivo elemento principal ou com base no botão de opção selecionado
InitFields Chame depois de ter chamado todos os métodos Adicionar para configurar o formulário
Validate Efetua a validação inicial
Processamento de Eventos de Formulário

Adicione a seguinte chamada ao método OnControlEvent :

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

Esta chamada transmite eventos ao controlador de formulário para que possa processar eventos relacionados com formulários.

Guardar Dados do Formulário

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

Tabela 29. Método OnNextSelected

Method Descrição
InitSection Fornece o nome da secção que será apresentada na página Resumo desta página
SaveFields Guardar 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, chama este método perto do início do método OnWindowCreated da sua página. O comando deve ter um aspeto semelhante ao seguinte:

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

Este método é chamado internamente e não deve chamá-lo por si mesmo. Fornece o XML da página ao controlador de formulário.

Validar
HRESULT Validate(void)

Este método executa todos os validadores anexados aos controlos. Se um validador não passar, o controlador de formulário apresenta uma mensagem de aviso e desativa o botão Seguinte e, em seguida, deixa de processar validadores. Normalmente, só precisa de chamar este método no final do seu método OnWindowCreated ; devolve sempre S_OK.

AddToGroup
AddToGroup(int groupControlId, int controlId)

Este método adiciona um controlo como "subordinado" de uma caixa de marcar ou botão de opção, conforme mostrado na Tabela 30. Todos esses controlos subordinados serão desativados quando o controlo principal não estiver selecionado. O método devolve sempre S_OK.

Tabela 30. AddToGroup

Parâmetro Descrição
groupControlId O ID da caixa de marcar ou botão de opção que irá controlar o estado de ativação do controlo subordinado
Controlado O ID do controlo que pretende adicionar como subordinado
UpdateCheckGroup
HRESULT UpdateCheckGroup(int groupControlId)

Este método atualiza a ativação ou desativação status dos controlos subordinados de um grupo com base na status do controlo principal. Geralmente, não precisa de chamar este método por si próprio, porque o controlador de formulário chama-o por si.

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

Chame este método apenas se tiver um validador que pretenda criar no código em vez de com o XML. Este método devolve sempre S_OK.

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

Chame este método apenas se tiver um validador que pretenda criar no código em vez de com o XML.

DisableValidation
HRESULT DisableValidation(int controlId, BOOL disable)

Chame este método para desativar explicitamente o validador para um controlo ou restaurar a validação normal, conforme mostrado na Tabela 31. Este método é útil, por exemplo, quando tem regras de ativação/desativação para controlos que não estão abrangidos pela validação do formulário e tem de desativar a validação de um controlo. Por outras palavras, normalmente, não chamaria este método. Este método devolve sempre S_OK.

Tabela 31. HRESULT DisableValidation

Parâmetro Descrição
controlId O controlo para o qual pretende ativar ou desativar a validação
Disable Defina como VERDADEIRO para desativar a validação e como FALSO para restaurar a validação normal
AddField
HRESULT AddField(LPCWSTR fieldName, int controlId, BOOL suppressLog, DialogControlTypes type)

Adicione um mapeamento de controlo entre o nome num elemento Campo do .config ficheiro XML e o ID de controlo na caixa de diálogo da sua página, conforme mostrado na Tabela 32. Tem de chamar este método antes da chamada para InitFields, porque o InitFields utiliza estas informações. Este método devolve sempre S_OK.

Tabela 32. Campo De Adição HRESULT

Parâmetro Descrição
Nome do campo Nome do campo tal como aparece no XML da sua página
controlId O ID do controlo no modelo da caixa de diálogo da sua página
suppressLog Defina como VERDADEIRO se não quiser que os valores deste campo sejam escritos no ficheiro de registo; defina sempre este parâmetro como VERDADEIRO para os campos de palavra-passe ou PIN
Tipo O tipo de controlo, 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)

Este método adiciona um controlo a um grupo de botões de opção com nome, conforme mostrado na Tabela 33. Tem de chamar isto antes do método InitFields , porque esse método utiliza atributos no elemento RadioGroup para controlar as definições de todos os controlos de botão de opção no grupo. Os grupos de rádio podem ser bloqueados, por exemplo, para que todos os botões de opção estejam desativados, mas os controlos subordinados sejam ativados ou desativados apenas com base no botão de opção selecionado. Este método devolve sempre S_OK.

Tabela 33. HRESULT AddRadioGroup

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

Este método permite-lhe ativar ou desativar todo um grupo de botões de opção. Desativar um grupo de rádio desativa todos os controlos de botão de opção no grupo, bem como quaisquer subordinados desses botões de opção que tenham sido adicionados com AddToGroup. Consulte Tabela 34 e Tabela 35.

Tabela 34. EnableRadioGroup

Parâmetro Descrição
groupName Nome de um grupo de botões de opção que já definiu com uma chamada para AddRadioGroup
Enable Defina como VERDADEIRO para ativar o grupo de botões de opção e FALSO para desativar o grupo

Tabela 35. HRESULT EnableRadioGroup

HRESULT Descrição
S_OK Grupo ativado ou desativado
E_INVALIDARG Não existe nenhum grupo de botões de opção com o nome que forneceu
InitFields
HRESULT InitFields(IFieldCallback *pFieldCallback = nullptr)

Antes de chamar este método, chame AddField para cada campo que o XML possa controlar. Este método devolve sempre S_OK.

O parâmetro pFieldCallback é opcional. Se o fornecer, o controlador de formulário chama SetFieldDefault para controlos que não são CONTROL_STATIC_TEXT ou CONTROL_CHECK_BOX. Este comportamento permite-lhe obter um valor predefinido do XML e defini-lo manualmente no controlo.

SaveFields
HRESULT SaveFields(IFieldCallback *pFieldCallback = nullptr)

Este método guarda valores de campo em variáveis de sequência de tarefas e nos dados de resumo que serão apresentados na página Resumo . Fornecer um ponteiro no pFieldCallback permite-lhe processar valores de gravação para controlos que não suportam CONTROL_STATIC_TEXT.

IsFieldDisabled
BOOL IsFieldDisabled(int controlId)

Este método permite-lhe determinar se um campo foi desativado no XML.

InitSection
HRESULT InitSection(LPCWSTR key, LPCWSTR sectionCaption)

Este método inicializa os dados de resumo que serão apresentados na página Resumo , conforme mostrado na Tabela 36. Chame este método no método OnNextSelected antes de chamar SaveFields. Este método devolve sempre S_OK.

Tabela 36. HRESULT InitSection

Parâmetro Descrição
Chave Este parâmetro deve ser exclusivo da sua página. É utilizado para garantir que cada página tem as suas próprias informações de resumo.
sectionCaption O cabeçalho que será apresentado na página Resumo das informações de resumo desta página. Normalmente, utiliza DisplayName() como o valor para este parâmetro.
AddSummaryItem
HRESULT AddSummaryItem(LPCWSTR first, LPCWSTR second)

Este método permite-lhe adicionar itens de resumo à página Resumo acima e além desses itens definidos com o XML. Consulte a Tabela 37.

Tabela 37. HRESULT AddSummaryItem

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

Chame este método para variáveis de sequência de tarefas para as quais não pretende que os valores sejam escritos no ficheiro de registo. Chame este método para variáveis de sequência de tarefas que armazenam palavras-passe, PINs ou outros valores confidenciais que um utilizador possa introduzir.

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

Este método guarda o valor de um controlo de texto numa variável de sequência de tarefas e na secção de resumo. Normalmente, não terá de chamar este método por si próprio, porque o controlador de formulário faz isto para todos os campos. Consulte a Tabela 38.

Tabela 38. HRESULT SaveText

Parâmetro Descrição
controlId O ID da caixa de texto que contém o valor que pretende guardar (ou qualquer outro controlo que possa devolver texto)
tsVariableName Nome da variável de sequência de tarefas que pretende modificar
summaryCaption O legenda na página Resumo para este 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 para este valor.

ControlEvent
void ControlEvent(WORD eventId, WORD controlId)

Chame este método no método OnControlEvent para garantir que o controlador de formulários pode processar eventos de controlo, o que tem de fazer para funcionar corretamente. Os valores que transmite a este método são os mesmos valores transmitidos ao método OnControlEvent .

IsValid
BOOL IsValid(void)

Este método devolve o status da validação mais recente do formulário. Se algum dos validadores de controlo tiver comunicado um erro, este método devolve FALSE. Por outras palavras, só devolve VERDADEIRO se todos os controlos 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 controlo na sua página. A forma mais fácil de implementar um validador é torná-lo numa subclasse da classe BaseValidator , que é definida no ficheiro de cabeçalho BaseValidator.h.

HRESULT Init(IControl *pControl, mensagem LPCTSTR)

Se criar um validador em código, pode chamar este método para inicializar o validador. Consulte a Tabela 39.

Tabela 39. HRESULT Init

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

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

Tabela 40. Método HRESULT Init

Parâmetro Descrição
pControl O controlo que o seu validador tem de validar
pContainer Caso o validador precise de acesso ao logger ou precise de criar outros componentes
pProperties Fornece acesso às propriedades (elementos setter) do seu validador
BOOL, IsValid(LPBSTR pMessage)

Este método devolve VERDADEIRO se o controlo for válido ou FALSO se o controlo for inválido. Na devolução, o pMessage deve ser preenchido com um novo BSTR que contém a mensagem a apresentar quando o controlo não é válido.

HRESULT SetProperty(int propertyId, LPVARIANT pValue)

Pode implementar este método se precisar de valores adicionais que não são fornecidos no XML.

HRESULT SetProperty(int propertyId, IUnknown *pUnknown)

Pode implementar este método se precisar de valores adicionais que não são fornecidos no XML.

HRESULT SetProperty)(int propertyId, LPCTSTR pValue)

Pode implementar este método se precisar de valores adicionais 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);
};

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

BOOL MatchesRegex(entrada LPCTSTR, LPCTSTR regex)

Este método executa a expressão regular no texto de entrada. Utiliza a função de regex_match da biblioteca padrão C++ para fazer o trabalho real. O método devolve VERDADEIRO se existirem correspondências, caso contrário, FALSO.

HRESULT GetMatch(índice size_t, LPBSTR pValue)

Este método permite-lhe obter as correspondências da chamada MatchesRegex mais recente. Tenha em atenção que não existe nenhum erro de processamento neste método e devolve 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);
};

Não deve precisar de utilizar esta interface diretamente. Em vez disso, utilize iFormController.

ISummaryBag

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

Não deve precisar de utilizar esta interface diretamente. Em vez disso, utilize 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);
};

Esta interface fornece acesso a variáveis de sequência de tarefas. Pode aceder a esta interface com 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 colocados em cache após a primeira leitura.

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

Este método define o valor de uma variável de sequência de tarefas. Este valor é guardado na memória. Os valores da sequência de tarefas são escritos depois de selecionar Concluir no Assistente de UDI.

void Clear(void)

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

HRESULT Remove([in] LPCTSTR variableName)

Este método remove um valor de sequência de tarefas específico da memória. Da próxima vez que chamar GetValue com o mesmo nome de sequência de tarefas, o método tenta obtê-lo a partir da sequência de tarefas.

HRESULT SuppressLogValue([in] LPCTSTR variableName)

Sempre que as variáveis de sequência de tarefas são escritas, como quando seleciona Concluir no Assistente de UDI, os nomes e valores são escritos no ficheiro de registo. Chame este método para suprimir o registo de valores confidenciais, como palavras-passe ou PINs, para uma variável de sequência de tarefas específica.

void Save(void)

Este método guarda 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);
};

Esta interface destina-se a utilização interna por TSVariableBag para ler e escrever variáveis de sequência de tarefas.

IWizardFinish Interface

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

Esta interface é útil em cenários avançados em que pretende efetuar processamento adicional quando seleciona Concluir ou Cancelar no Assistente de UDI. O Assistente de UDI contém uma tarefa Concluir que guarda variáveis de sequência de tarefas quando seleciona Concluir. Se cancelar o assistente, a tarefa define apenas a variável de sequência de tarefas OSDSetupWizCancelled como VERDADEIRO e não guarda alterações a outras variáveis de sequência de tarefas.

Se criar o seu próprio componente de conclusão, terá de registá-lo com 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 esta interface se tiver um componente de origem de dados que pretenda vincular a uma caixa de combinação ao chamar o respetivo método Bind .

Contagem de size_t(nulo)

Este método devolve o número de itens na lista.

HRESULT GetCaption(índice size_t, LPBSTR pCaption)

Este método devolve a legenda do item num í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);
};

Esta interface fornece acesso a dados hierárquicos que podem ser guardados numa página. Obtém esta interface através de métodos na interface ISettingsProperties , que está disponível para a sua página através do método Definições .

Os dados no XML de uma página podem ter um aspeto semelhante 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>

Definições de Chamada()->GetDataNode(L"Rede", &pData) dá-lhe uma instância IDataNodes com dois itens de dados (cada um deles tem duas propriedades).

Contagem de size_t()

Este método devolve o número de elementos DataItem .

HRESULT SetCaptionProperty(LPCTSTR captionProperty)

O componente que suporta esta interface também suporta IBindableList, o que torna mais fácil preencher uma caixa de combinação com dados do XML da página. Este método controla que propriedade (setter) em cada elemento DataItem será utilizada para este enlace. Por exemplo, pode chamar este método com DisplayName e utilizaria essa propriedade setter para enlace de dados. Em seguida, a caixa de combinação conteria a Equipa Pública e Dev como itens.

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

Este 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 de índice (a começar por 0) do DataItem para o qual pretende obter um valor de propriedade
propertyName Nome da propriedade setter para a qual pretende obter um valor
propertyValue Em devolução, contém o valor de cadeia de uma propriedade

Tabela 42. HRESULT GetProperty

HRESULT Descrição
S_OK A propriedade foi obtida.
E_INVALIDARG O índice passou do fim da matriz.
HRESULT GetNode(índice size_t, [out] ISettingsProperties **ppNode)

Este método é semelhante a GetProperty, mas em vez de devolver um valor de um DataItem, devolve todo o DataItem moldado numa interface ISettingsProperties . Consulte Tabela 43 e Tabela 44.

Tabela 43. HRESULT GetNode

Parâmetro Descrição
Índice O valor de índice (a começar por 0) do DataItem para o qual pretende obter um valor de propriedade
ppNode Ao sair, a interface ISettingsProperties que encapsula o nó DataItem

Tabela 44. Resultados de GetNode HRESULT

HRESULT Descrição
S_OK O nó foi obtido.
E_INVALIDARG O índice passou do fim 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 cria uma nova página personalizada, precisa, no mínimo, de criar uma fábrica de páginas , uma classe que implementa o IClassFactory. (Pode utilizar ClassFactoryImpl como uma classe base para a fábrica.)

void Register(LPCTSTR type, IClassFactory *pFactory)

Este método regista uma fábrica de classes no registo. Consulte a Tabela 45.

Tabela 45. Registo nulo de IClassFactory

Parâmetro Descrição
Tipo Uma cadeia que identifica a fábrica que está a registar; geralmente, este parâmetro deve ter o nome da sua empresa na cadeia para garantir que é exclusivo
pFactory Um ponteiro para a sua instância de fábrica de classe
HRESULT LoadAndRegister(LPCTSTR dllName, ILogger *pLogger)

Este método destina-se apenas a utilização interna.

BooL Contains(tipo LPCTSTR)

Geralmente, este método destina-se a utilização interna. Verifica se uma fábrica de classes foi registada para um tipo.

HRESULT GetFactory(tipo LPCTSTR, IClassFactory **ppFactory)

Este método permite-lhe obter a fábrica de classes. Normalmente, chamaria CreateInstance. No entanto, se pretender criar um grande número do mesmo componente, é mais eficiente obter a fábrica e, em seguida, pedir-lhe para criar as instâncias automaticamente.

HRESULT CreateInstance(tipo LPCTSTR, IUnknown **ppInstance)

Este método cria uma nova instância de um componente, dado o respetivo tipo. Em vez disso, utilize o método createInstance do modelo, que permite a criação de objetos seguros para tipos.

HRESULT SetContainer(IWizardPageContainer *pContainer)

Este método destina-se apenas a utilização interna.

HRESULT RegisterService(REFGUID iid, IUnknown *pService)

Os serviços são instâncias individuais de um componente que pode ser utilizado em vários locais. Pode utilizar este método para registar um serviço numa página e, em seguida, obter essa mesma instância a partir de outra página.

HRESULT GetService(REFGUID iid, IUnknown **ppService)

Este método obtém um serviço que foi registado anteriormente com uma chamada para RegisterService.

HRESULT SetLanguage(LANGID languageId)

Este método define o idioma do Assistente de UDI para o identificador de idioma que forneceu no parâmetro languageId .

LANGID GetLanguage()

Este método devolve o valor do identificador de idioma que forneceu com o parâmetro /locale da linha de comandos do Assistente de UDI. O método devolve um dos seguintes valores:

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

  • 0, se não tiver fornecido o parâmetro da linha de comandos /locale

ILogger Interface

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

O Assistente de UDI regista informações num ficheiro de registo, o que ajuda a resolver problemas encontrados no campo. Recomendamos que as suas páginas regisem informações. Pode obter um ponteiro para esta interface a partir da sua página com o método Logger() da página. As linhas no ficheiro de registo contêm um número "nível" que representa mensagens de erro, normal, verbosa ou depuração.

Observação

As mensagens de depuração não são guardadas no ficheiro de registo, a menos que o suporte de depuração esteja ativado. Pode ativar o suporte de depuração ao adicionar a seguinte linha ao elemento Estilo no ficheiro .config:

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

Este método destina-se apenas a utilização interna.

MoveLog
HRESULT MoveLog(LPCWSTR logFilename)

Este método destina-se apenas a utilização interna.

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

Este método destina-se apenas a utilização interna.

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

Este método destina-se apenas a utilização interna.

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

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

Tabela 46. Erro HRESULT

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

Este método é semelhante ao Método de erro , mas permite-lhe fornecer uma mensagem em duas partes. A mensagem final terá "mensagem" e, em seguida, "message2" no ficheiro de saída. Este é simplesmente um método de conveniência.

Normal
HRESULT Normal(LPCTSTR component, LPCTSTR message)

Este método regista uma mensagem normal. Veja a descrição do método Error para parâmetros.

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

Este método regista uma mensagem normal. Veja a descrição do método Error2 para parâmetros.

Detalhado
HRESULT Verbose(LPCTSTR component, LPCTSTR message)

Este método regista uma mensagem verbosa. Veja a descrição do método Error para parâmetros.

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

Este método regista uma mensagem verbosa. Veja a descrição do método Error2 para parâmetros.

Depurar
HRESULT Debug(LPCWSTR component, LPCWSTR message)

Este método regista uma mensagem de depuração. Veja a descrição do método Error para parâmetros. As mensagens de depuração não são guardadas no ficheiro, a menos que estejam ativadas. Consulte a secção Descrição geral para obter detalhes.

EnableDebug
HRESULT EnableDebug(BOOL debug)

Este método destina-se apenas a utilização interna.

Fechar
HRESULT Close(void)

Este método destina-se apenas a utilização interna.

GetLogFilename
HRESULT GetLogFilename(LPBSTR pFilename)

Este método obtém o nome do ficheiro de registo.

IOrientation Interface

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

Esta interface destina-se apenas a utilização interna.

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

Esta interface destina-se apenas a utilização interna.

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

Esta interface fornece acesso aos dados da página. Para chegar ao nível superior dos dados de página, utilize o método Definições() da página.

HRESULT GetAttribute(LPCTSTR attributeName, LPBSTR attributeValue)

Este método permite-lhe obter os valores dos atributos no nó main, que é o nó Página quando está a utilizar o método Definições() da página.

IStringProperties * Properties()

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

HRESULT SelectNodes(LPCTSTR xPath, IXMLDOMNodeList **ppList)

Chame este método se quiser obter diretamente uma lista de nós XML com uma expressão XPath. É melhor utilizar um dos outros métodos, se possível. Utilize este método apenas se não conseguir aceder aos nós de outra forma.

HRESULT SelectSingleNode(LPCTSTR xPath, IXMLDOMNode **ppNode)

Chame este método se quiser obter diretamente um único nó XML com uma expressão XPath. É melhor utilizar um dos outros métodos, se possível. Utilize este método apenas se não conseguir aceder a um nó de outra forma.

HRESULT GetDataNode(nome LPCTSTR, ISettingsProperties **ppNode)

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

HRESULT GetDataNodes(IDataNodes **ppNodes)

Este método obtém uma lista de elementos DataItem no nó atual. A partir do nível da página, chame GetDataNode para obter uma interface ISettingsProperty para os dados. Em seguida, nessa instância, chame GetDataNodes para obter a lista de registos. Por exemplo, tendo em conta 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)

Este método fornece uma forma rápida de aceder ao conjunto de nós DataItem num nó de Dados específico. Ao utilizar o XML do exemplo GetDataNodes , o código seguinte faz exatamente o mesmo que as quatro linhas de código no exemplo em GetDataNodes , mas com a verificação de erros:

ISimpleStringProperties Interface

ISimpleStringProperties Interface

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

Por si só, esta interface pode não ser útil. No entanto, é implementado pelo componente ID_SimpleStringProperties , que também implementa a interface IStringProperties . Pode utilizar este componente nos casos em que precisa de transmitir um conjunto de propriedades para outro componente, como uma tarefa, mas quer adicionar valores programaticamente em vez de utilizar valores de XML. Eis um exemplo de como utilizaria esta 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);
};

Esta interface fornece acesso simples a um conjunto de elementos setter provenientes de XML. Esta interface está disponível para as propriedades de uma página com Definições()->Propriedades().

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

Este método obtém 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 pretende ler
pPropValue Ao sair, contém o valor da propriedade como uma cadeia (este valor será nulo se não existir essa propriedade.)

Tabela 48. IHRESULT Obter Resultados do Valor da Propriedade

HRESULT Descrição
S_OK O valor da propriedade é obtido.
E_INVALIDARG Não existe nenhuma propriedade com o nome que 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);
}

Esta interface é implementada pelo componente TaskManager (ID_TaskManager em ITaskManager.h), que é o componente que executa tarefas na página de verificação prévia. Pode utilizar diretamente a página de verificação prévia, que é o que faz a maior parte do tempo, ou criar a sua própria página, permitindo que este componente faça a maior parte do trabalho.

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

Tem de chamar este método antes de chamar qualquer outro método. Inicializa o componente TaskManager . Consulte a Tabela 49.

Tabela 49. HRESULT Init

Parâmetro Descrição
pPageView Fornece acesso à página que irá executar tarefas (esta página tem de ter um conjunto específico de controlos, que estão descritos nos próximos parâmetros.)
idListView O ID de controlo de um controlo ListView que irá apresentar a lista de tarefas e a status dessas tarefas
idMessage O ID de controlo de uma caixa de texto que será utilizada para apresentar uma mensagem para a tarefa que selecionar
idRetryButton O ID de controlo de um botão que pode selecionar para executar as tarefas novamente
pPageInfo Um wrapper à volta do XML da página (TaskManager carrega o conjunto de tarefas a executar a partir deste XML.)
pCallback Pode ser nulo (se este parâmetro não for nulo, o TaskManager chama o método Iniciado quando inicia uma tarefa e o método Concluído para cada tarefa que é concluída em execução.)
HRESULT SetFailMessage(mensagem LPCWSTR)

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

Início HRESULT (vazio)

Este método inicia todas as tarefas. Cada tarefa é iniciada num thread separado.

HRESULT GetTaskMessage(índice de size_t, mensagem LPBSTR)

Este método destina-se apenas a utilização interna. Obtém a mensagem atual de uma tarefa com base no respetivo índice na lista de tarefas.

HRESULT GetResultType)(índice size_t, tipo LPBSTR)

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

Tabela 50. HRESULT GetResultType

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

O tipo é obtido ao observar o código de saída ou de erro da tarefa e encontrar uma correspondência no elemento XML ExitCodes> da <tarefa.

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

Este método é utilizado pelas páginas de progresso e de verificação prévia para obter a propriedade bitmapFilename setter para que possa apresentar uma imagem junto à mensagem da tarefa que realçar. Por outras palavras, pode adicionar um setter personalizado ao XML da tarefa e, em seguida, recuperá-lo com este método.

int GetSelectedIndex(void)

Este método obtém o índice da tarefa atualmente selecionada, o que é útil se quiser obter informações adicionais sobre a tarefa (consulte o método GetProperty ) para apresentar para a tarefa selecionada. As páginas de progresso e de verificação prévia utilizam este método para apresentar uma imagem para a tarefa selecionada.

HrESULT Wait(DWORD waitMilliseconds)

Este método ajuda principalmente com os testes de unidades para que o teste possa garantir que as tarefas são concluídas antes do teste de unidades sair. Normalmente, não chamaria este método. Devolve quando todas as tarefas terminarem de ser executadas ou o tempo de espera tiver decorrido.

size_t FailedCount(void)

Este método devolve o número de tarefas atualmente marcadas como falhadas.

size_t WarningCount(void)

Este método devolve o número de tarefas atualmente marcadas como aviso.

size_t SucceedCount(void)

Este método devolve o número de tarefas atualmente marcadas como com êxito.

size_t RunningCount(void)

Este método devolve o número de tarefas atualmente em execução.

void OnCommonControlEvent(WORD controlId, LPNMHDR pInfo)

Chame este método a partir do OnCommonControlEvent da sua página para que o TaskManager possa processar eventos de que precisa.

void OnControlEvent(WORD eventId, WORD controlId)

Chame este método a partir do OnControlEvent da sua página para que o TaskManager possa processar eventos de que precisa.

void EnableButtons(ATIVAÇÃO BOOL)

Este método destina-se apenas a utilização interna.

IWizardComponent Interface

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

Normalmente, não irá implementar esta interface diretamente, mas sim através da classe de modelo WizardComponent . Se o seu componente implementar esta interface e tiver registado uma fábrica de classes com o registo, o componente receberá um ponteiro para a instância IWizardPageContainer quando esta for criada. Isto ajuda-o, por exemplo, a aceder ao Logger ou ao registo para criar outros componentes de que o componente poderá 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);
};

Esta interface destina-se apenas a utilização interna.

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

Esta interface destina-se apenas a utilização interna.

IWizardPage Interface

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

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

Esta interface é implementada pelo WizardPageImpl, pelo que, normalmente, não terá de implementá-la manualmente. O assistente chama todos estes métodos por si quando interage com as 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

Esta interface está disponível para a sua página através do método Contentor (implementado pelo WizardPageImpl) e dá-lhe acesso a vários serviços do assistente.

ILogger * Logger(void)

Utilize este método para escrever mensagens no ficheiro de registo, por exemplo:

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

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

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

Este método permite-lhe criar uma nova instância de qualquer componente que tenha sido registado. No entanto, é melhor utilizar a função de modelo CreateInstance, uma vez que está fortemente digitada.

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

Este método permite-lhe obter um serviço que foi registado. No entanto, é melhor chamar a função de modelo GetService , que é fortemente digitada (em vez de utilizar IUnknown).

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

Este método processa o trabalho com variáveis dentro de valores de cadeia. Suporta os formatos apresentados na Tabela 51 e na Tabela 52.

Tabela 51. HRESULT ReplaceVariables

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

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

Tabela 52. Parâmetro HRESULT

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

Este método não foi totalmente testado. A ideia é que possa mudar diretamente para uma página específica com base no nome da página, conforme definido no ficheiro XML .config. Chamar este método ignora OnNextSelected na sua página. Além disso, o comportamento deste método está sujeito a alterações, pelo que pode utilizá-lo por sua conta e risco.

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

Este método apresenta uma caixa de mensagem com o texto e legenda que fornecer. O parâmetro uType é qualquer valor que pode fornecer à função Win32 do MessageBox .

BOOL InPreview(void)

Este método devolve VERDADEIRO se tiver iniciado o assistente no modo de "pré-visualização" ao fornecer o comutador /preview . No modo de pré-visualização, o botão Seguinte nunca é desativado. Este método permite-lhe ignorar o código no modo de pré-visualização, por exemplo, que pode causar problemas quando não tem dados válidos na página.

HWND GetHwnd(void)

Este método devolve o HWND da caixa de diálogo main. Utilize este método com cuidado. Geralmente, a interface de programação de aplicações do Assistente de UDI foi concebida para que nunca trabalhe diretamente com alças 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);
};

Esta interface está disponível para o código na sua página através do método View (implementado por WizardPageImpl).

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

O Assistente de UDI utiliza wrappers, que são realmente fachadas para interagir com os controlos na sua página. Utilizar estas fachadas em vez dos controlos reais torna muito mais fácil escrever testes para a sua página, uma vez que pode fornecer fachadas falsas dos seus testes.

Em vez de utilizar este método diretamente, é melhor utilizar o método de modelo GetControlWrapper , que está fortemente escrito, por exemplo:

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

Este método devolve a alça de janela da sua página. Geralmente, não deve precisar de acesso a esta alça de janela.

HWND GetControl(int itemId)

Se for necessário, pode chamar este método para obter a alça de janela de um controlo na sua página. (É melhor chamar a função de modelo GetControlWrapper ).

HrESULT Show (nulo)

Este método destina-se apenas a utilização interna.

HRESULT Ocultar(vazio)

Este método destina-se apenas a utilização interna.

HrESULT Focus(int itemId)

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

IWizardPage * Page(void)

Este método destina-se apenas a utilização interna.

IFormController * Form(void)

Este método destina-se apenas a utilização interna.

HRESULT FocusWizardButton(botão WizardButtons)

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

HRESULT SetEnable(botão WizardButtons, ativar BOOL)

Peça que um dos botões do assistente seja ativado ou desativado. O botão pode não corresponder ao estado pedido. Por exemplo, se executar o Assistente de UDI com o comutador /preview , os botões serão sempre ativados. WizardButtons tem dois valores: BackButton e NextButton.

void ShowWarningMessage(mensagem LPCTSTR)

Este método apresenta uma mensagem de aviso na parte inferior da área de conteúdo da página. Esta mensagem pode ser qualquer texto que pretenda.

void HideWarningMessage(void)

Oculte uma mensagem de aviso apresentada 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

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

HrESULT Load(LPCTSTR filename)

Este método carrega um documento XML a partir de um ficheiro externo. Devolve S_OK se o ficheiro foi carregado sem erros ou S_FALSE se ocorreu um erro. Quando existe um erro, pode obter a mensagem de erro ao chamar GetParseErrorMessage.

HRESULT LoadXml(LPCTSTR xml)

Este método carrega um documento XML a partir de uma cadeia em vez de um ficheiro externo. Além da origem para ler o XML, o comportamento é o mesmo que o Método de carregamento .

HRESULT Save(LPCWSTR filename)

Este método guarda o documento XML que está na memória num ficheiro externo.

HRESULT GetParseErrorMessage(LPBSTR pMessage)

Este método devolve uma nova cadeia com a mensagem de erro ao carregar o documento XML, se existir. Devolve sempre S_OK.

HRESULT SelectNodes(LPCTSTR xpath, IXMLDOMNodeList **ppNodes)

Este método permite-lhe utilizar uma expressão XPath para obter uma coleção de nós do documento. Devolve sempre S_OK.

HRESULT SelectSingleNode(LPCTSTR xpath, IXMLDOMNode **ppNode)

Este método permite-lhe utilizar uma expressão XPath para obter um nó do documento. Devolve sempre S_OK.

HRESULT AddSchema(LPCTSTR filename, LPCTSTR ns)

Este método adiciona o nome de um ficheiro de esquema externo que será utilizado para validar o esquema do documento XML quando for carregado. O espaço de nomes que fornece é a cadeia que pode utilizar nas consultas XPath, embora esta ação não tenha sido testada.

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

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

Tabela 53. HRESULT AddAttribute

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

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

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

Depois de criar um novo nó, pode adicioná-lo como subordinado a outro nó ao chamar o método appendChild do encarregado de educação.

Funções auxiliares

Função CreateInstance Template

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

Esta função é definida em IWizardPageContainer.h e fornece um wrapper seguro para tipos através do método IWizardPageContainer-CreateInstance>, por exemplo:

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

Este código cria um novo componente ID_Directory para obter a interface IDirectory desse componente.

Função GetService Template

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

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

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

Esta função obtém o componente de sequência de tarefas, que suporta a interface ITSVariableBag . (Para ITSVariableBag, pode utilizar o método TSVariables da classe WizardPageImpl .

Assistente de UDI Designer Referência do Esquema do Ficheiro de Configuração

Este ficheiro é consumido pelo Assistente de UDI Designer. É criado um ficheiro separado para cada ficheiro de .dll personalizado, que pode conter editores de páginas personalizados, tarefas personalizadas ou validadores personalizados. O ficheiro tem de terminar com .config e residir na pasta installation_folder\Bin\Config (onde installation_folder é a pasta na qual instalou o MDT).

A Tabela 54 lista os elementos no Assistente de UDI Designer ficheiro de configuração e as respetivas descrições. O elemento DesignerConfig é o nó raiz para esta referência.

Tabela 54. Elementos no Assistente de UDI Designer Ficheiro de Configuração e as Respetivas Descrições

Nome do Elemento Descrição
DesignerConfig Especifica a raiz para todos os outros elementos
DesignerMappings Agrupa um conjunto de elementos de Página
Page Especifica um editor de páginas do assistente a carregar no Assistente de UDI Designer, que é utilizado para editar as definições de configuração de uma página do assistente
Param Especifica um parâmetro que é transmitido para o elemento Principal Tarefa ou Validador e corresponde a um elemento Setter no ficheiro de configuração do Assistente de UDI Nota: os atributos para este elemento são diferentes se o elemento principal for o elemento Tarefa ou Validador .
Tarefa Especifica uma tarefa na biblioteca de tarefas
Item de tarefa Especifica um grupo de parâmetros que são transmitidos para a tarefa
TaskLibrary Agrupa um conjunto de elementos de Tarefa
Validador Especifica um validador na biblioteca de validação
ValidatorLibrary Agrupa um conjunto de elementos do Validador

DesignerConfig

Este elemento especifica a raiz para 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 Primeiro: este elemento é obrigatório.
Elementos pai Nenhum
Conteúdos DesignerMappings, TaskLibrary, ValidatorLibrary
Atributos do Elemento

Este elemento não tem atributos.

Comentários

Nenhuma.

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

DesignerMappings

Este elemento agrupa um conjunto de elementos de Página .

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 no elemento DesignerConfig (este elemento é opcional se não existir uma página de assistente personalizada na DLL que corresponda a este Assistente de UDI Designer ficheiro de configuração.)
Elementos pai DesignerConfig
Conteúdos Page
Atributos do Elemento

Este 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

Este elemento especifica um editor de páginas do assistente a carregar no Assistente de UDI Designer, que por sua vez é utilizado para editar as definições de configuração de uma página do assistente.

Informações sobre o elemento

A Tabela 57 fornece informações sobre o elemento Página .

Tabela 57. Informações do Elemento de Página

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

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

Tabela 58. Atributos e Valores Correspondentes para o Elemento de Página

Atributo Descrição
Descrição Especifica o texto que fornece informações sobre o parâmetro, que é apresentado no Assistente da UDI Designer
DesignerAssembly Especifica o nome do ficheiro de .dll associado ao editor de páginas do assistente (o ficheiro .dll tem de existir na pasta installation_folder\Bin (em que installation_folder é a pasta na qual instalou o MDT.)
DesignerType Especifica o nome do editor de páginas do assistente no ficheiro .dll especificado no atributo DesignerAssembly (este é o tipo .NET da Microsoft para o editor de páginas do assistente, com o espaço de nomes microsoft .NET completamente qualificado.)
DisplayName Especifica o nome amigável do editor de páginas, que é apresentado no Assistente de UDI Designer
DLL Especifica o nome do ficheiro de .dll associado à página do assistente (o ficheiro .dll tem de existir na pasta installation_folder\Templates\Distribution\Tools\platform (onde installation_folder é a pasta na qual instalou o MDT e a plataforma é x86 para a versão de 32 bits ou x64 é para a versão de 64 bits.) Nota: Certifique-se de que a arquitetura do processador DLL corresponde à arquitetura do processador MDT instalada. Por exemplo, se instalou uma versão de 32 bits do MDT, certifique-se de que utiliza uma DLL de 32 bits para a página do assistente.
Imagem Especifica o nome de uma imagem da página que está no formato Portable Network Graphics (PNG) (O ficheiro .png tem de existir na pasta installation_folder\Bin\Images (onde installation_folder é a pasta na qual instalou o MDT.)
Tipo Especifica o editor de páginas do assistente e tem de corresponder ao nome utilizado quando a página personalizada foi registada
Comentários

O Assistente de UDI Designer utiliza o elemento Página como um modelo para criar o XML inicial para um novo assistente. O Assistente de UDI Designer efetua a validação do esquema para garantir que a Página e os elementos subordinados têm um formato válido. Este elemento fornece um mapeamento entre o tipo de página do Assistente de UDI e as informações de que o Assistente de UDI Designer precisa para editar e criar páginas deste tipo com um editor de páginas personalizado.

Exemplo

Nenhuma.

Parâmetro

Este elemento especifica um parâmetro que é transmitido para o elemento principal Tarefa ou Validador e corresponde a um elemento Setter no ficheiro de configuração do Assistente de UDI.

Observação

Os atributos para este elemento são diferentes se o elemento principal for o elemento Tarefa ou Validador .

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 principal TaskItem ou Validator
Elementos pai TaskItem, Validator
Conteúdos Qualquer conteúdo XML bem formado
Atributos do Elemento

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

Tabela 60. Atributos e Valores Correspondentes para o Elemento Param

Atributo Descrição
Descrição Especifica o texto que fornece informações sobre o parâmetro, que é apresentado no Assistente de UDI Designer Nota: este atributo é válido apenas para o elemento Validator.
DisplayName Especifica o nome amigável do parâmetro de validação, que é apresentado para a página do Assistente de UDI adequada no Assistente de UDI Designer (Este nome é normalmente mais descritivo do que o atributo Nome.) Nota: este atributo é válido apenas para o elemento Validator.
Nome Especifica o nome do parâmetro que é transmitido para a tarefa ou validador, consoante o elemento principal (este atributo tornar-se-á o atributo Propriedade num elemento Setter no ficheiro de configuração do Assistente de UDI.) Nota: Este parâmetro é utilizado para elementos principais TaskItem e Validator .
Comentários

Nenhuma.

Exemplo

Nenhuma.

Tarefa

Este elemento especifica uma tarefa na biblioteca de tarefas.

Informações sobre o elemento

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

Tabela 61. Informações do Elemento de Tarefa

Atributo Valor
Número de ocorrências Um ou mais no elemento TaskLibrary (este elemento não é opcional se o elemento TaskLibrary for especificado.)
Elementos pai TaskLibrary
Conteúdos Item de tarefa
Atributos do Elemento

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

Tabela 62. Atributos e Valores Correspondentes para o Elemento de Tarefa

Atributo Descrição
Descrição Especifica o texto que fornece informações sobre a tarefa, que é apresentada no Assistente de UDI Designer
DLL Especifica o nome do ficheiro de .dll associado à tarefa (o ficheiro .dll tem de existir na pasta installation_folder\Templates\Distribution\Tools\platform (onde installation_folder é a pasta na qual 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 é apresentada na página do Assistente de UDI adequada e no Assistente de UDI Designer
Tipo Especifica o tipo de tarefa, que está registado no registo de fábrica e utilizado para chamar uma tarefa específica num ficheiro de .dll
Comentários

Nenhuma.

Exemplo

Nenhuma.

Item de tarefa

Este elemento especifica um grupo de parâmetros que são transmitidos 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 tarefa
Elementos pai Tarefa
Conteúdos Param
Atributos do Elemento

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

Tabela 64. Atributo e Valores Correspondentes para o Elemento TaskItem

Atributo Descrição
Tipo Especifica o tipo de elemento que será criado no ficheiro de configuração do Assistente de UDI. Será criado um elemento XML que corresponde ao valor deste atributo. Por exemplo, se o valor para este atributo for Ficheiro, será criado um elemento Ficheiro no ficheiro de configuração do Assistente de UDI.

Atualmente, os únicos valores suportados são:

- Ficheiro, que requer dois elementos subordinados do Parâmetro (um elemento subordinado param com o atributo Nome definido como Origem e outro elemento subordinado param com o atributo Nome definido como Dest)
- Setter, que requer um elemento subordinado param
Comentários

Nenhuma.

Exemplo

Nenhuma.

TaskLibrary

Este elemento agrupa um conjunto de elementos de Tarefa .

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 no elemento DesignerConfig (este elemento é opcional se não existirem tarefas personalizadas na DLL que correspondam a este Assistente de UDI Designer ficheiro de configuração.)
Elementos pai DesignerConfig
Conteúdos Tarefa
Atributos do Elemento

Este 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

Este elemento especifica um validador na biblioteca de validação.

Informações sobre o elemento

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

Tabela 66. Informações do Elemento validador

Atributo Valor
Número de ocorrências Zero ou mais no elemento ValidatorLibrary (Este elemento é opcional.)
Elementos pai ValidatorLibrary
Conteúdos Param
Atributos do Elemento

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

Tabela 67. Atributos e Valores Correspondentes para o Elemento Validador

Atributo Descrição
Descrição Especifica o texto que fornece informações sobre o validador, que é apresentado no Assistente de UDI Designer
DisplayName Especifica o nome amigável do validador apresentado no Assistente de UDI Designer (Normalmente, este nome é mais descritivo do que o atributo Nome.)
DLL Especifica o nome do ficheiro de .dll associado ao validador (o ficheiro .dll tem de existir na pasta installation_folder\Templates\Distribution\Tools\platform (onde installation_folder é a pasta na qual 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 é apresentado na página do Assistente de UDI adequada e no Assistente de UDI Designer
Tipo Especifica o tipo de validador, que está registado com o fator de registo e utilizado para chamar um validador específico num ficheiro .dll
Comentários

Nenhuma.

Exemplo

Nenhuma.

ValidatorLibrary

Este 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 no elemento DesignerConfig (este elemento é opcional se não existirem validadores personalizados na DLL que correspondam a este Assistente de UDI Designer ficheiro de configuração.)
Elementos pai DesignerConfig
Conteúdos Validador
Atributos do Elemento

Este elemento não tem atributos.

Comentários

Nenhuma.

Exemplo

<DesignerConfig> + <TaskLibrary> - <ValidatorLibrary> +<Validator DLL="" Description="Requer texto num campo" Type="Microsoft.Wizard.Validation.NonEmpty" Name="NonEmpty"> +<Validator DLL="" Description="Doesn't permitir que determinados carateres estejam num campo" Type="Microsoft.Wizard.Validation.InvalidChars" Name="InvalidChars"> +<Validator DLL="" Description="Tem de seguir um padrão predefinido" Type="Microsoft.Wizard.Validation.RegEx" Name=" NamedPattern"> +<Validator DLL="" Description="Require the contents match a regular expression" Type="Microsoft.Wizard.Validation.RegEx" Name="RegEx"></ValidatorLibrary> + <DesignerMappings></DesignerConfig>

Referência de Designer do Assistente de UDI

Controles

Os controlos utilizados para criar editores de páginas de assistente personalizados para utilização no Assistente de UDI Designer são instâncias do UserControl do WPF. A Tabela 69 lista os controlos que pode utilizar para criar editores de páginas de assistente personalizados.

Tabela 69. Controlos Que Podem Ser Utilizados para Criar Editores de Páginas do Assistente Personalizado

Control Descrição
CollectionTControl Este controlo é utilizado para editar dados armazenados no elemento Dados num elemento Page .
FieldElementControl Este controlo é utilizado para editar um campo, que normalmente está ligado a um controlo de Caixa de Texto na página .xaml.
SetterControl Este controlo é utilizado para modificar o valor de um elemento setter no ficheiro de configuração do Assistente de UDI.

CollectionTControl

Este controlo fornece muitas capacidades para editar dados. A melhor forma de aprender a utilizar este controlo é ver 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 neste controlo.

FieldElementControl

Utilize este controlo para editar um campo, que normalmente está ligado a um controlo de Caixa de Texto na página .xaml.

Exemplo

O seguinte excerto de um ficheiro .xaml ilustra a utilização do FieldElementControl para configurar o valor predefinido de um campo numa página do assistente com um controlo de Caixa de Texto subordinado:

<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

Esta propriedade de cadeia contém informações para ligar o FieldElementControl ao XML subjacente do campo. A ligação é feita a uma propriedade da interface do editor de páginas. O seguinte excerto de um ficheiro .xaml ilustra a utilização da propriedade FieldData :

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

Neste excerto, a interface do editor de páginas é denominada ControloRoot e é especificada no parâmetro ElementName . O enlace é efetuado na propriedade DataContext.Location da interface do editor de páginas ControlRoot . DataContext é um modelo de vista que aponta para o elemento Página no ficheiro de configuração do Assistente de UDI. A localização é uma propriedade da vista que devolve uma lista das localizações possíveis e é definida por um elemento Dados no ficheiro de configuração do Assistente de UDI. Cada localização é definida por um elemento DataItem no ficheiro de configuração do Assistente de UDI.

HeaderText

Esta propriedade de cadeia permite-lhe especificar um cabeçalho para o controlo FieldElementControl . O cabeçalho funciona como um título para o controlo e é formatado como texto cor de laranja e negrito apresentado imediatamente acima do controlo.

InstruçãoTexto

Esta propriedade de cadeia permite-lhe especificar texto informativo para o controlo FieldElementControl . Normalmente, o texto é utilizado para fornecer uma breve descrição do campo e explicar como a configuração do campo afeta a página do assistente correspondente.

HideEnableButton

Esta propriedade Booleana permite-lhe controlar a visibilidade do botão que altera o estado entre Desbloqueado e Bloqueado (ativado ou desativado). Se estiver definido como:

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

  • Falso, o botão é visível (este é o valor predefinido.)

HideDefaultTab

Esta propriedade Booleana permite-lhe controlar a visibilidade da secção que contém o controlo utilizado para definir o valor predefinido. Embora a propriedade se refira a um separador, não existe nenhum separador no FieldElementControl , mas sim uma secção que pode ser ocultada. Se estiver definido como:

  • Verdadeiro, a secção não está visível

  • Falso, a secção é visível (este é o valor predefinido.)

HideBorder

Esta propriedade Booleana permite-lhe controlar a visibilidade do limite à volta do controlo de campo. Se estiver definido como:

  • Verdadeiro, o limite não está visível

  • Falso, o limite é visível (este é o valor predefinido.)

HideImage

Esta propriedade Booleana permite-lhe controlar a visibilidade da imagem que a propriedade FieldImageSource configura. Se estiver definido como:

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

  • Falso, a imagem é visível (este é o valor predefinido.)

HideValidationTab

Esta propriedade Booleana permite-lhe controlar a visibilidade da secção onde é gerida a lista de validadores. Embora a propriedade se refira a um separador, não existe nenhum separador no FieldElementControl , mas sim uma secção que pode ser ocultada. Se estiver definido como:

  • Verdadeiro, a secção não está visível

  • Falso, a secção é visível (este é o valor predefinido.)

HideSummaryTab

Esta propriedade Booleana permite-lhe controlar a visibilidade da secção na qual configura o resumo do campo legenda. O legenda e o valor correspondente do campo são apresentados numa página do assistente de Página Sumário, escreva um fluxo de fase. Embora a propriedade se refira a um separador, não existe nenhum separador no FieldElementControl , mas sim uma secção que pode ser ocultada. Se estiver definido como:

  • Verdadeiro, a secção não está visível

  • Falso, a secção é visível (este é o valor predefinido.)

HideTaskSequenceTab

Esta propriedade Booleana permite-lhe controlar a visibilidade da secção na qual configura a variável de sequência de tarefas que corresponde ao campo. Embora a propriedade se refira a um separador, não existe nenhum separador no FieldElementControl , mas sim uma secção que pode ser ocultada. Se estiver definido como:

  • Verdadeiro, a secção não está visível

  • Falso, a secção é visível (este é o valor predefinido.)

SetterControl

Utilize este controlo para modificar o valor de um elemento Setter no ficheiro de configuração do Assistente de UDI. Este controlo contém um controlo subordinado utilizado para modificar o valor do elemento setter .

Exemplo

O seguinte excerto de um ficheiro .xaml ilustra a utilização do SetterControl para modificar um elemento Setter denominado KeyLocationSetter através de um controlo TextBox subordinado.

<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

Tem de vincular esta propriedade a uma propriedade do modelo de vista ou vista que se liga ao setter. Fazê-lo é semelhante à forma como se vincularia a um campo, conforme descrito em FieldElementControl.

HeaderText

Esta propriedade permite-lhe definir o texto que será apresentado no cabeçalho do controlo. Pense nesta propriedade como um título para o controlo; por predefinição, aparece como texto a negrito e laranja.

InstruçãoTexto

Defina esta propriedade para o texto que pretende que seja apresentado abaixo do cabeçalho— normalmente, instrua o texto que indica ao utilizador do seu editor personalizado quando e por que motivo pretende modificar o comportamento do campo.

Interfaces

A Tabela 70 lista as interfaces que pode utilizar para criar editores de páginas de assistente personalizados.

Tabela 70. Interfaces Que Podem Ser Utilizadas para Criar Editores de Páginas do Assistente Personalizado

Interface Descrição
IDataService Utilize esta interface para ligar campos aos Elementos de dados no ficheiro de configuração do Assistente de UDI.
IMessageBoxService Esta interface fornece acesso a métodos que pode utilizar para apresentar caixas de mensagens.

IDataService

Esta interface contém várias propriedades e métodos, mas só existe uma propriedade de que gostaria de precisar. Essa propriedade é a única documentada aqui.

Pode utilizar a injeção de dependências para obter um ponteiro para esta interface com código como este na sua classe:

[Dependency]
public IDataService DataService { get; set; }
Propriedades

A Tabela 71 lista as propriedades da interface IDataService .

Tabela 71. Propriedades da Interface IDataService

Interface Descrição
CurrentPage Esta propriedade fornece acesso aos elementos, atributos e valores XML abaixo do contexto da página atual que está a ser editada no ficheiro de configuração do Assistente de UDI
CurrentPage
XElement CurrentPage { get; set; }

Esta propriedade fornece acesso ao XML da página atual. Nunca deve definir esta propriedade, mas pode modificar o XML da sua página. O editor de páginas de exemplo mostra exemplos de modificação do XML. Utiliza esta propriedade principalmente quando tem dados personalizados. Para campos e propriedades (setters), pode utilizar controlos pré-criados que tratam de todos os detalhes.

IMessageBoxService

Esta interface fornece acesso a métodos que pode utilizar para apresentar caixas de mensagens. Poderá estar a perguntar-se por que motivo precisa de uma interface para apresentar uma caixa de mensagem. A realidade é que não o faz: a Microsoft utiliza esta interface com no código, uma vez que ajuda a escrever testes automatizados para páginas de estruturador.

No entanto, a utilização destes métodos proporciona um benefício útil: as caixas de diálogo têm sempre o "proprietário" definido para o Assistente de UDI, o que garante que a caixa de diálogo está corretamente agrupada com a janela de main.

Pode utilizar a injeção de dependências para obter um ponteiro para esta interface com código como este na sua classe:

[Dependency]
public IMessageBoxService MessageBoxes { get; set; }
Métodos

A Tabela 72 lista os métodos da interface IMessageBoxService .

Tabela 72. Métodos para a Interface IMessageBoxService

Method Descrição
ShowMessageBox Este método sobrecarregado é utilizado para apresentar uma caixa de mensagem com os seguintes membros:

- ShowMessageBox(Mensagem de cadeia, legenda de cadeia, ícone MessageBoxImage)
- ShowMessageBox(mensagem de cadeia, legenda de cadeia, botão MessageBoxButton, ícone MessageBoxImage)
- ShowMessageBox(Exceção)
ShowDialogWindow Utilize este método para criar uma nova caixa de diálogo.
ShowWizardWindow Utilize este método para apresentar um editor personalizado dentro de uma caixa de diálogo que inclui os botões Seguinte e Anterior para navegação.
ShowMessageBox

Este método apresenta uma caixa de mensagem subordinada do editor de páginas do assistente personalizado. Este membro está sobrecarregado: a Tabela 73 contém uma lista dos membros e uma breve descrição de cada um. Para obter informações completas sobre cada membro (incluindo sintaxe, utilização e exemplos), consulte a secção que corresponde a cada membro.

Tabela 73. Membros Sobrecarregados para o Método ShowMessagBox

Member Descrição
ShowMessageBox(Mensagem de cadeia, legenda de cadeia, ícone MessageBoxImage) Apresenta uma caixa de mensagem com um ícone e um botão OK
ShowMessageBox(mensagem de cadeia, legenda de cadeia, botão MessageBoxButton, ícone MessageBoxImage) Apresenta uma caixa de mensagem com um ícone e diferentes combinações possíveis de botões
ShowMessageBox(Exceção) Apresenta uma caixa de mensagem que fornece informações sobre uma exceção e tem um botão OK
ShowMessageBox(Mensagem de cadeia, legenda de cadeia, ícone MessageBoxImage)
void ShowMessageBox(String message, String caption, MessageBoxImage icon);

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

Tabela 74. Parâmetros do Método ShowMessageBox(String message, String legenda, MessageBoxImage icon)

Parâmetro Descrição
message A mensagem a apresentar na área de conteúdo da caixa de mensagem
caption O texto a mostrar na barra de título da caixa de diálogo
icon O tipo de ícone a mostrar na caixa de mensagem
ShowMessageBox(mensagem de cadeia, legenda de cadeia, botão MessageBoxButton, ícone MessageBoxImage)
MessageBoxResult ShowMessageBox(string message, string caption, MessageBoxButton button, MessageBoxImage icon);

Este método apresenta uma caixa de mensagem com o conjunto de botões que pretende mostrar e comunica o botão que selecionou. Consulte a Tabela 75.

Tabela 75. Parâmetros para o Método ShowMessageBox(mensagem de cadeia, cadeia legenda, Botão MessageBoxButton, ícone MessageBoxImage)

Parâmetro Descrição
message A mensagem a apresentar na área de conteúdo da caixa de mensagem
caption O texto a mostrar na barra de título da caixa de diálogo
botão Que botões mostrar
icon O tipo de ícone a mostrar na caixa de mensagem
ShowMessageBox(Exceção)
void ShowMessageBox(Exception exception);

Este método apresenta uma caixa de mensagem que comunica informações sobre uma exceção. Esta caixa de mensagem tem um único botão OK . Consulte a Tabela 76.

Tabela 76. Parâmetros para o Método ShowMessageBox(Exceção de Exceção)

Parâmetro Descrição
exceção A exceção que pretende comunicar (a caixa de diálogo utiliza a exceção. Mensagem como conteúdo.)
ShowDialogWindow
void ShowDialogWindow(Type viewType, DialogInteraction dialogPayload);

Este método cria uma nova caixa de diálogo, cujas informações são o texto que fornece no parâmetro viewType . A Designer UDI cria uma nova instância deste tipo e encapsula-a numa caixa de diálogo com os botões OK e Cancelar.

Pode transmitir dados para o controlo com o parâmetro dialogPayload. A solução SampleEditor no diretório do SDK tem um exemplo de como utilizar esta funcionalidade.

ShowWizardWindow
void ShowWizardWindow(Type viewType, DialogInteraction dialogPayload);

Este método permite-lhe apresentar um editor personalizado dentro de uma caixa de diálogo que inclui os botões Seguinte e Anterior para navegação. A Microsoft não forneceu um exemplo sobre como utilizar este método.

Referência do Esquema do Ficheiro de Configuração do Assistente UDI

Este ficheiro é consumido pelo Assistente de UDI e configurado pelo Assistente de UDI Designer. Este ficheiro é utilizado para configurar:

  • Páginas do assistente apresentadas no Assistente de UDI

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

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

  • Grupos de Fase Disponíveis no Assistente de UDI Designer

  • Fases Disponíveis em cada assistente de implementação no Assistente de UDI Designer

    77 lista os elementos no Ficheiro de Configuração do Assistente de UDI e as respetivas descrições. O elemento Assistente é o nó raiz para esta referência.

Tabela 77. Elementos no Ficheiro de Configuração do Assistente de UDI e respetivas Descrições

Nome do elemento Descrição
Dados Agrupa os elementos DataItem individuais num elemento Página e é nomeado pelo atributo Nome .
DataItem Agrupa os elementos setter individuais num elemento Page . Pode criar dados hierárquicos ao incluir um ou mais Elementos de dados num elemento DataItem . Cada elemento DataItem representa um item individual. Por exemplo, uma lista de unidades disponíveis pode ter um DataItem para o nome a apresentar e outro elemento DataItem para a letra de unidade correspondente.
Padrão Especifica um valor predefinido para o campo especificado no elemento Principal Campo ou RadioGroup . A predefinição é definida para o valor entre parênteses retos por este elemento.
DLL Especifica uma DLL que deve ser carregada e referenciada pelo Assistente de UDI e pelo Assistente de UDI Designer.
DLLs Agrupa os elementos DLL individuais.
Erro Especifica um possível código de erro que pode ser devolvido por uma tarefa. O valor do código de erro é devolvido pelo HRESULT da tarefa e fica preso por este 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, pode especificar um asterisco (*) no atributo Value para processar códigos de retorno não listados noutros elementos 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 controlo num elemento Página que é utilizado para fornecer personalização com XML. Nem todos os controlos permitem a personalização com XML— apenas os controlos que utilizam o elemento Campo .
Fields Agrupa os elementos de Campo individuais num elemento Página .
Arquivo Especifica a origem e o destino de uma operação de cópia de ficheiros com o tipo de tarefa Microsoft.Wizard.CopyFilesTask . Pode incluir um elemento Ficheiro separado para copiar mais do que um ficheiro numa única tarefa.
Page Especifica uma instância de uma página e inclui todas as definições de configuração da página.
PageRef Especifica uma referência a uma instância de uma página numa Fase dentro de um StageGroup.
Pages Agrupa os elementos de Página individuais.
RadioGroup Especifica um grupo de botões de opção dentro de um elemento Campo .
Grupo de Fase Especifica um grupo de uma ou mais fases.
StageGroups Agrupa um conjunto de grupos de fase num ficheiro de configuração do Assistente de UDI.
Setter Especifica uma definição de propriedade de um valor para uma propriedade com o nome na propriedade Propriedade .
Etapa Especifica uma fase dentro de um StageGroup e contém um ou mais elementos PageRef .
Estilo Agrupa os elementos setter individuais que configuram o aspeto e funcionalidade do Assistente de UDI, incluindo o título apresentado na parte superior do assistente e a imagem de faixa apresentada no Assistente de UDI.
Tarefa Especifica uma tarefa que deve ser executada na página especificada no elemento Página principal.
Tarefas Agrupa um conjunto de tarefas para um elemento Página .
Validador Especifica um validador para o controlo de campo especificado no elemento Campo principal.
Assistente Especifica a raiz para todos os outros elementos.

Data

Este elemento agrupa os elementos DataItem individuais num elemento Page e é nomeado pelo atributo Nome .

Informações sobre o elemento

A Tabela 78 fornece informações sobre o elemento Dados .

Tabela 78. Informações do Elemento de Dados

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

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

Tabela 79. Atributos e Valores Correspondentes para o Elemento de Dados

Atributo Descrição
Nome Especifica o nome do elemento Dados
Comentários

O atributo Nome permite que o código obtenha um conjunto específico de dados.

Exemplo

Nenhuma.

DataItem

Este elemento agrupa os elementos setter individuais num elemento Page . Pode criar dados hierárquicos ao incluir um ou mais Elementos de dados num elemento DataItem . Cada elemento DataItem representa um item individual. Por exemplo, uma lista de unidades disponíveis pode ter um DataItem para o nome a apresentar 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 Dedados (este elemento é opcional.)
Elementos pai Dados
Conteúdos Data, Setter
Atributos do Elemento

Este elemento não tem atributos.

Comentários

Nenhuma.

Exemplo

Nenhuma.

Padrão

Este elemento especifica um valor predefinido para o campo especificado no elemento Principal Campo ou RadioGroup . A predefinição é definida para o valor entre parênteses retos deste elemento.

Informações sobre o elemento

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

Tabela 81. Informações do Elemento Predefinido

Atributo Valor
Número de ocorrências Zero ou mais dentro de um elemento Campo ou RadioGroup (este elemento é opcional.)
Elementos pai Campo, RadioGroup
Conteúdos Pode ser qualquer conteúdo XML bem formado, mas é normalmente texto padrão
Atributos do Elemento

Este elemento não tem atributos.

Comentários

Nenhuma.

Exemplo

No exemplo seguinte, a predefinição para o campo Fuso Horário está definida como "Hora Standard Pacífico":

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

DLL

Este elemento especifica uma DLL para o Assistente de UDI e o Assistente de UDI Designer carregar e referenciar.

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 no elemento DLLs
Elemento pai DLLs
Conteúdos Não é permitido conteúdo para este elemento
Atributos do Elemento

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

Tabela 83. Atributos e Valores Correspondentes para o Elemento DLL

Atributo Descrição
Nome Especifica o nome da DLL para o Assistente de UDI e o Assistente de UDI Designer a referenciar
Comentários

Nenhuma.

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

DLLs

Este elemento agrupa os elementos 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 do Elemento

Este elemento não tem atributos.

Comentários

Nenhuma.

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

Erro

Este elemento especifica um possível código de erro que uma tarefa pode devolver. O valor do código de erro é devolvido 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 Error .

Tabela 85. Informações do Elemento de Erro

Atributo Valor
Número de ocorrências Zero ou mais em cada elemento ExitCode (este elemento é opcional.)
Elementos pai ExitCodes
Conteúdos Qualquer conteúdo XML bem formado
Atributos do Elemento

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

Tabela 86. Informações do Elemento de Erro

Atributo Descrição
Estado Especifica o estado de retorno de uma tarefa que encontrou um erro. Normalmente, o valor deste atributo está definido como Erro. Este valor é apresentado na coluna Estado na página do assistente no Assistente de UDI.
Text Especifica o texto descritivo sobre a condição de erro que a tarefa encontrou.
Tipo Especifica se este elemento representa um erro, um aviso ou um êxito. O valor especificado emTipo tem de ser exclusivo dentro de um elemento ExitCodes . Seguem-se valores válidos para este elemento:

- **0.**O elemento representa um êxito.
- 1. O elemento representa um aviso.
- -1. O elemento representa um erro.
Valor Especifica o valor do código que a tarefa devolveu como um valor numérico. Especificar o valor de um asterisco (*) indica o elemento predefinido para códigos de retorno que não estão listados noutros elementos de Erro .
Comentários

Nenhuma.

Exemplo

Nenhuma.

ExitCode

Este 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, pode especificar um asterisco (*) no atributo Value para processar códigos de retorno não listados noutros elementos ExitCode .

Informações sobre o elemento

A Tabela 87 fornece informações sobre o elemento ExitCode .

Tabela 87. Informações do Elemento ExitCode

Atributo Valor
Número de ocorrências Zero ou mais em cada elemento ExitCodes (este elemento é opcional.)
Elementos pai ExitCodes
Conteúdos Pelo menos um elemento ExitCode e zero ou mais Elementos de erro
Atributos do Elemento

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

Tabela 88. Atributos e Valores Correspondentes para o Elemento ExitCode

Atributo Descrição
Estado Especifica o estado de retorno de uma tarefa. O valor deste atributo é apresentado na coluna Estado na página do assistente correspondente no Assistente de UDI. Pode utilizar quaisquer valores para este atributo que sejam relevantes para a sua tarefa. Seguem-se valores típicos utilizados para este atributo:

- Êxito
- Aviso
- Erro
Text Especifica o texto descritivo sobre o código existente da tarefa.
Tipo Especifica se este elemento representa um erro, um aviso ou um êxito. O valor especificado no tipo tem de ser exclusivo dentro de um elemento ExitCodes . Seguem-se valores válidos para este elemento:

- 0. O elemento representa um êxito.
- 1. O elemento representa um aviso.
- -1. O elemento representa um erro.
Valor Especifica o valor do código que a tarefa devolveu como um valor numérico. Especificar o valor de um asterisco (*) indica o elemento predefinido para códigos de retorno que não estão listados noutros elementos ExitCode .
Comentários

Nenhuma.

Exemplo

Nenhuma.

ExitCodes

Este 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 tarefa
Elementos pai Tarefa
Conteúdos Error, ExitCode
Atributos do Elemento

Este elemento não tem atributos.

Comentários

Nenhuma.

Exemplo

Nenhuma.

Campo

Este elemento especifica uma instância de um controlo num elemento Page utilizado para fornecer personalização com XML. Nem todos os controlos permitem a personalização com XML— apenas os controlos que utilizam o elemento Campo .

Informações sobre o elemento

A Tabela 90 fornece informações sobre o elemento Campo .

Tabela 90. Informações do Elemento de Campo

Atributo Valor
Número de ocorrências Zero ou mais em cada elemento Campo (este elemento é opcional.)
Elementos pai Fields
Conteúdos Predefinição, Validador
Atributos do Elemento

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

Tabela 91. Atributos e Valores Correspondentes para o Elemento de Campo

Atributo Descrição
Enabled Especifica se o campo está ativado para a entrada do utilizador (o atributo pode ser definido como Verdadeiro ou Falso.)
Nome Especifica o nome do campo
Resumo Especifica o texto descritivo apresentado na página do Assistente de resumo para o valor definido por este campo
VarName Especifica o nome da variável de sequência de tarefas lido ou configurado com o campo no elemento Campo principal
Comentários

Este elemento pode conter zero ou mais Elementos predefinidos e zero ou mais elementos validador .

Exemplo

Nenhuma.

Campos

Este elemento agrupa os elementos de Campo individuais num elemento Page .

Informações sobre o elemento

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

Tabela 92. Informações do Elemento campos

Atributo Valor
Número de ocorrências Zero ou mais em cada elemento Página (este elemento é opcional.)
Elementos pai Page
Conteúdos Campo, RadioGroup
Atributos do Elemento

Este elemento não tem atributos.

Comentários

Nenhuma.

Exemplo

Nenhuma.

Arquivo

Este elemento especifica a origem e o destino de uma operação de cópia de ficheiros com o tipo de tarefa Microsoft.Wizard.CopyFilesTask . Pode incluir um elemento Ficheiro separado para copiar mais do que um ficheiro numa única tarefa.

Informações sobre o elemento

A Tabela 93 fornece informações sobre o elemento Ficheiro .

Tabela 93. Informações do Elemento de Ficheiro

Atributo Valor
Número de ocorrências Uma ou mais tarefas que têm um tipo de tarefa Microsoft.Wizard.CopyFilesTask
Elementos pai Tarefa
Conteúdos Nenhum
Atributos do Elemento

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

Tabela 94. Atributos e Valores Correspondentes para o Elemento de Ficheiro

Atributo Descrição
Dest Especifica o caminho completamente qualificado ou relativo para a pasta de destino do ficheiro especificado no atributo Origem . As variáveis de ambiente são permitidas como parte do caminho.
Fonte Especifica o caminho completamente qualificado ou relativo para o ficheiro de origem que o tipo de tarefa Microsoft.Wizard.CopyFilesTask copia. Este atributo suporta carateres universais para que múltiplos ficheiros possam ser copiados com um único elemento Ficheiro . As variáveis de ambiente são permitidas como parte do caminho.
Comentários

Nenhuma.

Exemplo

Nenhuma.

Page

Este elemento especifica uma instância de uma página e inclui todas as definições de configuração da página.

Informações sobre o elemento

A Tabela 95 fornece informações sobre o elemento Página .

Tabela 95. Informações do Elemento de Página

Atributo Valor
Número de ocorrências Um ou mais elementos em cada elemento Páginas
Elementos pai Pages
Conteúdos Dados, Campos, Setter, Tarefas
Atributos do Elemento

A Tabela 96 lista os atributos do elemento Página e fornece uma descrição de cada um.

Tabela 96. Atributos e Valores Correspondentes para o Elemento de Página

Atributo Descrição
DisplayName Especifica o nome amigável do utilizador da página do assistente apresentada no assistente da UDI Designer. Normalmente, este nome é mais descritivo do que o atributo Nome .
Nome Especifica o nome da página do assistente apresentada no Assistente de UDI Designer.
Tipo Especifica o tipo de página do assistente que está diretamente relacionado com uma página de assistente específica numa DLL.
Comentários

Nenhuma.

Exemplo

Nenhuma.

PageRef

Este elemento especifica uma referência a uma instância de uma página numa Fase 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 Fase
Elementos pai Etapa
Conteúdos Nenhum
Atributos do Elemento

A Tabela 98 lista o atributo do elemento PageRef e fornece uma descrição do mesmo.

Tabela 98. Atributos e Valores Correspondentes para o Elemento PageRef

Atributo Descrição
Page Especifica a instância de uma página numa Fase num StageGroup. Defina este valor como o atributo Name de um elemento Page .
Comentários

Nenhuma.

Exemplo

Nenhuma.

Páginas

Este 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 Páginas

Atributo Valor
Número de ocorrências Um
Elementos pai Assistente
Conteúdos Page
Atributos do Elemento

Este 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

Este elemento especifica um grupo de botões de opção com num elemento Campo .

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 Campos (este elemento é opcional.)
Elementos pai Fields
Conteúdos Padrão
Atributos do Elemento

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

Tabela 101. Atributos e Valores Correspondentes para o Elemento RadioGroup

Atributo Descrição
Locked Especifica se o grupo de botões de opção está ativado para a entrada do utilizador. O atributo pode ser definido como:

- É verdade. Especifica que os botões de opção estão desativados e os utilizadores não podem selecionar um botão de opção no grupo.
- Falso. Especifica que os botões de opção estão ativados e os utilizadores podem selecionar um botão de opção no grupo.
Nome Especifica o nome do grupo de opções de rádio.
Comentários

Nenhuma.

Exemplo

Nenhuma.

Grupo de Fase

Este elemento especifica um grupo de fase de implementaçã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 do Elemento

A Tabela 103 lista os atributos do elemento StageGroup e uma descrição do atributo .

Tabela 103. Atributos e Valores Correspondentes para o Elemento StageGroup

Atributo Descrição
DisplayName Especifica o nome amigável do grupo de fase apresentado no Assistente de UDI Designer. Normalmente, este nome é mais descritivo do que o atributo Nome .
Comentários

Nenhuma.

Exemplo

Nenhuma.

StageGroups

Este elemento agrupa um conjunto de grupos de fase num ficheiro 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 do Assistente
Elementos pai Assistente
Conteúdos Grupo de Fase
Atributos do Elemento

Este elemento não tem atributos.

Comentários

Nenhuma.

Exemplo

Nenhuma.

Setter

Este elemento especifica uma definição de propriedade para o valor de uma propriedade com o nome na propriedade Propriedade .

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 em cada elemento principal (este elemento é opcional.)
Elementos pai Dados, DataItem, Página, Estilo, Tarefa, Validador
Conteúdos Contém um valor de cadeia no atributo Propriedade
Atributos do Elemento

A Tabela 106 lista o atributo do elemento Setter e fornece uma descrição do mesmo.

Tabela 106. Atributos e Valores Correspondentes para o Elemento Setter

Atributo Descrição
Propriedade Especifica o nome da propriedade que está a ser definido. O nome da propriedade é definido como o valor que este atributo tem entre parênteses retos.
Comentários

Nenhuma.

Exemplo

Nenhuma.

Estágio

Este elemento especifica uma Fase num StageGroup e contém um ou mais elementos PageRef .

Informações sobre o elemento

A Tabela 107 fornece informações sobre o elemento Fase .

Tabela 107. Informações do Elemento de Fase

Atributo Valor
Número de ocorrências Um ou mais dentro de um elemento StageGroup
Elementos pai Grupo de Fase
Conteúdos PageRef
Atributos do Elemento

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

Tabela 108. Atributos e Valores Correspondentes para o Elemento de Fase

Atributo Descrição
DisplayName Especifica o nome amigável do utilizador da página do assistente apresentada no assistente da UDI Designer. Normalmente, este nome é mais descritivo do que o atributo Nome .
Nome Especifica o nome da fase. O valor deste elemento é utilizado ao iniciar o Assistente de UDI com o parâmetro /stage: name da linha de comandos.
Comentários

Nenhuma.

Exemplo

Nenhuma.

Style

Este elemento agrupa os elementos setter individuais que configuram o aspeto e funcionalidade do Assistente de UDI, incluindo o título apresentado na parte superior do assistente e a imagem de faixa apresentada no Assistente de UDI.

Informações sobre o elemento

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

Tabela 109. Informações do Elemento de Estilo

Atributo Valor
Número de ocorrências Um
Elementos pai Assistente
Conteúdos Setter
Atributos do Elemento

Este 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

Este elemento especifica uma tarefa que deve ser executada na página especificada no elemento Página principal.

Informações sobre o elemento

A Tabela 110 fornece informações sobre o elemento Tarefa .

Tabela 110. Informações do Elemento de Tarefa

Atributo Valor
Número de ocorrências Um ou mais dentro de um elemento Tarefas
Elementos pai Tarefas
Conteúdos ExitCodes, File, Setter
Atributos do Elemento

A Tabela 111 lista os atributos do elemento Tarefa 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 deste atributo é definido como o atributo Name de outro elemento Task . Nota: Não é possível configurar este atributo com o Assistente de UDI Designer. No entanto, pode adicionar manualmente este atributo a um elemento Tarefa ao modificar diretamente o ficheiro .xml.
DisplayName Especifica o nome amigável da tarefa apresentada no Assistente de UDI Designer. Normalmente, este nome é mais descritivo do que o atributo Nome .
Nome Especifica o nome da tarefa. Este nome tem de 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

Este elemento agrupa um conjunto de tarefas para um elemento Página .

Informações sobre o elemento

A Tabela 112 fornece informações sobre o elemento Tarefas .

Tabela 112. Informações do Elemento tarefas

Atributo Valor
Número de ocorrências Zero ou um dentro de cada elemento Página (este elemento é opcional.)
Elementos pai Page
Conteúdos Tarefa
Atributos do 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 Tarefas

Atributo Descrição
NameTitle Especifica o legenda que aparece na parte superior da coluna que contém o nome das tarefas na página do assistente adequada.
StatusTitle Especifica o legenda que aparece na parte superior da coluna que contém a status das tarefas na página do assistente adequada.
Comentários

Nenhuma.

Exemplo

Nenhuma.

Validador

Este elemento especifica um validador para o controlo de campo especificado no elemento Campo principal.

Informações sobre o elemento

A Tabela 114 fornece informações sobre o elemento Validator .

Tabela 114. Informações do Elemento validador

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

A Tabela 115 lista o atributo do elemento Validator e fornece uma descrição do mesmo.

Tabela 115. Atributos e Valores Correspondentes para o Elemento Validador

Atributo Descrição
Tipo Especifica o tipo para o validador, que é definido na DLL que contém o validador
Comentários

Nenhuma.

Exemplo

Nenhuma.

Assistente

Este elemento especifica a raiz para 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 do Assistente

Atributo Valor
Número de ocorrências Um
Elementos pai Nenhum
Conteúdos DLLs, Páginas, StageGroups, Estilo
Atributos do Elemento

Este elemento não tem atributos.

Comentários

Nenhuma.

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