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 de cada usuário ou computador no Windows Server 2008 R2 e no Windows 7. Este pacote de exemplo segue as diretrizes de desenvolvimento descritas em Criação de Pacote Único.
Obtendo uma cópia do exemplo
Uma cópia deste exemplo e um editor de tabela de banco de dados do Windows Installer, Orca.exe, estão nos Componentes do SDK do Windows para Desenvolvedores do Windows Installer. O editor de exemplo e tabela é fornecido com o Kit de Desenvolvimento de Software do Windows para Windows Server 2008 R2 e o 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 anteriores e o Windows 7 e anteriores. O pacote de dupla finalidade, PUASample1.msi, pode ser instalado no contexto de instalação de cada computador ou usuário no Windows Server 2008 R2 e no Windows 7. PUASample1.msi só pode ser instalado no contexto de cada computador no Windows Server 2008 e anterior e no Windows Vista e 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 editor, verifique se a política DisableMSI não está definida como um valor que bloqueia as instalações do aplicativo.
Identificando um pacote de dupla finalidade
Pacotes de dupla finalidade devem inicializar o valor da propriedade MSIINSTALLPERUSER como 1. Isso identifica o pacote como possível de ser instalado no contexto de cada computador ou usuário no Windows Server 2008 R2 e no Windows 7. Defina a propriedade MSIINSTALLPERUSER no pacote somente se ela tiver sido gravada seguindo as diretrizes de desenvolvimento descritas em Criação de Pacote Único e se você pretende fornecer aos usuários a opção de instalar o pacote no contexto de cada usuário ou computador. Um pacote de dupla finalidade também deve inicializar o valor da propriedade ALLUSERS como 2. Isso especifica cada usuário como o contexto de instalação padrão para o aplicativo. Se o valor da propriedade ALLUSERS for um 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 de PUASample1.msi. A tabela Property no pacote de exemplo contém as duas entradas a seguir.
Tabela Property (parcial)
Propriedade | Valor |
---|---|
ALLUSERS | 2 |
MSIINSTALLPERUSER | 1 |
Caixa de Diálogo personalizada para Contexto de Instalação
A interface do usuário do pacote de exemplo inclui um exemplo de uma caixa de diálogo personalizada, VerifyReadyDialog, que permite que os usuários selecionem o contexto de instalação de cada usuário ou computador no momento da instalação. A tabela Dialog contém um registro que descreve a caixa de diálogo VerifyReadyDialog. O valor inserido no campo Atributos é 39 porque essa caixa de diálogo usa os bits de estilo de diálogomsidbDialogAttributesVisible (1), msidbDialogAttributesModal (2), msidbDialogAttributesMinimize (4) e msidbDialogAttributesTrackDiskSpace (32). A barra de título da caixa de diálogo exibe um título fornecido pelo valor da propriedade ProductName.
Tabela Dialog (parcial)
caixa de diálogo | HCentering | VCentering | Largura | Altura | Atributos | Título | Control_First | Control_Default | Control_Cancel |
---|---|---|---|---|---|---|---|---|---|
VerifyReadyDialog | 50 | 50 | 480 | 280 | 39 | [ProductName] | InstallPerUser | Avançar | Cancelar |
A tabela Control contém entradas para os controles exibidos pela caixa de diálogo VerifyReadyDialog. A caixa de diálogo exibe controles PushButton e um controle Text. Todos os controles usam os atributos de controlemsidbControlAttributesEnabled (2) e msidbControlAttributesVisible (1). O controle InstallPerMachine também usa o atributo de controle ElevationShield, msidbControlAttributesElevationShield (8388608.) Esse atributo de controle adiciona o ícone de elevação (ícone de escudo) do UAC (Controle de Conta de Usuário) ao controle InstallPerMachine e informa ao usuário que as credenciais do UAC são necessárias para instalar o aplicativo no contexto de cada computador. O valor no campo Text da tabela Control é o estilo de texto e o texto exibidos pelo controle. Confira a descrição do campo Text no tópico Tabela Contorl para obter mais informações sobre como adicionar texto a um controle usando estilos predefinidos.
Tabela Control (parcial)
Dialog_ | Control | Tipo | Atributo | Texto | Control_Next |
---|---|---|---|---|---|
VerifyReadyDialog | Cancelar | PushButton | 3 | {\Tahoma10}&Cancel | Avançar |
VerifyReadyDialog | Anterior | PushButton | 3 | {\Tahoma10}<<&Previous | Cancelar |
VerifyReadyDialog | Avançar | PushButton | 3 | {\Tahoma10}&Avançar >> | InstallPerUser |
VerifyReadyDialog | Text2 | Texto | 3 | Você está pronto para concluir sua instalação suspensa? | |
VerifyReadyDialog | InstallPerUser | PushButton | 3 | {\Tahoma10}Instalar somente para &mim | InstallPerMachine |
VerifyReadyDialog | InstallPerMachine | PushButton | 8388611 | {\Tahoma10}Instalar para &Todos | Anterior |
VerifyReadyDialog | Cancelar | PushButton | 3 | {\Tahoma10}&Cancel | Avançar |
A tabela ControlEvent especifica o ControlEvents, ou as ações, que o instalador executa quando o usuário interage com um controle. Quando um usuário ativa o botão InstallPerUser, a interface do usuário 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.
Tabela ControlEvent (parcial)
Dialog_ | Control_ | Evento | Argumento | Condição | Order |
---|---|---|---|---|---|
VerifyReadyDialog | InstallPerUser | SpawnDialog | OutOfDisk | OutOfDiskSpace = 1 | 1 |
VerifyReadyDialog | InstallPerUser | EndDialog | Retorno | OutOfDiskSpace <> 1 | 5 |
VerifyReadyDialog | InstallPerUser | [MSIINSTALLPERUSER] | 1 | 1 | 2 |
VerifyReadyDialog | InstallPerUser | [ALLUSERS] | 2 | 1 | 3 |
VerifyReadyDialog | InstallPerMachine | SpawnDialog | OutOfDisk | OutOfDiskSpace = 1 | 1 |
VerifyReadyDialog | InstallPerMachine | EndDialog | Retorno | OutOfDiskSpace <> 1 | 3 |
VerifyReadyDialog | InstallPerMachine | [ALLUSERS] | 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 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 é menor que o Windows Installer 5.0. A tabela usa o valor da propriedade VersionMsi e a sintaxe da instrução condicional para definir essa condição. A ação especificada no campo Action será executada somente se a instrução no campo Condition for verdadeira.
Tabela ControlCondition (parcial)
Dialog_ | Control_ | Ação | Condição |
---|---|---|---|
VerifyReadyDialog | InstallPerUser | Habilitar | VersionMsi >= "5.00" |
VerifyReadyDialog | InstallPerUser | Desabilitar | VersionMsi < "5.00" |
VerifyReadyDialog | InstallPerUser | Mostrar | VersionMsi >= "5.00" |
VerifyReadyDialog | InstallPerUser | Ocultar | VersionMsi < "5.00" |
Como especificar a estrutura de diretório
Use o editor de banco de dados para examinar a tabela Directory do PUASample1.msi. O registro da tabela Directory 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 for indefinida, o instalador definirá seu valor no momento da instalação como o valor da propriedade ROOTDRIVE. Se a propriedade SourceDir for indefinida, o instalador definirá seu valor como o local do diretório que contém o pacote do Windows Installer (arquivo .msi). Os nomes de diretório são especificados usando o formato curto|longo.
Tabela Directory (parcial)
Diretório | Directory_Parent | DefaultDir |
---|---|---|
TARGETDIR | SourceDir | |
ProgramFilesFolder | TARGETDIR | . |
ProgramMenuFolder | TARGETDIR | . |
INSTALLLOCATION | MyVendor | Sample1|MSDN-PUASample1 |
MyVendor | ProgramFilesFolder | Msft|Microsoft |
Na origem, essa tabela Directory é resolvida para os caminhos de diretório a seguir.
- \[SourceDir\]\\Msft\\Sample1 \[SourceDir\]
No destino, a tabela Directory é resolvida para os caminhos na tabela a seguir. O instalador define os valores das propriedades ProgramFilesFolder e ProgramMenuFolder como locais que dependem do contexto de instalação e dependendo de o sistema ser versões de 32 ou 64 bits do Windows Server 2008 R2 e do Windows 7. Os caminhos para as pastas de destino dependem de o usuário selecionar uma instalação em cada usuário ou computador.
Contexto de instalação | Sistema | Caminhos de exemplo |
---|---|---|
Por computador | Windows Server 2008 R2 e Windows 7 Versão de 32 bits |
%ProgramFiles%\Msft\Sample1 %ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs |
Por computador | Windows Server 2008 R2 e Windows 7 Versão de 64 bits |
%ProgramFiles(x86)%\Msft\Sample1 %ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs |
Por Usuário | Windows Server 2008 R2 e Windows 7 Versão de 32 bits ou 64 bits |
%USERPROFILE%\AppData\Local\Programs\Msft\Sample1 %APPDATA%\Microsoft\Windows\Start Menu\Programs |
Os aplicativos de cada usuário devem ser armazenados em subpastas na pasta Programas especificada pelo valor da propriedade ProgramFilesFolder. Normalmente, o caminho para o aplicativo assume a forma a seguir.
%LOCALAPPDATA%\Programs\ISV name\AppName.
Os dados de configuração de cada usuário devem ser armazenados na pasta Programas especificada pelo valor da propriedade ProgramMenuFolder. Normalmente, essa pasta está localizada no caminho a seguir.
%APPDATA%\Microsoft\Windows\Start Menu\Programs
Se estiver instalando componentes do Pacote do Windows Installer de 32 bits, use a propriedade ProgramFilesFolder e CommonFilesFolder na tabela Directory. Se estiver instalando componentes do Pacote do Windows Installer de 64 bits, use as propriedades ProgramFiles64Folder e CommonFiles64Folder. Se o aplicativo contiver versões de 32 bits e 64 bits do mesmo componente, com o mesmo nome, faça com que essas versões sejam salvas em diretórios diferentes ou forneça 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 | Directory_Parent | DefaultDir |
---|---|---|
TARGETDIR | SourceDir | |
ProgramFilesFolder | TARGETDIR | .:Prog32 |
ProgramFiles64Folder | TARGETDIR | .:Prog64 |
CommonFilesFolder | TARGETDIR | .:Share32 |
CommonFiles64Folder | TARGETDIR | .:Share64 |
ProgramMenuFolder | TARGETDIR | .:Sample1|MSDN-PUASample1 |
INSTALLLOCATION | MyVendor | Sample1|MSDN-PUASample1 |
INSTALLLOCATIONX64 | Vendorx64 | Sample1|MSDN-PUASample1 |
SHAREDLOCATION | ShVendor | Sample1|MSDN-PUASample1 |
SHAREDLOCATIONX64 | ShVendorx64 | Sample1|MSDN-PUASample1 |
MyVendor | ProgramFilesFolder | Msft|Microsoft |
Vendorx64 | ProgramFiles64Folder | Msft|Microsoft |
ShVendor | CommonFilesFolder | Msft|Microsoft |
ShVendorx64 | CommonFiles64Folder | Msft|Microsoft |
Shrx86 | SHAREDLOCATION | x32| componentes de 32 bits |
Shrx64 | SHAREDLOCATIONX64 | x64| componentes de 64 bits |
Binx86 | INSTALLLOCATION | x32| componentes de 32 bits |
Binx64 | INSTALLLOCATIONX64 | x64| componentes de 64 bits |
App32 | Binx86 | myapp|componentes de 32 bits não compartilhados |
App64 | Binx64 | myapp|componentes de 64 bits não compartilhados |
Share32 | Shrx86 | shared | componentes de 32 bits compartilhados |
Share64 | Shrx64 | shared | componentes de 64 bits compartilhados |
Na origem, essa tabela Directory é resolvida para os caminhos de diretório a seguir.
- \[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 Directory é resolvida para os caminhos de diretório a seguir. Os caminhos de destino dependem do contexto de instalação e do sistema.
Contexto de instalação | Sistema | Caminhos de exemplo |
---|---|---|
Por computador | 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\Start Menu\Programs\Sample1 |
Por computador | 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\Start Menu\Programs\Sample1 |
Por Usuário | Windows Server 2008 R2 e Windows 7 Versão de 32 bits ou 64 bits |
%LOCALAPPDATA%\Programs\Msft\Sample1\x32\myapp %LOCALAPPDATA%\Programs\Common\Msft\Sample1\x32\shared %LOCALAPPDATA%\Programs\Msft\Sample1\x64\myapp %LOCALAPPDATA%\Programs\Common\Msft\Sample1\x64\shared %APPDATA%\Microsoft\Windows\Start Menu\Programs\Sample1 |
Registro de aplicativo
O PUASample.msi adiciona uma subchave à chave do registro de Caminhos do Aplicativo para o aplicativo e executa registros que permitem que as informações do aplicativo sejam salvas no registro nessa chave. Para obter mais informações sobre caminhos de aplicativo e registro de aplicativo, confira a seção PerceivedTypes, SystemFileAssociations e Registro de Aplicativo na seção 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 de cada usuário ou computador. No momento em que o pacote de dupla finalidade é criado, o desenvolvedor do pacote não pode saber se os registros devem ser executados nas 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 File da Tabela File.
Tabela File (parcial)
Arquivo | Component_ | FileName | FileSize | Versão | Idioma | Atributos | Sequência |
---|---|---|---|---|---|---|---|
MyAppFile | ProductComponent | PUASAMP1.EXE|PUASample1.exe | 81920 | 0 | 1 |
Os valores a serem salvos no registro podem ser especificados no campo Value da tabela Registry como uma cadeia de caracteres Formatada. Use o identificador de arquivo definido no campo File da tabela File e a convenção [#filekey] do tipo Formatado a fim de especificar o valor padrão para a chave do registro Caminhos do Aplicativo. A ação INSTALL de nível superior executa as ações na tabela InstallExecuteSequence. Depois que as ações CostInitialize, FileCost e InstallFinalize nessa tabela forem concluídas, o Windows Installer substituirá a subcadeia de caracteres formatada [#MyAppFile] na tabela Registry pelo caminho completo para o arquivo de 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 em cada computador. Use a propriedade personalizada RegRoot em qualquer valor de cadeia de caracteres formatada que referencie o local 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 de cada usuário, o contexto padrão recomendado para pacotes de dupla finalidade.
Tabela Property (parcial)
Propriedade | Valor |
---|---|
RegRoot | HKCU |
Na tabela CustomAction, o pacote define uma ação personalizada chamada Set_RegRoot_HKLM. O valor no campo Type identifica isso como uma ação personalizada padrão Custom Action Type 51. O significado dos campos Source e Target na tabela CustomAction depende do tipo de ação personalizada. Para obter mais informações sobre os tipos padrão de ações personalizadas, confira Tipos de ação personalizada. O campo Source da ação personalizada Set_RegRoot_HKLM especifica o valor da propriedade RegRoot. Se o instalador executar a ação personalizada Set_RegRoot_HKLM, o valor da propriedade RegRoot será definido como HKLM.
Tabela CustomAction (parcial)
Ação | Tipo | Fonte | Destino |
---|---|---|---|
Set_RegRoot_HKLM | 51 | [RegRoot] | HKLM |
A ação INSTALL de nível superior executa as ações na tabela InstallExecuteSequence, na sequência especificada no campo Sequence dessa tabela. O valor criado no campo Sequence para a ação personalizada Set_RegRoot_HKLM (1501) especifica que essa ação personalizada será executada após a ação InstallInitialize (1500) e antes da ação ProcessComponents (1600). Essa sequência faz com que o registro da 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, confira o tópico InstallExecuteSequence sugerido. A sintaxe de instrução condicional criada no campo Condition 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 valor de propriedade ALLUSERS de 1 especifica uma instalação em cada computador.
Tabela InstallExecuteSequence (parcial)
Ação | Condição | Sequência |
---|---|---|
Set_RegRoot_HKLM | ALLUSERS=1 | 1501 |
Os registros a seguir na tabela Registry executam os registros se o componente ProductComponent estiver instalado. O valor -1 no campo Raiz é obrigatório para executar o registro em HKEY_LOCAL_MACHINE para uma instalação em cada usuário e em HKEY_CURRENT_USER para uma instalação em cada usuário. O registro com uma cadeia de caracteres vazia no campo Registry adiciona uma subchave para o aplicativo na chave do Registro AppPaths e define o valor "(Default)" como 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.
Registro | Root | Chave | Nome | Valor | Componente |
---|---|---|---|---|---|
-1 | Software\Microsoft\MyAppPathRegistrationLocation | [RegRoot]\Software\Microsoft\Windows\CurrentVersion\App Paths\PUAPCT.exe | ProductComponent | ||
MyAppPathAlias | -1 | Software\Microsoft\Windows\CurrentVersion\App Paths\PUAPCT.exe | [#MyAppFile] | ProductComponent | |
MyAppPathRegistration | -1 | Software\Microsoft\Windows\CurrentVersion\App Paths\PUASample1.exe | [#MyAppFile] | ProductComponent |
Registro de Cancelamento de Reprodução Automática
O PUASample.msi executa registros que permitem ao usuário do aplicativo impedir que a Reprodução Automática de Hardware seja iniciada para dispositivos selecionados. Para obter informações sobre como registrar um manipulador a fim de cancelar a reprodução automática em resposta a um evento, confira o tópico Preparando hardware e software para uso com 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 Root é necessário para especificar ao Windows Installer que o registro deve ser redirecionado para um local que depende do contexto de instalação.
Tabela Registry
Registro | Root | Chave | Nome | Valor | Componente |
---|---|---|---|---|---|
MyAutoplayCancelRegistration | -1 | SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers\CancelAutoplay\CLSID | 66A32FE6-229D-427b-A608-D273F40C034C | ProductComponent |
Registro do Manipulador de Visualização
O PUASample.msi executa registros necessários para instalar um manipulador de visualização que permite uma visualização somente leitura de arquivos .pua sem iniciar o aplicativo. Para obter informações sobre como registrar manipuladores de visualização, confira o tópico Registrando manipuladores de visualização na seção 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 Root é necessário para especificar ao Windows Installer que o registro deve ser redirecionado para um local que depende do contexto de instalação.
Tabela Registry
Registro | Root | Chave | Nome | Valor | Componente |
---|---|---|---|---|---|
MyPreviewHandlerRegistration1 | -1 | Software\Classes\.pua | puafile | ProductComponent | |
MyPreviewHandlerRegistration2 | -1 | Software\Microsoft\Windows\CurrentVersion\PreviewHandlers | {1531d583-8375-4d3f-b5fb-d23bbd169f22} | Manipulador de Visualização de TESTE do PUA do Microsoft Windows | ProductComponent |
MyPreviewHandlerRegistration3 | -1 | Software\Classes\puafile\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f} | {1531d583-8375-4d3f-b5fb-d23bbd169f22} | ProductComponent | |
MyPreviewHandlerRegistration4 | -1 | Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22} | Manipulador de visualização de exemplo do Aplicativo 1 para cada usuário | ProductComponent | |
MyPreviewHandlerRegistration5 | -1 | Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22} | AppID | {6d2b5079-2f0b-48dd-ab7f-97cec514d30b} | ProductComponent |
MyPreviewHandlerRegistration6 | -1 | Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22} | DisplayName | @shell32,-38242 | ProductComponent |
MyPreviewHandlerRegistration7 | -1 | Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22} | ícone | notepad.exe,2 | ProductComponent |
MyPreviewHandlerRegistration8 | -1 | Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22}\InProcServer32 | ThreadingModel | Apartment | ProductComponent |
MyPreviewHandlerRegistration9 | -1 | Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22}\InProcServer32 | #%%SystemRoot%\system32\shell32.dll | ProductComponent | |
MyPreviewHandlerRegistration10 | -1 | Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22}\InProcServer32 | ProgID | puafile | ProductComponent |