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"?>
<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>
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).
quelle
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>
quelle