Partager via


Exemple de création de package unique

L’exemple PUASample.msi est un exemple de package Windows Installer 5.0 à double usage qui peut ê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 Création de package unique.

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 du Kit de développement logiciel (SDK) Windows pour les développeurs Windows Installer. 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 de 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 versions 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 peuvent être installés que dans le contexte par machine 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 conformément aux instructions de développement décrites dans Création de package unique et si vous avez l’intention de fournir aux utilisateurs la possibilité d’installer le package dans le contexte par utilisateur ou par machine. Un package à double usage doit également initialiser la valeur de la propriété ALLUSERS sur 2. Cela spécifie par utilisateur comme contexte d’installation par défaut pour l’application. Si la valeur de la propriété ALLUSERS n’est pas égale à 2, Windows Installer ignore la valeur de 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 dans 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 de dialogue 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 .

Table Dialog (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 Control 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 Texte . 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 du contrôle de compte d’utilisateur (icône de bouclier) au contrôle InstallPerMachine et informe l’utilisateur que les informations d’identification UAC sont nécessaires pour installer l’application dans le contexte par machine. La valeur dans le champ Texte de la table Contrôle est le style de 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 table De contrôle.

Table Control (partielle)

Dialog_ Control Type Attribut Texte Control_Next
VerifyReadyDialog Annuler Bouton 3 {\Tahoma10}&Cancel Suivant
VerifyReadyDialog Précédent Bouton 3 {\Tahoma10}<<&Previous Annuler
VerifyReadyDialog Suivant Bouton 3 {\Tahoma10}&Next >> 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édent
VerifyReadyDialog Annuler Bouton 3 {\Tahoma10}&Cancel Suivant

 

La table ControlEvent spécifie les actions ControlEvents effectuées par le programme d’installation lorsque l’utilisateur interagit avec un contrôle. Lorsqu’un utilisateur active le bouton pushbutton InstallPerUser, l’interface utilisateur affiche une boîte de dialogue OutOfDisk si la propriété OutOfDiskSpace a la valeur 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 du système n’est généré pour l’installation. Lorsqu’un utilisateur active le bouton pushbutton InstallPerMachine, l’interface utilisateur affiche une boîte de dialogue OutOfDisk si la propriété OutOfDiskSpace a la valeur 1, définit la valeur de la propriété ALLUSERS sur 1 et retourne.

Table ControlEvent (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 utilisant une version de Windows Installer antérieure à 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 d’instruction conditionnelle pour définir cette condition. L’action spécifiée dans le champ Action est exécutée uniquement si l’instruction dans le champ Condition a la valeur true.

ControlConditionTable (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 d’annuaires contenant 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 sur 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épertoireTable (partielle)

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

 

À la source, cette table Répertoire correspond aux chemins d’accès de répertoire suivants.

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

Sur la cible, la table Répertoire est résolue en chemins d’accès dans le tableau suivant. Le programme d’installation définit les valeurs des propriétés ProgramFilesFolder et ProgramMenuFolder sur des emplacements qui dépendent du contexte d’installation et 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 varient selon que l’utilisateur sélectionne une installation par utilisateur ou par ordinateur.

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
%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs
Per-Machine Windows Server 2008 R2 et Windows 7
Version 64 bits
%ProgramFiles(x86)%\Msft\Sample1
%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs
Par utilisateur Windows Server 2008 R2 et Windows 7
Version 32 bits ou 64 bits
%USERPROFILE%\AppData\Local\Programs\Msft\Sample1
%APPDATA%\Microsoft\Windows\Start Menu\Programs

 

Les applications par utilisateur doivent être stockées dans des 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 la forme suivante.

%LOCALAPPDATA%\Programs\ISV name\AppName.

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\Start Menu\Programs

Si vous installez des composants de package Windows Installer 32 bits , utilisez les propriétés ProgramFilesFolder et CommonFilesFolder dans la table Directory . Si vous installez des composants de package Windows Installer 64 bits , 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 des répertoires différents ou donnez-leur des noms différents.

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

Répertoire 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 Composants x32|32 bits
Shrx64 SHAREDLOCATIONX64 Composants x64|64 bits
Binx86 INSTALLLOCATION Composants x32|32 bits
Binx64 INSTALLLOCATIONX64 Composants x64|64 bits
App32 Binx86 composants myapp|unshared 32 bits
App64 Binx64 composants myapp|unshared 64 bits
Share32 Shrx86 composants 32 bits partagés|partagés
Share64 Shrx64 composants 64 bits partagés|partagés

 

À la source, cette table Répertoire correspond aux chemins d’accès de répertoire suivants.

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

À la source, cette table Répertoire correspond aux 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\Start Menu\Programs\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\Start Menu\Programs\Sample1
Par utilisateur 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\Start Menu\Programs\Sample1

 

Inscription d’application

Le PUASample.msi ajoute une sous-clé à la clé de Registre Chemins d’accès de l’application 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 des applications et l’inscription des applications, consultez la section PerceivedTypes, SystemFileAssociations et Inscription des applications dans la section 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 machine. Au moment de la création du package à double usage, le développeur de 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 pour le fichier exécutable de l’application dans le champ Fichier de la table de fichiers .

Table File (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 sous forme de 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 de l’application. L’action INSTALL de niveau supérieur effectue les actions dans la table InstallExecuteSequence . Une fois les actions CostInitialize, FileCost et InstallFinalize de ce tableau terminées, Windows Installer remplace la sous-chaîne mise en forme [#MyAppFile] dans la table Registre par le chemin d’accès complet au 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 la 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 dans le champ Type identifie cette action en tant qu’action personnalisée standard de type 51 . 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, la valeur de la propriété RegRoot est réinitialisée à HKLM.

CustomActionTable (partielle)

Action Type Source Cible
Set_RegRoot_HKLM 51 [RegRoot] HKLM

 

L’action INSTALL de niveau supérieur effectue les actions de 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 InstallExecuteSequence suggérée . La syntaxe de l’instruction conditionnelle créée dans le champ Condition spécifie que l’action Set_RegRoot_HKLM doit être effectuée uniquement si la valeur de la propriété ALLUSERS est 1 au moment de l’installation. Une valeur de propriété ALLUSERS de 1 spécifie le contexte d’installation par ordinateur.

InstallExecuteSequenceTable (partielle)

Action Condition Séquence
Set_RegRoot_HKLM ALLUSERS=1 1501

 

Les enregistrements suivants dans la table Registry 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 de lancer l’application 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

 

Annuler l’inscription en lecture automatique

Le PUASample.msi effectue des inscriptions qui permettent à l’utilisateur de l’application d’empêcher le lancement de la lecture automatique du matériel 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 des logiciels à utiliser avec la lecture automatique dans la section extensibilité de l’interpréteur de commandes du Guide du développeur shell. L’enregistrement suivant inscrit le gestionnaire spécifié dans le champ Nom lors de l’installation du composant ProductComponent. La valeur -1 dans le champ Racine est requise pour spécifier à Windows Installer que l’inscription doit être redirigée vers un emplacement qui dépend du contexte d’installation.

Table Registre

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

 

Inscription du gestionnaire en préversion

Le PUASample.msi effectue les inscriptions nécessaires à l’installation d’un gestionnaire d’aperçu qui active une préversion en lecture seule des fichiers .pua sans lancer l’application. Pour plus d’informations sur l’inscription des gestionnaires d’aperçu, consultez la rubrique Inscription des gestionnaires d’aperçu dans la section extensibilité de l’interpréteur de commandes du Guide du développeur shell. Les enregistrements suivants dans la table Registry effectuent les inscriptions si le composant ProductComponent est installé. La valeur -1 dans le champ Racine est requise pour spécifier à Windows Installer que l’inscription doit être redirigée vers un emplacement qui dépend du contexte d’installation.

Table Registre

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 microsoft Windows PUA TEST Preview 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} Per-User Exemple de gestionnaire d’application 1 Preview 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