2010-01-13 12 views
69

En WIX, ¿cómo se crea un acceso directo no publicitado en el perfil de los usuarios? Hasta ahora solo he podido lograr esto con accesos directos publicitados. Prefiero atajos no anunciados porque puedes ir a las propiedades del atajo y usar "buscar destino".Wix crear acceso directo no publicitado para todos los usuarios/por máquina

En los tutoriales que he visto utilizar un valor de registro para la ruta de acceso clave de un acceso directo. 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 de registro se queda atrás. Cuando uso HKMU como raíz recibo un error ICE57, pero la clave se elimina cuando otro usuario desinstala el programa. Parece que me siento empujado hacia el uso de HKCU aunque HKMU parece comportarse correctamente (por usuario versus todos los usuarios).

Cuando trato de crear el atajo no publicitado recibo 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 hielo". Debe haber una forma de crear los accesos directos no publicitados, sin crear errores ICE.

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

Respuesta

101

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

Recientemente me encontré con la información en DISABLEADVTSHORTCUTS property. Creé una instalación con accesos directos publicitados y establecí la propiedad DISABLEADVTSHORTCUTS en 1, que producía accesos directos no anunciados. Esto pasa por alto ICE43 errors porque un atajo publicitado puede usar un archivo como keypath. Como se ha configurado DISABLEADVTSHORTCUTS, Windows Installer reemplazará estos accesos directos anunciados con accesos directos regulares.

Establecí el atributo Package Element's InstallScope en "perMachine". Esto establece la propiedad ALLUSERS en 1. Los valores de ProgramMenuFolder y DesktopFolder se resolverán en 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 según el valor de ALLUSERS.

En resumen, con DISABLEADVTSHORTCUTS establecido en 1, sus accesos directos anunciados no producirán errores de ICE, pero se convertirán en accesos directos no anunciados cuando se instalen. Un RegistryValue con HKMU raíz está bien para un KeyPath siempre que no sea keypath para un atajo 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> 
+0

Muy buen trabajo con los detalles en su respuesta. Encontré esto extremadamente útil ya que he estado navegando por la documentación y las muestras de WiX. ¡Gracias! – Dave

+6

Gran respuesta. Pero supongamos que tengo un atajo de escritorio en un componente separado (porque lo instalo condicionalmente). IIUC tales accesos directos no pueden anunciarse. Si trato de agregar Advertise = "yes" incluso con DISABLEADVTSHORTCUTS obtengo el error CNDL0035. ¿Puedes ver una forma de hacer ese acceso directo con la clave de registro HKMU? – marcin

+8

Responder su propia pregunta no es una mala etiqueta en absoluto si ha encontrado una buena solución, y estoy muy agradecido de haberlo hecho, y con una respuesta excelente para arrancar. +1! – fzwo

2

Eche un vistazo a From MSI to WiX, Part 10 - Shortcuts de Alex Shevchuk.

O blog de Rob Menching How to create an uninstall shortcut (and pass all the ICE validation).

Básicamente ICE57 es bastante molesto ... pero aquí está el (parece estar funcionando) código 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> 
+7

Su ejemplo utiliza "HKCU" como la ruta de teclas. 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 usa un archivo como keypath que produce errores ICE43 e ICE57. – mcdon

+1

La clave de registro, sí. No es el atajo sí mismo :) – saschabeaumont

3

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 cosa de tutorial de WiX y no es MSI o requisito de certificación. Este es un ejemplo sin llave del 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 hará que el acceso directo junto con el ejecutable en un solo componente.Si esto te molesta, utiliza la clave de registro ficticia (como en la auto-respuesta aceptada muy bien explicada).

+0

Recuerde agregar al elemento Product – sartoris

Cuestiones relacionadas