Partilhar via


Exemplo de criação de pacote único

O exemplo PUASample.msi é um exemplo de um pacote do Windows Installer 5.0 de dupla finalidade que pode ser instalado no contexto de instalação por usuário ou por máquina no Windows Server 2008 R2 e no Windows 7. Este pacote de exemplo segue as diretrizes de desenvolvimento descritas em Single Package Authoring.

Obtenção de uma cópia da amostra

Uma cópia deste exemplo e um editor de tabela de banco de dados do Windows Installer, Orca.exe, estão no Windows SDK Components for Windows Installer Developers. O exemplo e o editor de tabela são fornecidos com o Windows Software Development Kit para Windows Server 2008 R2 e Windows 7 como os arquivos de instalação do Windows Installer PUASample1.msi e Orca.msi.

Requisitos do sistema

O editor de banco de dados, Orca.exe, requer o Windows Server 2008 R2 e versões anteriores e o Windows 7 e versões anteriores. O pacote de dupla finalidade, PUASample1.msi, pode ser instalado no contexto de instalação por máquina ou por usuário no Windows Server 2008 R2 e no Windows 7. PUASample1.msi pode ser instalado somente no contexto por máquina no Windows Server 2008 e versões anteriores e no Windows Vista e versões anteriores. Você pode instalar o editor de banco de dados para examinar o conteúdo do PUASample1.msi sem instalar o exemplo. Para instalar os pacotes de exemplo ou de editor, certifique-se de que a política de DisableMSI não esteja definida como um valor que bloqueie as instalações de aplicativos.

Identificando um pacote Dual-Purpose

Os pacotes de dupla finalidade devem inicializar o valor da propriedade MSIINSTALLPERUSER para 1. Isso identifica o pacote como capaz de ser instalado no contexto por máquina ou por usuário no Windows Server 2008 R2 e no Windows 7. Defina a propriedade MSIINSTALLPERUSER no pacote apenas se ela tiver sido configurada seguindo as diretrizes de desenvolvimento descritas em Criação de Pacote Único e se pretender oferecer aos utilizadores a opção de instalar o pacote no modo por utilizador ou por máquina. Um pacote de dupla função também deve inicializar o valor da propriedade ALLUSERS para 2. O contexto de instalação padrão para a aplicação é especificado por utilizador. Se o valor da propriedade ALLUSERS for qualquer valor diferente de 2, o Windows Installer ignorará a propriedade MSIINSTALLPERUSER.

Use um editor de banco de dados do Windows Installer, como Orca.exe, para examinar o conteúdo do PUASample1.msi. A tabela Property no pacote de exemplo contém as duas entradas a seguir.

Tabela de Propriedade (parcial)

Propriedade Valor
TODOS OS UTILIZADORES 2
MSIINSTALLPERUSER 1

 

Caixa de diálogo personalizada para contexto de instalação

O da interface do usuário do pacote de exemplo inclui um exemplo de uma caixa de diálogo personalizada, VerifyReadyDialog, que permite aos usuários selecionar o contexto de instalação por usuário ou por máquina no momento da instalação. A tabela Dialog contém um registo que descreve a caixa de diálogo VerifyReadyDialog. O valor inserido no campo Atributos é 39 porque esta caixa de diálogo usa os bits de estilo de diálogo msidbDialogAttributesVisible (1), msidbDialogAttributesModal (2), msidbDialogAttributesMinimize (4) e msidbDialogAttributesTrackDiskSpace (32) . A barra de título da caixa de diálogo exibe um título dado pelo valor da propriedade ProductName.

Diálogo Tabela (parcial)

Caixa de diálogo HCentrando VCentering Largura Altura Atributos Título Control_First Controlo_Padrão Control_Cancel
VerifyReadyDialog 50 50 480 280 39 [Nome do produto] InstallPerUser Seguinte Cancelar

 

A tabela Control contém entradas para os controles exibidos pela caixa de diálogo VerifyReadyDialog. A caixa de diálogo exibe os controles PushButton e um controle Texto. Todos os controles usam os atributos de controle msidbControlAttributesEnabled (2) e msidbControlAttributesVisible (1) . O controlo InstallPerMachine também usa o atributo de controlo ElevationShield, msidbControlAttributesElevationShield (8388608). Este atributo de controlo adiciona o ícone de elevação do User Account Control (UAC) (ícone de escudo) ao controlo InstallPerMachine e informa o utilizador de que são necessárias as credenciais do UAC para instalar a aplicação no contexto por máquina. O valor no campo Texto da tabela Controlo é o estilo de texto e o texto exibido pelo controlo. Consulte a descrição do campo Texto no tópico Tabela de controle para obter mais informações sobre como adicionar texto a um controle usando estilos predefinidos.

Tabela de Controlo (parcial)

Dialog_ Controlo Tipo Atributo Texto Controlar_Seguinte
VerifyReadyDialog Cancelar Botão 3 {\Tahoma10}&Cancelar Seguinte
VerifyReadyDialog Anterior Botão de pressão 3 {\Tahoma10}<<&Anterior Cancelar
VerifyReadyDialog Seguinte Botão de Pressão 3 {\Tahoma10}&Próxima >> InstallPerUser
VerifyReadyDialog Texto2 Texto 3 Está pronto para concluir a instalação suspensa?
VerifyReadyDialog InstallPerUser Botão de Pressão 3 {\Tahoma10}Instalar apenas para &mim InstallPerMachine
VerifyReadyDialog InstallPerMachine Botão de Pressão 8388611 {\Tahoma10}Instalar para &todos Anterior
VerifyReadyDialog Cancelar Botão de Pressão 3 {\Tahoma10}&Cancelar Seguinte

 

A tabela ControlEvent especifica os ControlEvents, ou ações, que o instalador executa quando o utilizador interage com um controlo. Quando um utilizador ativa o botão InstallPerUser, a interface do utilizador exibe uma caixa de diálogo OutOfDisk se a propriedade OutOfDiskSpace for 1, define o valor da propriedade MSIINSTALLPERUSER como 1, define o valor da propriedade ALLUSERS como 2, define a propriedade MSIFASTINSTALL como 1 e retorna. Como a propriedade MSIFASTINSTALL está definida, nenhum ponto de restauração do sistema é gerado para a instalação. Quando um usuário ativa o botão InstallPerMachine, a interface do usuário exibe uma caixa de diálogo OutOfDisk se a propriedade OutOfDiskSpace for 1, define o valor da propriedade ALLUSERS como 1 e retorna.

ControlEvent Tabela (parcial)

Diálogo_ Controlo_ Evento Argumento Condição Encomenda
VerifyReadyDialog InstallPerUser SpawnDialog Sem espaço em disco OutOfDiskSpace = 1 1
VerifyReadyDialog InstallPerUser TerminarDiálogo Regresso OutOfDiskSpace <> 1 5
VerifyReadyDialog InstallPerUser [MSIINSTALLPERUSER] 1 1 2
VerifyReadyDialog InstallPerUser [TODOS OS UTILIZADORES] 2 1 3
VerifyReadyDialog InstallPerMachine SpawnDialog Sem espaço no disco OutOfDiskSpace = 1 1
VerifyReadyDialog InstallPerMachine FinalizarDiálogo Regresso OutOfDiskSpace <> 1 3
VerifyReadyDialog InstallPerMachine [TODOS OS UTILIZADORES] 1 1 2
VerifyReadyDialog InstallPerUser [MSIFASTINSTALL] 1 1 4

 

O controle InstallPerUser deve ser removido da interface do usuário de qualquer instalação usando uma versão do Windows Installer anterior ao Windows Installer Windows Installer 5.0. A tabela ControlCondition no pacote de exemplo contém quatro entradas que desabilitam e ocultam o controle InstallPerUser se a versão atual for menor que o Windows Installer 5.0. A tabela usa o valor da propriedade VersionMsi e a sintaxe da instrução condicional para definir esta condição. A ação especificada no campo Ação é executada somente se a instrução no campo Condição for verdadeira.

Tabela (parcial) ControlCondition

Diálogo_ Controlo_ Ação Condição
VerifyReadyDialog InstallPerUser Ativar VersionMsi >= "5.00"
VerifyReadyDialog InstallPerUser Desativar VersionMsi < "5.00"
VerifyReadyDialog InstallPerUser Programa VersionMsi >= "5.00"
VerifyReadyDialog InstallPerUser Ocultar VersionMsi < "5.00"

 

Definindo a Estrutura de Diretórios

Use o editor de base de dados para examinar a tabela de Diretório de PUASample1.msi. O registro da Tabela de Diretórios com uma cadeia de caracteres vazia em seu campo Directory_Parent representa o diretório raiz das árvores de diretório de origem e de destino. Se a propriedade TARGETDIR estiver indefinida, o instalador definirá seu valor no momento da instalação para o valor da propriedade ROOTDRIVE. Se a propriedade SourceDir estiver indefinida, o instalador definirá seu valor para o local do diretório que contém o pacote do Windows Installer (arquivo.msi). Os nomes dos diretórios são especificados usando o formato short|long.

Diretório Tabela (parcial)

Diretório Diretório_Pai DefaultDir
TARGETDIR SourceDir
ProgramFilesFolder TARGETDIR .
ProgramMenuFolder TARGETDIR .
LOCAL DE INSTALAÇÃO Meu fornecedor Amostra1|MSDN-PUASample1
Meu fornecedor ProgramFilesFolder Msft|Microsoft

 

Na origem, esta tabela de diretório é resolvida para os seguintes caminhos de diretório.

\[SourceDir\]\\Msft\\Sample1 \[SourceDir\]

No destino, a tabela Directory resolve para os caminhos na tabela a seguir. O instalador define os valores das propriedades ProgramFilesFolder e ProgramMenuFolder para locais que dependem do contexto de instalação e se o sistema é das versões de 32-bit ou 64-bit do Windows Server 2008 R2 e Windows 7. Os caminhos para as pastas de destino dependem se o usuário seleciona uma instalação por usuário ou por máquina.

Contexto de instalação Sistema Caminhos de exemplo
Per-Machine Windows Server 2008 R2 e Windows 7
Versão de 32 bits
%ProgramFiles%\Msft\Sample1
%ALLUSERSPROFILE%\Microsoft\Windows\Menu Iniciar\Programas
Per-Machine Windows Server 2008 R2 e Windows 7
Versão de 64 bits
%ProgramFiles(x86)%\Msft\Sample1
%ALLUSERSPROFILE%\Microsoft\Windows\Menu Iniciar\Programas
Per-User Windows Server 2008 R2 e Windows 7
Versão de 32 bits ou 64 bits
%USERPROFILE%\AppData\Local\Programs\Msft\Sample1
%APPDATA%\Microsoft\Windows\Menu Iniciar\Programas

 

As aplicações por utilizador devem ser armazenadas em subpastas na pasta Programas, conforme especificada pelo valor da propriedade ProgramFilesFolder . Normalmente, o caminho para o aplicativo assume a seguinte forma.

%LOCALAPPDATA%\Programs\nome ISV\AppName.

Os dados de configuração por usuário devem ser armazenados na pasta Programas especificada pelo valor da propriedadeProgramMenuFolder. Normalmente, essa pasta está localizada no caminho a seguir.

%APPDATA%\Microsoft\Windows\Menu Iniciar\Programas

Se estiver instalando Pacote do Windows Installer de 32 bits componentes, use oProgramFilesFolder e propriedade CommonFilesFolder na tabela Directory. Se estiver instalando pacote do Windows Installer de 64 bits componentes, use o ProgramFiles64Folder e CommonFiles64Folder propriedades. Se o seu aplicativo contiver versões de 32 bits e 64 bits do mesmo componente, com o mesmo nome, certifique-se de que essas versões sejam salvas em diretórios diferentes ou dê a eles nomes diferentes.

A tabela Directory a seguir fornece um exemplo de um layout de diretório compatível com um pacote que inclui componentes de 32 bits e 64 bits e inclui alguns componentes que são compartilhados entre aplicativos.

Diretório Diretório_Pai DefaultDir
TARGETDIR SourceDir
ProgramFilesFolder TARGETDIR .:Prog32
Pasta de Programas (x64) TARGETDIR .:Prog64
CommonFilesFolder TARGETDIR .:Partilha32
FicheirosComuns64Pasta TARGETDIR .:Partilha64
ProgramMenuFolder TARGETDIR .:Amostra1|MSDN-PUASample1
LOCAL DE INSTALAÇÃO Meu fornecedor Amostra1|MSDN-PUASample1
INSTALLLOCATIONX64 Vendedorx64 Amostra1|MSDN-PUASample1
LOCALIZAÇÃO PARTILHADA ShVendor Amostra1|MSDN-PUASample1
SHAREDLOCATIONX64 ShVendorx64 Amostra1|MSDN-PUASample1
Meu fornecedor ProgramFilesFolder Msft|Microsoft
Vendedorx64 Pasta de Ficheiros de Programas (64 bits) Msft|Microsoft
ShVendor CommonFilesFolder Msft|Microsoft
ShVendorx64 PastaFicheirosComuns64 Msft|A Microsoft
Shrx86 LOCALIZAÇÃO PARTILHADA Componentes x32|32-bit
Shrx64 SHAREDLOCATIONX64 Componentes x64|64-bit
Binx86 LOCAL DE INSTALAÇÃO Componentes x32|32-bit
Binx64 INSTALLLOCATIONX64 Componentes x64 | 64 bits
App32 Binx86 myapp|componentes de 32 bits não compartilhados
App64 Binx64 myapp|componentes de 64 bits não compartilhados
Partilhar 32 Shrx86 componentes de 32 bits compartilhados|compartilhados
Partilha64 Shrx64 componentes de 64 bits compartilhados|compartilhados

 

Na origem, esta tabela de diretório é resolvida para os seguintes caminhos de diretório.

\[SourceDir\]Prog32\\Msft\\Sample1\\x32\\myapp \[SourceDir\]Share32\\Common Files\\Msft\\Sample1\\x32\\shared \[SourceDir\]Prog64\\Msft\\Sample1\\x64\\myapp \[SourceDir\]Share64\\Common Files\\Msft\\Sample1\\x64\\shared \[SourceDir\]Sample1

No destino, essa tabela de diretório é resolvida para os seguintes caminhos de diretório. Os caminhos de destino dependem do contexto de instalação e do sistema.

Contexto de instalação Sistema Caminhos de exemplo
Per-Machine Windows Server 2008 R2 e Windows 7
Versão de 32 bits
%ProgramFiles%\Msft\Sample1\x32\myapp
%ProgramFiles%\Common Files\Msft\Sample1\x32\shared
%ProgramFiles(x86)%\Msft\Sample1\x64\myapp
%ProgramFiles(x86)%\Common Files\Msft\Sample1\x64\shared
%ProgramData%\Microsoft\Windows\Menu Iniciar\Programas\Exemplo1
Per-Machine Windows Server 2008 R2 e Windows 7
Versão de 64 bits
%ProgramFiles(x86)%\Msft\Sample1\x32\myapp
%ProgramFiles(x86)%\Common Files\Msft\Sample1\x32\shared
%ProgramFiles%\Msft\Sample1\x64\myapp
%ProgramFiles%\Common Files\Msft\Sample1\x64\shared
%ProgramData%\Microsoft\Windows\Menu Iniciar\Programas\Exemplo1
Per-User Windows Server 2008 R2 e Windows 7
Versão de 32 bits ou 64 bits
%LOCALAPPDATA%\Programas\Msft\Sample1\x32\myapp
%LOCALAPPDATA%\Programas\Common\Msft\Sample1\x32\shared
%LOCALAPPDATA%\Programas\Msft\Sample1\x64\myapp
%LOCALAPPDATA%\Programas\Comum\Msft\Sample1\x64\shared
%APPDATA%\Microsoft\Windows\Menu Iniciar\Programas\Exemplo1

 

Registo de Candidaturas

O PUASample.msi adiciona uma subchave à chave de registo dos caminhos da aplicação para o aplicativo e executa registos que permitem que as informações da aplicação sejam guardadas no registo sob esta chave. Para obter mais informações sobre caminhos de aplicativo e registro de aplicativo, consulte o PerceivedTypes, SystemFileAssociations e de registro de aplicativo na seção de extensibilidade do shell do Guia do desenvolvedor do Shell. No momento da instalação, o usuário toma a decisão de instalar o aplicativo no contexto de instalação por usuário ou por máquina. No momento em que o pacote de dupla finalidade é criado, o desenvolvedor do pacote não pode saber se os registros devem ser realizados sob as chaves HKEY_LOCAL_MACHINE ou HKEY_CURRENT_USER.

O desenvolvedor do pacote define o identificador de arquivo para o arquivo executável do aplicativo no campo Arquivo da Tabela de Arquivos .

Ficheiro Tabela (parcial)

Ficheiro Componente_ Nome do arquivo Tamanho do arquivo Versão Idioma Atributos Sequência
MyAppFile Componente do Produto PUASAMP1.EXE|PUASample1.exe 81920 0 1

 

Os valores a serem salvos no Registro da tabela podem ser especificados no campo Valor como uma cadeia formatada de . Use o identificador de arquivo definido no campo Arquivo da tabela File e a convenção [#filekey] do tipo Formatted para especificar o valor padrão para a chave do Registro App Paths. A ação de nível superior INSTALL executa as ações na tabela InstallExecuteSequence. Após a conclusão das ações CostInitialize, FileCoste InstallFinalize nesta tabela, o Windows Installer substitui a substring formatada [#MyAppFile] na tabela do Registro pelo caminho completo para o arquivo do aplicativo.

O exemplo define uma propriedade personalizada, RegRoot, para conter o local da chave raiz e usa uma ação personalizada para redefinir o valor da propriedade se o usuário escolher uma instalação por máquina. Use a propriedade personalizada, RegRoot, em qualquer valor de cadeia de caracteres formatada que faça referência ao local da raiz. Na tabela Property, o pacote PUASample.msi define a propriedade personalizada e define o valor de RegRoot como HKCU. Isso inicializa o valor da propriedade para o contexto de instalação por usuário, o contexto padrão recomendado para pacotes de dupla finalidade.

Tabela de Propriedades (parcial)

Propriedade Valor
RegRoot HKCU

 

Na tabela CustomAction, o pacote define uma ação personalizada chamada set_RegRoot_HKLM. O valor no campo Tipo identifica isso como uma ação personalizada Tipo 51 ação personalizada padrão. O significado dos campos Origem e Destino na tabela CustomAction depende do tipo de ação personalizada. Para obter mais informações sobre os tipos padrão de ações personalizadas, consulte Custom Action Types. O campo Source para a ação personalizada Set_RegRoot_HKLM especifica o valor da propriedade RegRoot. Se o instalador executar a set_RegRoot_HKLM ação personalizada, isso redefinirá o valor da propriedade RegRoot como HKLM.

Tabela de Ação Personalizada (parcial)

Ação Tipo Fonte Público-alvo
Set_RegRoot_HKLM 51 [RegRoot] HKLM

 

A ação de nível superior INSTALL executa as ações na tabela InstallExecuteSequence, na sequência especificada no campo Sequence dessa tabela. O valor criado no campo Sequência para a ação personalizada set_RegRoot_HKLM (1501) especifica que essa ação personalizada seja executada após a ação InstallInitialize (1500) e antes da ação ProcessComponents (1600). Essa sequência garante que o registro para a ação personalizada set_RegRoot_HKLM seja avaliado no momento da instalação. Para obter mais informações sobre a sequência recomendada de ações na tabela InstallExecuteSequence, consulte o tópico Suggested InstallExecuteSequence . A sintaxe da instrução condicional criada no campo Condição especifica que a ação Set_RegRoot_HKLM seja executada somente se o valor da propriedade ALLUSERS for avaliado como 1 no momento da instalação. Um ALLUSERS valor de propriedade de 1 especifica uma instalação por máquina.

Tabela de InstallExecuteSequence (parcial)

Ação Condição Sequência
Set_RegRoot_HKLM TODOS OS UTILIZADORES=1 1501

 

Os registros a seguir na tabela do Registro do executam os registros se o componente ProductComponent estiver instalado. O valor -1 no campo Raiz é necessário para executar o registro em HKEY_LOCAL_MACHINE para uma instalação por usuário e em HKEY_CURRENT_USER para uma instalação por usuário. O registro com uma cadeia de caracteres vazia no campo Registro adiciona uma subchave para o aplicativo sob a chave do Registro AppPaths e define o valor "(Default)" para o caminho completo do arquivo executável do aplicativo. O registro MyAppPathAlias mapeia o arquivo executável para um alias de aplicativo e permite que o aplicativo seja iniciado se o usuário digitar o alias "puapct" em um prompt de linha de comando. O registro MyAppPathRegistration mapeia o nome do arquivo executável para o caminho completo do arquivo.

Registo Raiz Chave Nome Valor Componente
-1 Software\Microsoft\MyAppPathRegistrationLocation [RegRoot]\Software\Microsoft\Windows\CurrentVersion\App Paths\PUAPCT.exe Componente de Produto
MyAppPathAlias -1 Software\Microsoft\Windows\CurrentVersion\App Paths\PUAPCT.exe [#MyAppFile] Componente do Produto
MyAppPathRegistration -1 Software\Microsoft\Windows\CurrentVersion\App Paths\PUASample1.exe [#MyAppFile] Componente do Produto

 

Reprodução Automática Cancelar Registo

O PUASample.msi realiza registos que permitem ao utilizador da aplicação impedir que a Reprodução Automática de Hardware seja iniciada para dispositivos selecionados. Para obter informações sobre como registar um manipulador para cancelar a Reprodução Automática em resposta a um evento, consulte o tópico Preparação de Hardware e Software para Utilização com a Reprodução Automática na seção Extensibilidade do Shell do Guia do Desenvolvedor do Shell . O registro a seguir registra o manipulador especificado no campo Name quando o componente ProductComponent é instalado. O valor -1 no campo Raiz é necessário para especificar ao Windows Installer que o registro deve ser redirecionado para um local que depende do contexto de instalação.

Tabela de Registo

Registo Raiz Chave Nome Valor Componente
CancelamentoDaInscriçãoDeAutoplay -1 SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers\CancelAutoplay\CLSID 66A32FE6-229D-427b-A608-D273F40C034C Componente de Produto

 

Registo do Manipulador de Pré-visualização

O PUASample.msi executa os registos necessários para instalar um manipulador de visualização que permite uma visualização somente leitura de ficheiros .pua sem iniciar a aplicação. Para obter informações sobre como registrar manipuladores de visualização, consulte o tópico Registrando manipuladores de visualização na seção de extensibilidade do shell do Guia do desenvolvedor do Shell. Os registros a seguir na tabela Registry registram o manipulador quando o componente ProductComponent é instalado. O valor -1 no campo Raiz é necessário para especificar ao Windows Installer que o registro deve ser redirecionado para um local que depende do contexto de instalação.

Tabela do Registo

Registo Raiz Chave Nome Valor Componente
MyPreviewHandlerRegistration1 -1 Software\Classes\.pua puafile Componente do Produto
MyPreviewHandlerRegistration2 -1 Software\Microsoft\Windows\CurrentVersion\PreviewHandlers {1531d583-8375-4d3f-b5fb-d23bbd169f22} Gestor de Pré-visualização PUA TEST do Microsoft Windows Componente de Produto
MyPreviewHandlerRegistration3 -1 Software\Classes\puafile\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f} {1531d583-8375-4d3f-b5fb-d23bbd169f22} Componente do Produto
MyPreviewHandlerRegistration4 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22} Per-User Application Exemplo 1 Manipulador de Pré-visualização Componente do Produto
MyPreviewHandlerRegistration5 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22} ID do aplicativo {6d2b5079-2f0b-48dd-ab7f-97cec514d30b} Componente do Produto
MyPreviewHandlerRegistration6 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22} Nome de Exibição @shell32,-38242 Componente do Produto
MyPreviewHandlerRegistration7 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22} Ícone notepad.exe,2 Componente do Produto
MyPreviewHandlerRegistration8 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22}\InProcServer32 ThreadingModel Apartamento ComponenteDoProduto
MyPreviewHandlerRegistration9 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22}\InProcServer32 #%%SystemRoot%\system32\shell32.dll Componente de Produto
MyPreviewHandlerRegistration10 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22}\InProcServer32 ProgID puafile Componente do Produto