2010-06-19 16 views
21

Tengo una aplicación que se está instalando con WiX 3: la mayor parte de la instalación funciona bien ahora, pero intentar hacer que funcione el atajo de escritorio parece costarme ...WiX 3 me vuelve loco: intento crear un acceso directo en el escritorio

Tengo mi aplicación instalada y ya tengo un acceso directo en la carpeta del menú Inicio - funciona bien. Pero, ¿cómo puedo poner en marcha el acceso directo de escritorio?

<Product Id="*" Name="....." UpgradeCode="MY-GUID"> 
    <Package Id="*" InstallerVersion="200" Compressed="yes" /> 
    <Media Id="1" Cabinet="foobar.cab" EmbedCab="yes" /> 
    <Property Id="ALLUSERS">1</Property> 

    <Directory Id="TARGETDIR" Name="SourceDir"> 
     <Directory Id="ProgramMenuFolder"> 
     <Directory Id="ApplicationProgramsFolder" Name="FooBar"/> 
     </Directory> 
     <Directory Id="DesktopFolder" SourceName="Desktop"/> 
     <Directory Id="ProgramFilesFolder"> 
     <Directory Id="FoobarDir" Name="FOOBAR"> 
      <Directory Id="INSTALLLOCATION" Name="FooApp"> 
       <Component Id="MainFiles" Guid="....."> 
       <File Id="FooMainApp" Source="FooMainApp.exe" /> 
       </Component> 
      </Directory> 
     </Directory> 
     </Directory> 
    </Directory> 
    .... 
    <!-- this shortcut here works just fine ... --> 
    <DirectoryRef Id="ApplicationProgramsFolder"> 
     <Component Id="AppShortcut" Guid="..."> 
     <Shortcut Id="ApplicationStartMenuShortcut" 
        Name="FooBarApp" Description="..." 
        Target="[INSTALLLOCATION]FooMainApp.exe" 
        WorkingDirectory="INSTALLLOCATION"/> 
     </Component> 
    </DirectoryRef> 
    <!-- but this shortcut here never seems to work .. ... --> 
    <DirectoryRef Id="DesktopFolder"> 
     <Component Id="DesktopShortcut" Guid="....." > 
      <Shortcut Id="DesktopAppShortcut" 
        Advertise="no" 
        Name="FooBarApp" Description="...." 
        Target="[INSTALLLOCATION]FooMainApp.exe" 
        WorkingDirectory="INSTALLLOCATION"/> 
     </Component> 
    </DirectoryRef> 

Los errores me siguen dando son:

ICE18: KeyPath para Componente: 'DesktopShortcut' es Directorio: 'DesktopFolder'. El par de directorio/componente debe ser en la tabla CreateFolders.
ICE38: Componente DesktopShortcut se instala en el perfil del usuario. Debe usar una clave de registro en HKCU como su KeyPath, no como un archivo.
ICE43: Componente DesktopShortcut no tiene accesos directos anunciados . Debe utilizar una clave de registro en HKCU como su KeyPath, no como un archivo .

No entiendo qué diablos WiX 3/Windows Installer está tratando de decirme aquí ... ¿alguien?

Ambos componentes, AppShortcut y DesktopShortcut, son de hecho parte de la función "principal" - No veo ningún problema allí. No puedo entender por qué en la tierra podría estar mal aquí ....

Actualización: bien, por lo que añade un poco de materia clave de registro a mi acceso directo del escritorio

<Component Id="DesktopShortcut" Guid="BF3587B4-F52E-411E-8814-CFCBF8201C0D"> 
    <RegistryKey Root="HKCU" Key="Software\Foo Inc\FooBarApp\Installed" 
       Action="createAndRemoveOnUninstall"> 
     <RegistryValue Name="DTSC" Value="1" Type="integer" KeyPath="yes"/> 
    </RegistryKey> 
    <Shortcut Id="DesktopShortcut" Directory="DesktopFolder" 
       Name="FooBar" WorkingDirectory="INSTALLLOCATION" 
       Icon="foobar.ico" 
       Target="[INSTALLOCATION]FooMainApp.exe"/> 
</Component> 

ahora los mensajes de hielo son desaparecido, pero cuando intento instalar la aplicación, aparece el error 1909: la carpeta de destino no existe o no tiene permiso para escribir en ella (o algo así)

Actualización 2: El código de muestra anterior proporcionado funciona en Win XP, pero sigue fallando en Win Server 2003: - (¿Alguna idea más?

+0

este tema me hizo también una locura! y todavía está enloqueciendo ... porque necesito hacerlo funcionar en Windows 7 –

Respuesta

17

Aquí está un ejemplo de trabajo de nuestro código de producción en vivo ...

<Fragment> 
    <Component Id="DesktopShortcut" Directory="APPLICATIONFOLDER" Guid="*"> 
     <RegistryValue Id="RegShortcutDesktop" Root="HKCU" 
       Key="SOFTWARE\ACME\settings" Name="DesktopSC" Value="1" 
       Type="integer" KeyPath="yes" /> 
     <Shortcut Id="desktopSC" Target="[APPLICATIONFOLDER]MyApp.exe" 
       Directory="DesktopFolder" Name="My Application" 
       Icon="$(var.product).ico" IconIndex="0" 
       WorkingDirectory="APPLICATIONFOLDER" Advertise="no"/> 
    </Component> 
</Fragment> 
+0

OK, tanques para la muestra - funciona para mí en los clientes de Win XP, pero no en los servidores de Win Server 2003 :-( –

+0

hmm, eso parece bastante extraño. Sugiere comparar perfiles móviles de 32/64 bits o locales? Funciona en la consola pero no en el escritorio remoto, etc. ? – saschabeaumont

+0

Mi servidor Win2003 es una versión de 32 bits, en una máquina virtual VMWare. Lo mismo para mi máquina de prueba WinXP (también una máquina virtual). De todos modos, como lo necesito solo para XP, eso resuelve mi problema. ¡Gracias! –

6

Cada uno de estos mensajes ICE se queja básicamente de lo mismo: un componente que instala un acceso directo debe tener una entrada de registro como keypath. Para solucionar esto, agregue algo como esto al componente:

<RegistryValue Root="HKCU" Key="Software\MyCompany\MyApplicationName" 
    Name="desktopShortcut" Type="integer" Value="1" KeyPath="yes"/> 

Lo mismo aplica para el componente que instala el acceso directo del menú Inicio. Eche un vistazo al relacionado wix documentation sample about creating a shortcut.

+0

Lo curioso es que el acceso directo del menú de la aplicación funciona a la perfección, sin necesidad de claves de registro. Solo el atajo de escritorio no aparecerá :-( –

+0

Funciona bien en Win XP ahora, pero sigue fallando con el Error 1909 - No se puede crear un enlace de acceso directo ....... en Win Server 2003 –

2

Mi propósito es crear un vínculo de acceso directo a Internet y poner en el escritorio.Aquí está el código que funciona para mí:

<?xml version="1.0" encoding="utf-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"> 
    <Product Id="09F1B63D-FB03-43FD-A326-FD49F93D00C8" Name="TestProduct" Language="1033" Version="0.0.0.1" Manufacturer="WixEdit" UpgradeCode="6B2F9AB4-73A6-45CB-9EC4-590D1AAA6779"> 
     <Package Description="Test file in a Product" Comments="Simple test" InstallerVersion="200" Compressed="yes" /> 
     <Media Id="1" Cabinet="simple.cab" EmbedCab="yes" /> 
     <Directory Id="TARGETDIR" Name="SourceDir"> 
      <Directory Id="ProgramFilesFolder" Name="PFiles"> 
       <Directory Name="AAAA" Id="AAABBB"> 
        <Component Id="AAAA"> 
         <File Id="AAAA.EXE" Name="AAAA.exe" Source="U:\web\bin\x86\Release\AAAA.exe" /> 
        </Component> 
       </Directory> 
      </Directory> 
      <Directory Id="DesktopFolder"> 
        <Component Id="StartMenuShortcuts" Guid="E8EDD7BC-9762-4C3D-8341-FAEC983D318A"> 
         <RemoveFolder Id="ProgramMenuDir" On="uninstall" /> 
         <RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Value="" /> 
         <util:InternetShortcut Id="WebsiteShortcut" Name="AAAA Website" Target="http://www.AAAA.com" /> 
        </Component> 
      </Directory> 
     </Directory> 
     <Feature Id="DefaultFeature" Title="Main Feature" Level="1"> 
      <ComponentRef Id="StartMenuShortcuts" /> 
      <ComponentRef Id="AAAA" /> 
     </Feature> 
     <UI /> 
    </Product> 
</Wix> 

NOTA: hay que añadir lo siguiente a su vela y luz líneas comando: WiXUtilExtension -ext

0

No estoy seguro si esto era disponibles en el 2010, pero así es como lo hago en WiX 3.7:

<Directory Id="TARGETDIR" Name="SourceDir"> 
    <Directory Id="DesktopFolder" SourceName="Desktop" /> 
    <Directory Id="MergeRedirectFolder"> 
    <Component Id="MyExeComponent" Guid="{PUT-GUID-HERE}"> 
     <File Id="MyExeFile" Source="$(var.ExeSourcePath)" KeyPath="yes"> 
     <Shortcut 
      Id="DesktopShortcut" 
      Directory="DesktopFolder" 
      Name="$(var.ShortcutName)" 
      WorkingDirectory="MergeRedirectFolder" /> 
     </File> 
    </Component> 
    </Directory> 
</Directory> 
7

esto se basa en la respuesta de @ saschabeaumont, pero esperemos que con algunos consejos útiles adicionales para nosotros los principiantes de WiX (¿es una pesadilla para todo el mundo aprender?).

primer lugar, crear un fragmento que contiene la propia información de acceso directo:

<Fragment> 
<Component Id="DesktopShortcut" Directory="INSTALLFOLDER" Guid="*"> 
    <RegistryValue Id="RegShortcutDesktop" 
      Root="HKCU" 
      Key="Software\Company\ApplicationName" 
      Name="DesktopSC" 
      Value="1" 
      Type="integer" 
      KeyPath="yes" /> 

    <Shortcut Id="desktopSC" 
      Target="[INSTALLFOLDER]ApplicationName.exe" 
      WorkingDirectory="INSTALLFOLDER" 
      Icon="icon.ico" 
      Directory="DesktopFolder" 
      Name="ApplicationName" 
      Advertise="no"/> 
</Component> 
</Fragment> 

A continuación, tenga en cuenta que este fragmento será necesario incluir en la Product element, así:

<Feature Id="ProductFeature" Title="Your Application Title" Level="1"> 
    ... 
    <ComponentRef Id="DesktopShortcut" /> 
</Feature> 

El ProductFeature es probable que contiene otros fragmentos, como archivos, y el fragmento de acceso directo del menú del programa.

Además, el DesktopFolder necesitarán una referencia en el TARGETDIR directory element (que será muy probable contener otras carpetas, como ProgramMenuFolder como sea necesario), así:

<Directory Id="TARGETDIR" Name="SourceDir"> 
    ... 
    <Directory Id="DesktopFolder" Name="Desktop"/> 
</Directory> 
+2

¿Qué sucede si desea que el acceso directo esté en el perfil Todos los usuarios ?, no se puede establecer ALLUSERS = 1 y usar HKLM para el acceso directo en el acceso directo. ICE57 – neslekkiM

Cuestiones relacionadas