Exemple de création de package unique

L’exemple PUASample.msi est un exemple d’un package à double usage Windows Installer 5.0 capable d’être installé dans le contexte d’installation par utilisateur ou par ordinateur sur Windows Server 2008 R2 et Windows 7. Cet exemple de package suit les instructions de développement décrites dans Single Package Authoring.

Obtention d’une copie de l’exemple

Une copie de cet exemple et un éditeur de table de base de données Windows Installer, Orca.exe, se trouvent dans les composants Windows SDK pour les développeurs Windows programme d’installation. L’exemple et l’éditeur de table sont fournis avec le kit de développement logiciel Windows pour Windows Server 2008 R2 et Windows 7 en tant que fichiers d’installation Windows Installer PUASample1.msi et Orca.msi.

Configuration requise

L’éditeur de base de données, Orca.exe, nécessite Windows Server 2008 R2 et versions antérieures et Windows 7 et antérieures. Le package à double usage, PUASample1.msi, peut être installé dans le contexte d’installation par ordinateur ou par utilisateur sur Windows Server 2008 R2 et Windows 7. PUASample1.msi ne peut être installé que dans le contexte par ordinateur sur Windows Server 2008 et versions antérieures et Windows Vista et versions antérieures. Vous pouvez installer l’éditeur de base de données pour examiner le contenu de PUASample1.msi sans installer l’exemple. Pour installer les packages d’exemple ou d’éditeur, vérifiez que la stratégie DisableMSI n’est pas définie sur une valeur qui bloque les installations d’application.

Identification d’un package Dual-Purpose

Les packages à double usage doivent initialiser la valeur de la propriété MSIINSTALLPERUSER sur 1. Cela identifie le package comme pouvant être installé dans le contexte par ordinateur ou par utilisateur sur Windows Server 2008 R2 et Windows 7. Définissez la propriété MSIINSTALLPERUSER dans le package uniquement si elle a été écrite en suivant les instructions de développement décrites dans Création de package unique et si vous envisagez de fournir aux utilisateurs la possibilité d’installer le package dans le contexte par utilisateur ou par ordinateur. Un package à double usage doit également initialiser la valeur de la propriété ALLUSERS sur 2. Cela spécifie par utilisateur le contexte d’installation par défaut de l’application. Si la valeur de la propriété ALLUSERS est autre que 2, Windows Programme d’installation ignore la propriété MSIINSTALLPERUSER.

Utilisez un éditeur de base de données Windows Installer, tel que Orca.exe, pour examiner le contenu de PUASample1.msi. La table Property de l’exemple de package contient les deux entrées suivantes.

Propriété Table (partielle)

Propriété Valeur
ALLUSERS 2
MSIINSTALLPERUSER 1

 

Boîte de dialogue personnalisée pour le contexte d’installation

L’interface utilisateur de l’exemple de package inclut un exemple de boîte de dialogue personnalisée, VerifyReadyDialog, qui permet aux utilisateurs de sélectionner le contexte d’installation par utilisateur ou par ordinateur au moment de l’installation. La table Dialog contient un enregistrement qui décrit la boîte de dialogue VerifyReadyDialog. La valeur entrée dans le champ Attributs est 39, car cette boîte de dialogue utilise les bits de style msidbDialogAttributesVisible (1), msidbDialogAttributesModal (2), msidbDialogAttributesMinimize (4) et msidbDialogAttributesTrackDiskSpace (32). La barre de titre de la boîte de dialogue affiche un titre donné par la valeur de la propriété ProductName .

Dialogue Table (partielle)

Boîte de dialogue HCentering VCentering Largeur Hauteur Attributs Titre Control_First Control_Default Control_Cancel
VerifyReadyDialog 50 50 480 280 39 [ProductName] InstallPerUser Suivant Annuler

 

La table Contrôle contient des entrées pour les contrôles affichés par la boîte de dialogue VerifyReadyDialog. La boîte de dialogue affiche les contrôles PushButton et un contrôle Text . Tous les contrôles utilisent les attributs de contrôle msidbControlAttributesEnabled (2) et msidbControlAttributesVisible (1). Le contrôle InstallPerMachine utilise également l’attribut de contrôle ElevationShield , msidbControlAttributesElevationShield (8388608.) Cet attribut de contrôle ajoute l’icône d’élévation de contrôle de compte d’utilisateur (UAC) au contrôle InstallPerMachine et informe l’utilisateur que les informations d’identification UAC sont requises pour installer l’application dans le contexte par ordinateur. La valeur du champ Texte de la table Contrôle est le texte et le texte affichés par le contrôle. Pour plus d’informations sur l’ajout de texte à un contrôle à l’aide de styles prédéfinis, consultez la description du champ Texte de la rubrique de la table contrôle.

Contrôle Table (partielle)

Dialog_ Control Type Attribut Texte Control_Next
VerifyReadyDialog Annuler Bouton 3 {\Tahoma10}& Annuler Suivant
VerifyReadyDialog Précédente Bouton 3 {\Tahoma10}<<& Précédente Annuler
VerifyReadyDialog Suivant Bouton 3 {\Tahoma10}& Prochain >> InstallPerUser
VerifyReadyDialog Text2 Texte 3 Êtes-vous prêt à terminer votre installation suspendue ?
VerifyReadyDialog InstallPerUser Bouton 3 {\Tahoma10} Installer uniquement pour &moi InstallPerMachine
VerifyReadyDialog InstallPerMachine Bouton 8388611 {\Tahoma10} Installer pour &tout le monde Précédente
VerifyReadyDialog Annuler Bouton 3 {\Tahoma10}& Annuler Suivant

 

La table ControlEvent spécifie les événements ControlEvent ou les actions que le programme d’installation effectue lorsque l’utilisateur interagit avec un contrôle. Lorsqu’un utilisateur active le bouton push InstallPerUser, l’interface utilisateur affiche une boîte de dialogue OutOfDisk si la propriété OutOfDiskSpace est 1, définit la valeur de la propriété MSIINSTALLPERUSER sur 1, définit la valeur de la propriété ALLUSERS sur 2, définit la propriété MSIFASTINSTALL sur 1 et retourne . Étant donné que la propriété MSIFASTINSTALL est définie, aucun point de restauration système n’est généré pour l’installation. Lorsqu’un utilisateur active le bouton push InstallPerMachine, l’interface utilisateur affiche une boîte de dialogue OutOfDisk si la propriété OutOfDiskSpace est 1, définit la valeur de la propriété ALLUSERS sur 1 et retourne.

ControlEvent Table (partielle)

Dialog_ Control_ Événement Argument Condition JSON
VerifyReadyDialog InstallPerUser SpawnDialog OutOfDisk OutOfDiskSpace = 1 1
VerifyReadyDialog InstallPerUser EndDialog Renvoie 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 Renvoie OutOfDiskSpace <> 1 3
VerifyReadyDialog InstallPerMachine [ALLUSERS] 1 1 2
VerifyReadyDialog InstallPerUser [MSIFASTINSTALL] 1 1 4

 

Le contrôle InstallPerUser doit être supprimé de l’interface utilisateur de toute installation à l’aide d’une version Windows Installer antérieure à Windows Installer Windows Installer 5.0. La table ControlCondition de l’exemple de package contient quatre entrées qui désactivent et masquent le contrôle InstallPerUser si la version actuelle est inférieure à Windows Installer 5.0. La table utilise la valeur de la propriété VersionMsi et la syntaxe de l’instruction conditionnelle pour définir cette condition. L’action spécifiée dans le champ Action n’est effectuée que si l’instruction dans le champ Condition est vraie.

ControlCondition Table (partielle)

Dialog_ Control_ Action Condition
VerifyReadyDialog InstallPerUser Activer VersionMsi >= « 5.00 »
VerifyReadyDialog InstallPerUser Désactiver VersionMsi < « 5.00 »
VerifyReadyDialog InstallPerUser Afficher VersionMsi >= « 5.00 »
VerifyReadyDialog InstallPerUser Masquer VersionMsi < « 5.00 »

 

Spécification de la structure de répertoires

Utilisez l’éditeur de base de données pour examiner la table Directory de PUASample1.msi. L’enregistrement de la table de répertoires ayant une chaîne vide dans son champ Directory_Parent représente le répertoire racine des arborescences de répertoires source et cible. Si la propriété TARGETDIR n’est pas définie, le programme d’installation définit sa valeur au moment de l’installation sur la valeur de la propriété ROOTDRIVE . Si la propriété SourceDir n’est pas définie, le programme d’installation définit sa valeur à l’emplacement du répertoire contenant le package Windows Installer (fichier .msi.) Les noms de répertoires sont spécifiés à l’aide du format court|long.

Répertoire Table (partielle)

Répertoire Directory_Parent DefaultDir
TARGETDIR SourceDir
ProgramFilesFolder TARGETDIR .
ProgramMenuFolder TARGETDIR .
INSTALLLOCATION MyVendor Exemple 1| MSDN-PUASample1
MyVendor ProgramFilesFolder Msft| Microsoft

 

À la source, cette table Répertoire est résolue sur les chemins d’accès d’annuaire suivants.

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

Au niveau de la cible, la table Directory résout les chemins d’accès dans le tableau suivant. Le programme d’installation définit les valeurs des propriétés ProgramFilesFolder et ProgramMenuFolder à des emplacements qui dépendent du contexte d’installation et indique si le système est les versions 32 bits ou 64 bits de Windows Server 2008 R2 et Windows 7. Les chemins d’accès aux dossiers cibles dépendent du fait que l’utilisateur sélectionne une installation par utilisateur ou par machine.

Contexte d’installation Système Exemples de chemins
Per-Machine Windows Server 2008 R2 et Windows 7
Version 32 bits
%ProgramFiles%\Msft\Sample1
%ALLUSERSPROFILE%\Microsoft\Windows\Menu Démarrer\Programmes
Per-Machine Windows Server 2008 R2 et Windows 7
Version 64 bits
%ProgramFiles(x86)%\Msft\Sample1
%ALLUSERSPROFILE%\Microsoft\Windows\Menu Démarrer\Programmes
Per-User Windows Server 2008 R2 et Windows 7
Version 32 bits ou 64 bits
%USERPROFILE%\AppData\Local\Programs\Msft\Sample1
%APPDATA%\Microsoft\Windows\Menu Démarrer\Programmes

 

Les applications par utilisateur doivent être stockées dans les sous-dossiers sous le dossier Programmes spécifié par la valeur de la propriété ProgramFilesFolder . En règle générale, le chemin d’accès à l’application prend le formulaire suivant.

%LOCALAPPDATA%\Programs\ISVnameAppName\.

Les données de configuration par utilisateur doivent être stockées dans le dossier Programmes spécifié par la valeur de la propriété ProgramMenuFolder . En règle générale, ce dossier se trouve au chemin d’accès suivant.

%APPDATA%\Microsoft\Windows\Menu Démarrer\Programmes

Si vous installez des composants de package d’installation 32 bits Windows, utilisez la propriété ProgramFilesFolder et CommonFilesFolder dans la table Directory. Si vous installez des composants de package d’installation 64 bits Windows, utilisez les propriétés ProgramFiles64Folder et CommonFiles64Folder. Si votre application contient des versions 32 bits et 64 bits du même composant, avec le même nom, vérifiez que ces versions sont enregistrées dans différents répertoires ou leur donnent des noms différents.

Le tableau d’annuaire suivant fournit un exemple de disposition d’annuaire compatible avec un package qui inclut des composants 32 bits et 64 bits et inclut certains composants partagés entre les applications.

Répertoire Directory_Parent DefaultDir
TARGETDIR SourceDir
ProgramFilesFolder TARGETDIR .:P rog32
ProgramFiles64Folder TARGETDIR .:P rog64
CommonFilesFolder TARGETDIR .:Share32
CommonFiles64Folder TARGETDIR .:Share64
ProgramMenuFolder TARGETDIR .:Sample1| MSDN-PUASample1
INSTALLLOCATION MyVendor Exemple 1| MSDN-PUASample1
INSTALLLOCATIONX64 Vendorx64 Exemple 1| MSDN-PUASample1
SHAREDLOCATION ShVendor Exemple 1| MSDN-PUASample1
SHAREDLOCATIONX64 ShVendorx64 Exemple 1| MSDN-PUASample1
MyVendor ProgramFilesFolder Msft| Microsoft
Vendorx64 ProgramFiles64Folder Msft| Microsoft
ShVendor CommonFilesFolder Msft| Microsoft
ShVendorx64 CommonFiles64Folder Msft| Microsoft
Shrx86 SHAREDLOCATION Composants x32|32 bits
Shrx64 SHAREDLOCATIONX64 Composants x64|64 bits
Binx86 INSTALLLOCATION Composants x32|32 bits
Binx64 INSTALLLOCATIONX64 Composants x64|64 bits
App32 Binx86 myapp|unshared composants 32 bits
App64 Binx64 myapp|unshared composants 64 bits
Share32 Shrx86 composants partagés| partagés 32 bits
Share64 Shrx64 composants partagés| partagés 64 bits

 

Dans la source, cette table Répertoire est résolue en chemins d’accès de répertoire suivants.

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

Dans la cible, cette table Répertoire est résolue en chemins d’accès de répertoire suivants. Les chemins d’accès cibles dépendent du contexte d’installation et du système.

Contexte d’installation Système Exemples de chemins d’accès
Per-Machine Windows Server 2008 R2 et Windows 7
Version 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 Démarrer\Programmes\Sample1
Per-Machine Windows Server 2008 R2 et Windows 7
Version 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 Démarrer\Programmes\Sample1
Per-User Windows Server 2008 R2 et Windows 7
Version 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\Menu Démarrer\Programmes\Sample1

 

Inscription d’application

Le PUASample.msi ajoute une sous-clé à la clé de Registre Chemins d’accès aux applications pour l’application et effectue des inscriptions qui permettent d’enregistrer les informations de l’application dans le Registre sous cette clé. Pour plus d’informations sur les chemins d’accès aux applications et l’inscription d’application, consultez la section PerceptiondTypes, SystemFileAssociations et Inscription d’application dans la section d’extensibilité de l’interpréteur de commandes du Guide du développeur shell. Au moment de l’installation, l’utilisateur prend la décision d’installer l’application dans le contexte d’installation par utilisateur ou par ordinateur. Au moment où le package à double usage est créé, le développeur du package ne peut pas savoir si les inscriptions doivent être effectuées sous les clés HKEY_LOCAL_MACHINE ou HKEY_CURRENT_USER.

Le développeur de package définit l’identificateur de fichier du fichier exécutable de l’application dans le champ Fichier de la table de fichiers .

Fichier Table (partielle)

Fichier Component_ FileName FileSize Version Langage Attributs Séquence
MyAppFile ProductComponent PUASAMP1.EXE|PUASample1.exe 81920 0 1

 

Les valeurs à enregistrer dans le Registre peuvent être spécifiées dans le champ Valeur de la table Registre en tant que chaîne mise en forme . Utilisez l’identificateur de fichier défini dans le champ Fichier de la table Fichier et la convention [#filekey] du type mis en forme pour spécifier la valeur par défaut de la clé de Registre Chemins d’accès aux applications. L’action INSTALL de niveau supérieur effectue les actions dans la table InstallExecuteSequence . Une fois les actions CostInitialize, FileCost et InstallFinalize effectuées dans ce tableau, le programme d’installation Windows remplace la sous-chaîne mise en forme [#MyAppFile] dans la table du Registre par le chemin complet du fichier d’application.

L’exemple définit une propriété personnalisée, RegRoot, pour contenir l’emplacement de la clé racine et utilise une action personnalisée pour réinitialiser la valeur de propriété si l’utilisateur choisit une installation par ordinateur. Utilisez la propriété personnalisée, RegRoot, dans toutes les valeurs de chaîne mises en forme qui référencent l’emplacement racine. Dans la table Property , le package PUASample.msi définit la propriété personnalisée et définit la valeur de RegRoot sur HKCU. Cela initialise la valeur de la propriété pour le contexte d’installation par utilisateur, le contexte par défaut recommandé pour les packages à double usage.

Propriété Table (partielle)

Propriété Valeur
RegRoot HKCU

 

Dans la table CustomAction , le package définit une action personnalisée nommée Set_RegRoot_HKLM. La valeur du champ Type identifie cela comme une action personnalisée type 51 standard. La signification des champs Source et Cible dans la table CustomAction dépend du type d’action personnalisé. Pour plus d’informations sur les types standard d’actions personnalisées, consultez Types d’actions personnalisées. Le champ Source de l’action personnalisée Set_RegRoot_HKLM spécifie que la valeur de la propriété RegRoot. Si le programme d’installation effectue l’action personnalisée Set_RegRoot_HKLM, cela réinitialise la valeur de la propriété RegRoot à HKLM.

CustomAction Table (partielle)

Action Type Source Cible
Set_RegRoot_HKLM 51 [RegRoot] HKLM

 

L’action INSTALL de niveau supérieur effectue les actions dans la table InstallExecuteSequence , dans la séquence spécifiée dans le champ Séquence de cette table. La valeur créée dans le champ Séquence pour l’action personnalisée Set_RegRoot_HKLM (1501) spécifie que cette action personnalisée doit être effectuée après l’action InstallInitialize (1500) et avant l’action ProcessComponents (1600.) Cette séquence garantit que l’enregistrement de l’action personnalisée Set_RegRoot_HKLM est évalué au moment de l’installation. Pour plus d’informations sur la séquence d’actions recommandée dans la table InstallExecuteSequence, consultez la rubrique Suggérée InstallExecuteSequence . La syntaxe de l’instruction conditionnelle créée dans le champ Condition spécifie que l’action Set_RegRoot_HKLM ne doit être effectuée que si la valeur de la propriété ALLUSERS prend la valeur 1 au moment de l’installation. Une valeur de propriété ALLUSERS de 1 spécifie une installation par ordinateur.

InstallExecuteSequence Table (partielle)

Action Condition Séquence
Set_RegRoot_HKLM ALLUSERS=1 1501

 

Les enregistrements suivants dans la table de Registre effectuent les inscriptions si le composant ProductComponent est installé. La valeur -1 dans le champ Racine est requise pour effectuer l’inscription sous HKEY_LOCAL_MACHINE pour une installation par utilisateur et sous HKEY_CURRENT_USER pour une installation par utilisateur. L’enregistrement avec une chaîne vide dans le champ Registre ajoute une sous-clé pour l’application sous la clé de Registre AppPaths et définit la valeur « (Par défaut) » sur le chemin d’accès complet du fichier exécutable de l’application. L’inscription MyAppPathAlias mappe le fichier exécutable à un alias d’application et permet à l’application d’être lancée si l’utilisateur tape l’alias « puapct » à une invite de ligne de commande. L’inscription MyAppPathRegistration mappe le nom du fichier exécutable au chemin d’accès complet du fichier.

Registre Root Clé Nom Valeur Composant
-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

 

Inscription d’annulation de lecture automatique

Le PUASample.msi effectue des inscriptions qui permettent à l’utilisateur de l’application d’empêcher le lancement de la lecture automatique matérielle pour les appareils sélectionnés. Pour plus d’informations sur l’inscription d’un gestionnaire pour annuler la lecture automatique en réponse à un événement, consultez la rubrique Préparation du matériel et du logiciel à utiliser avec lecture automatique dans la section extensibilité de l’interpréteur de commandes du Guide du développeur Shell. L’enregistrement suivant enregistre le gestionnaire spécifié dans le champ Name lorsque le composant ProductComponent est installé. La valeur -1 dans le champ Racine est requise pour spécifier au programme d’installation Windows que l’inscription doit être redirigée vers un emplacement qui dépend du contexte d’installation.

Registre Table

Registre Root Clé Nom Valeur Composant
MyAutoplayCancelRegistration -1 SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers\CancelAutoplay\CLSID 66A32FE6-229D-427b-A608-D273F40C034C ProductComponent

 

Aperçu de l’inscription du gestionnaire

Le PUASample.msi effectue des inscriptions requises pour installer un gestionnaire d’aperçu qui active un aperçu en lecture seule des fichiers .pua sans lancer l’application. Pour plus d’informations sur l’inscription de gestionnaires d’aperçu, consultez la rubrique Registering Preview Handlers dans la section extensibilité de l’interpréteur de commandes du Guide du développeur Shell. Les enregistrements suivants dans la table de Registre enregistrent le gestionnaire lorsque le composant ProductComponent est installé. La valeur -1 dans le champ Racine est requise pour spécifier au programme d’installation Windows que l’inscription doit être redirigée vers un emplacement qui dépend du contexte d’installation.

Registre Table

Registre Root Clé Nom Valeur Composant
MyPreviewHandlerRegistration1 -1 Software\Classes\.pua puafile ProductComponent
MyPreviewHandlerRegistration2 -1 Software\Microsoft\Windows\CurrentVersion\PreviewHandlers {1531d583-8375-4d3f-b5fb-d23bbd169f22} Gestionnaire de préversion du test PUA 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} gestionnaire d’aperçu Per-User Applicaton Sample 1 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} Icône notepad.exe,2 ProductComponent
MyPreviewHandlerRegistration8 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22}\InProcServer32 ThreadingModel Appartement 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