web-dev-qa-db-fra.com

Wix crée un raccourci non annoncé pour tous les utilisateurs / par machine

Sous WIX, comment créez-vous un raccourci non annoncé dans le profil des utilisateurs? Jusqu'à présent, je n'ai pu accomplir cela qu'avec des raccourcis annoncés. Je préfère les raccourcis non annoncés, car vous pouvez accéder aux propriétés du raccourci et utiliser "rechercher la cible".

Dans les didacticiels que j'ai vus, utilisez une valeur de registre pour le chemin de touches d'un raccourci. Le problème est qu'ils utilisent HKCU comme racine. Lorsque HKCU est utilisé et qu'un autre utilisateur désinstalle le programme (car il est installé pour tous les utilisateurs), la clé de registre est laissée. Lorsque j'utilise HKMU en tant que root, j'obtiens une erreur ICE57, mais la clé est supprimée lorsqu'un autre utilisateur désinstalle le programme. Je semble être poussé à utiliser HKCU bien que HKMU semble se comporter correctement (par utilisateur contre tous les utilisateurs).

Lorsque j'essaie de créer le raccourci non annoncé, j'obtiens diverses erreurs ICE telles que ICE38, ICE43 ou ICE 57. La plupart des articles que j'ai vus recommandent de "simplement ignorer les erreurs de glace". Il doit y avoir un moyen de créer les raccourcis non annoncés, sans créer d'erreurs ICE.

Veuillez poster un exemple de code pour un exemple de travail.

75
mcdon

Désolé si c'est une mauvaise étiquette de répondre à ma propre question.

Récemment, je suis tombé sur les informations sur propriété DISABLEADVTSHORTCUTS . J'ai créé une installation avec des raccourcis annoncés et défini la propriété DISABLEADVTSHORTCUTS sur 1 qui a produit des raccourcis non annoncés. Cela contourne erreurs ICE4 car un raccourci publié peut utiliser un fichier comme chemin de clé. Étant donné que DISABLEADVTSHORTCUTS a été défini, Windows Installer remplacera ces raccourcis publiés par des raccourcis normaux.

J'ai défini l'attribut Package Element's InstallScope sur "perMachine". Cela définit la propriété ALLUSERS sur 1. Les valeurs de ProgramMenuFolder et DesktopFolder seront ensuite résolues dans le profil Tous les utilisateurs.

Pour les dossiers créés sous ProgramMenuFolder, il existe un élément RemoveFolder et RegistryValue. Les exemples que j'ai vus ( ex1 , ex2 ) utilisent HKCU comme racine pour RegistryValue. J'ai changé cette racine en HKMU qui se résout en HKCU ou HKLM selon la valeur de ALLUSERS.

En bref, avec DISABLEADVTSHORTCUTS défini sur 1, vos raccourcis annoncés ne produiront pas d'erreurs ICE, mais seront convertis en raccourcis non annoncés lors de l'installation. Un RegistryValue avec root HKMU est correct pour un KeyPath tant qu'il ne s'agit pas d'un keypath pour un raccourci non annoncé.

<?xml version="1.0" encoding="utf-8"?>
<!-- This example is based on SampleFirst by Gábor DEÁK JAHN, Tramontána:
        http://www.tramontana.co.hu/wix/lesson1.php#1.3
    Original SampleFirst:
        http://www.tramontana.co.hu/wix/download.php?file=samples/samplefirst.Zip&type=application/Zip -->
<Wix xmlns="http://schemas.Microsoft.com/wix/2006/wi">
    <Product Name="Foobar 1.0" Id="YOURGUID-21F1-4026-ABD2-7CC7F8CE4D18" UpgradeCode="YOURGUID-AFA4-46C6-94AA-EEE3D104F903" Language="1033" Codepage="1252" Version="1.0.0" Manufacturer="Acme Ltd.">
        <Package Id="*" Keywords="Installer" Description="Acme's Foobar 1.0 Installer" Comments="Foobar is a registered trademark of Acme Ltd." Manufacturer="Acme Ltd." InstallerVersion="100" Languages="1033" Compressed="yes" SummaryCodepage="1252" InstallScope="perMachine" />
        <Media Id="1" Cabinet="Sample.cab" EmbedCab="yes" DiskPrompt="CD-ROM #1" />
        <Property Id="DiskPrompt" Value="Acme's Foobar 1.0 Installation [1]" />
        <Property Id="DISABLEADVTSHORTCUTS" Value="1" />
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder" Name="PFiles">
                <Directory Id="Acme" Name="Acme">
                    <Directory Id="INSTALLDIR" Name="Foobar 1.0">
                        <Component Id="MainExecutable" Guid="YOURGUID-3E4F-47A2-86F1-F3162E9C4798">
                            <File Id="FoobarEXE" Name="FoobarAppl10.exe" DiskId="1" Source="FoobarAppl10.exe" KeyPath="yes">
                                <Shortcut Id="startmenuFoobar10" Directory="ProgramMenuDir" Name="Foobar 1.0" WorkingDirectory="INSTALLDIR" Icon="Foobar10.exe" IconIndex="0" Advertise="yes" />
                                <Shortcut Id="desktopFoobar10" Directory="DesktopFolder" Name="Foobar 1.0" WorkingDirectory="INSTALLDIR" Icon="Foobar10.exe" IconIndex="0" Advertise="yes" />
                            </File>
                        </Component>
                        <Component Id="HelperLibrary" Guid="YOURGUID-C7DA-4C02-A2F0-A6E089FC0CF3">
                            <File Id="HelperDLL" Name="Helper.dll" DiskId="1" Source="Helper.dll" KeyPath="yes" />
                        </Component>
                        <Component Id="Manual" Guid="YOURGUID-FF92-4BF4-A322-819A3B2265A0">
                            <File Id="Manual" Name="Manual.pdf" DiskId="1" Source="Manual.pdf" KeyPath="yes">
                                <Shortcut Id="startmenuManual" Directory="ProgramMenuDir" Name="Instruction Manual" Advertise="yes" />
                            </File>
                        </Component>
                    </Directory>
                </Directory>
            </Directory>
            <Directory Id="ProgramMenuFolder" Name="Programs">
                <Directory Id="ProgramMenuDir" Name="Foobar 1.0">
                    <Component Id="ProgramMenuDir" Guid="YOURGUID-D1C2-4D76-BA46-C6FA79862E77">
                        <RemoveFolder Id="ProgramMenuDir" On="uninstall" />
                        <RegistryValue Root="HKMU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Value="" KeyPath="yes" />
                    </Component>
                </Directory>
            </Directory>
            <Directory Id="DesktopFolder" Name="Desktop" />
        </Directory>
        <Feature Id="Complete" Level="1">
            <ComponentRef Id="MainExecutable" />
            <ComponentRef Id="HelperLibrary" />
            <ComponentRef Id="Manual" />
            <ComponentRef Id="ProgramMenuDir" />
        </Feature>
        <Icon Id="Foobar10.exe" SourceFile="FoobarAppl10.exe" />
    </Product>
</Wix>
106
mcdon

Bien que ce post soit assez ancien, il contient des informations très utiles et semble toujours actif. Je tiens à souligner qu'en général, vous n'avez PAS besoin d'une clé de registre factice pour votre raccourci! AFAIK c'est un truc de tutoriel WiX et ce n'est pas une exigence MSI ou de certification. Voici un exemple sans clé reg:

<Fragment Id="Folders">
  <Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="ProgramFilesFolder">
      <Directory Id="INSTALLFOLDER" Name="MyApp">
      </Directory>
    </Directory>
    <Directory Id="ProgramMenuFolder">
      <Directory Id="MyAppStartMenuDir" Name="MyApp"/>
    </Directory>
  </Directory>
</Fragment>
<Fragment Id="Components">
  <Component Id="MyAppComp" Directory="INSTALLFOLDER" ...>
    <!--The advertise flag below is to bypass ICE errors in WiX, the actual shortcut will not be advertises if those are disabled globally with DISABLEADVTSHORTCUTS-->
    <File ..." KeyPath="yes">
      <Shortcut Id="MyAppStartMenuLink" Directory="MyAppStartMenuDir" Advertise="yes" ... />
    </File>
    <RemoveFolder Id="StartMenuDirRemoved" Directory="MyAppStartMenuDir" On="uninstall" />
  </Component>
</Fragment>

Notez que cela mettra votre raccourci avec l'exécutable dans un composant. Si cela vous dérange, utilisez une clé de registre fictive (comme dans la réponse automatique acceptée très bien expliquée).

6
zzz

Jetez un oeil à De MSI à WiX, Partie 10 - Raccourcis par Alex Shevchuk.

Ou l'article de blog de Rob Menching Comment créer un raccourci de désinstallation (et passer toute la validation ICE).

Fondamentalement, ICE57 est plutôt ennuyeux ... mais voici le code (qui semble fonctionner) que j'utilise pour les raccourcis du bureau :)

<Component Id="DesktopShortcut" Directory="APPLICATIONFOLDER" Guid="*">
    <RegistryValue Id="RegShortcutDesktop" Root="HKCU" Key="SOFTWARE\My App\1.0\settings" Name="DesktopSC" Value="1" Type="integer" KeyPath="yes" />
    <Shortcut Id="desktopSc" Target="[APPLICATIONFOLDER]MyApp.exe" Directory="DesktopFolder" Name="My Applications" Icon="myapp.ico" IconIndex="0" WorkingDirectory="APPLICATIONFOLDER" Advertise="no"/>
    <RemoveFolder Id="RemoveShortcutFolder" On="uninstall" />
    <Condition>DT_SHORTCUT=1</Condition>
</Component>
2
saschabeaumont