Wix crea un acceso directo no anunciado para todos los usuarios / por máquina

81

En WIX, ¿cómo se crea un acceso directo no anunciado en el perfil de todos los usuarios? Hasta ahora solo he podido lograr esto con los atajos anunciados. Prefiero los accesos directos no publicitados porque puede ir a las propiedades del acceso directo y utilizar "buscar destino".

En los tutoriales, he visto usar un valor de registro para la ruta de acceso de un atajo. El problema es que usan HKCU como raíz. Cuando se usa HKCU y otro usuario desinstala el programa (ya que está instalado para todos los usuarios), la clave de registro se deja atrás. Cuando utilizo HKMU como raíz, aparece un error ICE57, pero la clave se elimina cuando otro usuario desinstala el programa. Parece que me presionan para usar HKCU, aunque HKMU parece comportarse correctamente (por usuario frente a todos los usuarios).

Cuando trato de crear el acceso directo no anunciado, obtengo varios errores de ICE, como ICE38, ICE43 o ICE 57. La mayoría de los artículos que he visto recomiendan "simplemente ignore los errores de hielo". Debe haber una forma de crear los accesos directos no anunciados, sin crear errores de ICE.

Publique un código de muestra para un ejemplo funcional.

mcdon
fuente

Respuestas:

113

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"?>
<!-- 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
fuente
Muy buen trabajo con los detalles en tu respuesta. Encontré esto extremadamente útil ya que he estado revisando la documentación y las muestras de WiX. ¡Gracias!
Dave
7
Gran respuesta. Pero supongamos que tengo un acceso directo en el escritorio en un componente separado (porque lo instalo de forma condicional). IIUC tales atajos no se pueden publicitar. Si intento agregar Advertise = "yes" incluso con DISABLEADVTSHORTCUTS, aparece el error CNDL0035. ¿Puede ver una manera de hacer tal acceso directo con la clave de registro HKMU?
marcin
9
Responder su propia pregunta no es una mala etiqueta si ha encontrado una buena solución, y estoy muy agradecido de que lo haya hecho, y con una excelente respuesta para empezar. +1!
fzwo
No haga referencia al icono del archivo ejecutable. Los iconos se copian en un directorio especial (Windows \ Installer \ {GUID}), y el acceso directo usará el icono de esta ubicación (es decir, no del ejecutable en INSTALLDIR), por lo que es mejor usar un archivo de icono separado.
Dmitry Azaraev
Muchas gracias. Pasé horas solucionando este problema. No tenía ni idea de DISABLEADVTSHORTCUTS.
Jason Hughes
8

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

zzz
fuente
1
Recuerde agregar <Property Id = "DISABLEADVTSHORTCUTS" Value = "1" /> al elemento Product
sartoris
@sartoris esto debería agregarse a la respuesta. Sin él, no funciona.
Alex Zhukovskiy
2

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>
Saschabeaumont
fuente
9
Su ejemplo utiliza "HKCU" como ruta de acceso clave. Si un usuario instala la aplicación y otro usuario la elimina, la clave de registro permanecerá atrás. El primer enlace publicado utiliza HKCU para la clave de registro. El segundo utiliza un archivo como ruta clave que produce errores ICE43 e ICE57.
mcdon
1
La clave de registro, sí. Sin embargo, no es el atajo en sí :)
saschabeaumont