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


En WIX, ¿cómo se crea un acceso directo no anunciado en el perfil de allusers? Hasta ahora solo he sido capaz de lograr esto con los accesos directos anunciados. Prefiero atajos no anunciados porque puedes ir a las propiedades del atajo y usar "find target".

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 utiliza HKCU, y otro usuario desinstala el programa (ya que está instalado para todos los usuarios) la clave del registro se deja atrás. Cuando uso HKMU como root obtengo un error ICE57, pero la clave se elimina cuando otro usuario desinstala el programa. Me parece ser empujado hacia el uso de HKCU aunque HKMU parece comportarse correctamente (por usuario vs todos los usuarios).

Cuando intento crear el atajo 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 ignorar los errores de ice". Debe haber una manera de crear los accesos directos no anunciados, sin crear errores de HIELO.

Por favor, publique un código de ejemplo para un ejemplo de trabajo.

Author: mcdon, 2010-01-13

3 answers

Lo siento si es mala etiqueta responder a mi propia pregunta.

Recientemente me topé con la información sobre DISABLEADVTSHORTCUTS propiedad. Creé una instalación con accesos directos anunciados y establecí la propiedad DISABLEADVTSHORTCUTS en 1, lo que produjo accesos directos no anunciados. Esto evita errores ICE43 porque un acceso directo anunciado puede usar un archivo como una ruta de acceso. Debido a que DISABLEADVTSHORTCUTS se ha establecido, Windows Installer reemplazará estos accesos directos anunciados con atajos regulares.

Establezco el atributo del elemento Package InstallScope en "perMachine". Esto establece la propiedad ALLUSERS en 1. Los valores de ProgramMenuFolder y DesktopFolder se resolverán en el perfil de Todos los usuarios.

Para las carpetas creadas bajo ProgramMenuFolder hay un elemento RemoveFolder y RegistryValue. Los ejemplos que he visto (ex1, ex2) usa HKCU como la raíz para el RegistryValue. Cambié esta raíz a HKMU que resuelve a HKCU o HKLM dependiendo del valor de ALLUSERS.

En resumen, con DISABLEADVTSHORTCUTS establecido en 1, los accesos directos anunciados no producirán errores de ICE, sino que se convertirán en accesos directos no anunciados cuando se instalen. Un RegistryValue con root HKMU está bien para una ruta de acceso, siempre y cuando no sea la ruta de acceso 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>
 103
Author: mcdon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-29 19:03:38

Aunque este post es bastante antiguo, contiene información bastante útil y se ve todavía activo. Quiero señalar que, en general, no necesita una clave de registro ficticia para su acceso directo! AFAIK esta es una cosa tutorial WiX y no es MSI o requisito de certificación. Aquí hay un ejemplo sin clave 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>

Tenga en cuenta que esto pondrá su acceso directo junto con el ejecutable en un componente. Si esto le molesta, utilice la clave de registro ficticia (como en el auto aceptado muy bien explicado respuesta).

 5
Author: zzz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-25 01:33:58

Echa un vistazo a De MSI a WiX, Parte 10 - Atajos por Alex Shevchuk.

O Rob Menching's blog post Cómo crear un acceso directo de desinstalación (y pasar toda la validación ICE).

Básicamente ICE57 es bastante molesto... pero aquí está el código (parece estar funcionando) que estoy usando para accesos directos de 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>
 2
Author: saschabeaumont,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-01 22:21:18