Wix erstellt eine nicht angekündigte Verknüpfung für alle Benutzer / pro Computer

81

Wie erstellen Sie in WIX eine nicht angekündigte Verknüpfung im Alluser-Profil? Bisher konnte ich dies nur mit angekündigten Verknüpfungen erreichen. Ich bevorzuge nicht angekündigte Verknüpfungen, da Sie zu den Eigenschaften der Verknüpfung gehen und "Ziel suchen" verwenden können.

In den Tutorials habe ich gesehen, wie ein Registrierungswert für den Schlüsselpfad einer Verknüpfung verwendet wurde. Das Problem ist, dass sie HKCU als Root verwenden. Wenn HKCU verwendet wird und ein anderer Benutzer das Programm deinstalliert (da es für alle Benutzer installiert ist), bleibt der Registrierungsschlüssel zurück. Wenn ich HKMU als Root verwende, wird ein ICE57-Fehler angezeigt, aber der Schlüssel wird entfernt, wenn ein anderer Benutzer das Programm deinstalliert. Ich scheine dazu gedrängt zu sein, HKCU zu verwenden, obwohl sich HKMU korrekt zu verhalten scheint (pro Benutzer gegenüber allen Benutzern).

Wenn ich versuche, die nicht angekündigte Verknüpfung zu erstellen, werden verschiedene ICE-Fehler angezeigt, z. B. ICE38, ICE43 oder ICE 57. In den meisten Artikeln, die ich gesehen habe, wird empfohlen, "die Eisfehler einfach zu ignorieren". Es muss eine Möglichkeit geben, die nicht angekündigten Verknüpfungen zu erstellen, ohne ICE-Fehler zu erstellen.

Bitte posten Sie einen Beispielcode für ein funktionierendes Beispiel.

mcdon
quelle

Antworten:

113

Entschuldigung, wenn es eine schlechte Etikette ist, meine eigene Frage zu beantworten.

Kürzlich bin ich auf die Informationen zur Eigenschaft DISABLEADVTSHORTCUTS gestoßen . Ich habe eine Installation mit angekündigten Verknüpfungen erstellt und die Eigenschaft DISABLEADVTSHORTCUTS auf 1 gesetzt, wodurch nicht angekündigte Verknüpfungen erstellt wurden. Dadurch werden ICE43-Fehler umgangen, da eine angekündigte Verknüpfung eine Datei als Schlüsselpfad verwenden kann. Da DISABLEADVTSHORTCUTS festgelegt wurde, ersetzt Windows Installer diese angekündigten Verknüpfungen durch reguläre Verknüpfungen.

Ich habe das InstallScope-Attribut des Paketelements auf "perMachine" gesetzt. Dadurch wird die ALLUSERS-Eigenschaft auf 1 gesetzt. Die Werte von ProgramMenuFolder und DesktopFolder werden dann in das All Users-Profil aufgelöst.

Für Ordner, die unter ProgramMenuFolder erstellt wurden, gibt es ein RemoveFolder- und ein RegistryValue-Element. Die Beispiele, die ich gesehen habe ( ex1 , ex2 ), verwenden HKCU als Root für den RegistryValue. Ich habe diesen Stamm in HKMU geändert, der je nach Wert von ALLUSERS in HKCU oder HKLM aufgelöst wird.

Kurz gesagt, wenn DISABLEADVTSHORTCUTS auf 1 gesetzt ist, erzeugen Ihre angekündigten Verknüpfungen keine ICE-Fehler, sondern werden bei der Installation in nicht angekündigte Verknüpfungen konvertiert. Ein RegistryValue mit Root-HKMU ist für einen KeyPath in Ordnung, solange er für eine nicht angekündigte Verknüpfung kein Schlüsselpfad ist.

<?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>
mcdon
quelle
Wirklich gute Arbeit mit den Details in Ihrer Antwort. Ich fand dies äußerst hilfreich, da ich die WiX-Dokumentation und -Beispiele durchgesehen habe. Vielen Dank!
Dave
7
Gute Antwort. Angenommen, ich habe eine Desktop-Verknüpfung in einer separaten Komponente (weil ich sie unter bestimmten Bedingungen installiere). IIUC solche Verknüpfungen können nicht beworben werden. Wenn ich versuche, Advertise = "yes" auch mit DISABLEADVTSHORTCUTS hinzuzufügen, erhalte ich den Fehler CNDL0035. Können Sie eine Möglichkeit sehen, eine solche Verknüpfung mit dem HKMU-Registrierungsschlüssel zu erstellen?
Marcin
9
Die Beantwortung Ihrer eigenen Frage ist überhaupt keine schlechte Etikette, wenn Sie eine gute Lösung gefunden haben, und ich bin sehr dankbar, dass Sie dies getan haben - und mit einer hervorragenden Antwort zum Booten. +1!
Zwei
Verweisen Sie das Symbol nicht auf eine ausführbare Datei. Symbole werden in ein spezielles Verzeichnis (Windows \ Installer \ {GUID}) kopiert, und die Verknüpfung verwendet das Symbol von diesem Speicherort (dh nicht von der ausführbaren Datei in INSTALLDIR). Daher ist es besser, eine separate Symboldatei zu verwenden.
Dmitry Azaraev
Ich danke dir sehr. Ich habe Stunden damit verbracht, Fehler zu beheben. Hatte keine Ahnung von DISABLEADVTSHORTCUTS.
Jason Hughes
8

Obwohl dieser Beitrag ziemlich alt ist, enthält er sehr nützliche Informationen und sieht immer noch aktiv aus. Ich möchte darauf hinweisen, dass Sie im Allgemeinen KEINEN Dummy-Registrierungsschlüssel für Ihre Verknüpfung benötigen! AFAIK Dies ist ein WiX-Tutorial und keine MSI- oder Zertifizierungsanforderung. Hier ist ein Beispiel ohne Registrierungsschlüssel:

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

Beachten Sie, dass dadurch Ihre Verknüpfung mit der ausführbaren Datei in einer Komponente zusammengefügt wird. Wenn dies Sie stört, verwenden Sie einen Dummy-Registrierungsschlüssel (wie in der sehr gut erläuterten akzeptierten Selbstantwort).

zzz
quelle
1
Denken Sie daran, <Property Id = "DISABLEADVTSHORTCUTS" Value = "1" /> zum Produktelement
hinzuzufügen
@sartoris dies sollte der Antwort hinzugefügt werden. Ohne das geht es nicht.
Alex Zhukovskiy
2

Schauen Sie sich From MSI to WiX, Teil 10 - Shortcuts von Alex Shevchuk an.

Oder Rob Menchings Blog-Beitrag So erstellen Sie eine Deinstallationsverknüpfung (und bestehen die gesamte ICE-Validierung).

Grundsätzlich ist ICE57 ziemlich nervig ... aber hier ist der (scheint zu funktionieren) Code, den ich für Desktop-Verknüpfungen verwende :)

<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>
saschabeaumont
quelle
9
In Ihrem Beispiel wird "HKCU" als Schlüsselpfad verwendet. Wenn ein Benutzer die App installiert und ein anderer Benutzer die App entfernt, bleibt der Registrierungsschlüssel zurück. Der erste veröffentlichte Link verwendet HKCU für den Registrierungsschlüssel. Die zweite verwendet eine Datei als Schlüsselpfad, die ICE43- und ICE57-Fehler erzeugt.
Mcdon
1
Der Registrierungsschlüssel, ja. Nicht die Abkürzung selbst jedoch :)
Saschabeaumont