Lo siento si es de mala educación responder mi propia pregunta.
Recientemente me topé con la información sobre la propiedad DISABLEADVTSHORTCUTS . Creé una instalación con accesos directos anunciados y configuré la propiedad DISABLEADVTSHORTCUTS en 1, lo que produjo accesos directos no anunciados. Esto evita los errores de ICE43 porque un acceso directo anunciado puede usar un archivo como ruta de acceso clave. Debido a que se ha configurado DISABLEADVTSHORTCUTS, Windows Installer reemplazará estos accesos directos anunciados con accesos directos regulares.
Establecí el atributo InstallScope del elemento del paquete en "perMachine". Esto ajusta la propiedad ALLUSERS a 1. Los valores de ProgramMenuFolder y DesktopFolder entonces resolver para el perfil Todos los usuarios.
Para las carpetas creadas en ProgramMenuFolder hay un elemento RemoveFolder y RegistryValue. Los ejemplos que he visto ( ex1 , ex2 ) usan HKCU como raíz para RegistryValue. Cambié esta raíz a HKMU que se resuelve en HKCU o HKLM dependiendo del valor de ALLUSERS.
En resumen, con DISABLEADVTSHORTCUTS establecido en 1, los accesos directos anunciados no producirán errores ICE, pero se convertirán en accesos directos no anunciados cuando se instalen. Un RegistryValue con root HKMU está bien para un KeyPath siempre que no sea un keypath para un acceso directo no anunciado.
<?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>
Aunque esta publicación es bastante antigua, contiene información bastante útil y parece aún activa. ¡Quiero señalar que, en general, NO necesita una clave de registro ficticia para su acceso directo! AFAIK, esto es un tutorial de WiX y no es un requisito de certificación o MSI. Aquí hay un ejemplo sin clave de registro:
<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>
Tenga en cuenta que esto pondrá su acceso directo junto con el ejecutable en un componente. Si esto le molesta, utilice una clave de registro ficticia (como en la muy bien explicada respuesta automática aceptada).
fuente
Eche un vistazo a De MSI a WiX, Parte 10 - Accesos directos de Alex Shevchuk.
O la publicación del blog de Rob Menching Cómo crear un acceso directo de desinstalación (y pasar toda la validación de ICE).
Básicamente, ICE57 es bastante molesto ... pero aquí está el código (parece estar funcionando) que estoy usando para los accesos directos del escritorio :)
<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>
fuente