2011-03-29 24 views
11

estoy usando WixUI_Advanced secuencia para permitir a los usuarios elegir carpeta de destino por equipo o por usuario de instalación y cambio. Mi proyecto WiX está destinado a producir x86 y x64 MSI (estoy usando WiX Tips and Tricks recomendaciones). También guardo la aplicación carpeta de instalación en el registro para las principales actualizaciones (utilizo la propiedad APPLICATIONFOLDER y el ID del directorio, en lugar de INSTALLLOCATION, según los requisitos de WixUI_Advanced).WiX: ¿Cómo anular "C: Archivos de programa (x86)" en la máquina x64 en secuencia WixUI_Advanced?

Hay una bug in WixUI_Advanced sequence que hace que el diálogo Carpeta de destino para mostrar la carpeta de aplicaciones bajo C: \ Archivos de programa (x86) en lugar de C: \ Archivos de programa cuando se ejecuta en una máquina de 64 bits, incluso cuando el código establece correctamente la carpeta de la aplicación en la propiedad ProgramFiles64Folder. El comentario del rastreador de errores sugiere usar el elemento SetDirectory para establecer el valor de APPLICATIONFOLDER, pero hay sin ejemplo que explica cómo hacerlo. Cuando lo intenté, sí marcó la diferencia (también encontré una cantidad de publicaciones recomendando el uso de una acción personalizada para establecer APLICACIÓN DE CARPETA, pero ninguna me funcionó). ¿Alguien sabe cómo hacer que la secuencia WixUI_Advanced muestre la carpeta correcta de "Archivos de programa" en un sistema de 64 bits (y también muestre la carpeta originalmente seleccionada durante las principales actualizaciones)?

Si ayuda, voy a ofrecer fragmentos de muestra WXS, pero más o menos siguen las recomendaciones de WiX Tips and Tricks puesto de stackoverflow. Además, mi paquete MSI de 64 bits es realmente un paquete de 64 bits (tengo el paquete y los componentes marcados como 'x64' y no se ejecuta en plataformas de 32 bits). Estoy usando WiX 3.6 y Visual Studio 2010 .

CÓDIGO dE mUESTRA:

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 

<Product 
    Id="81955f17-31f3-4e51-8294-372f96141c00" 
    Name="WiX64BitDemo" 
    Language="1033" 
    Version="1.0.0.0" 
    Manufacturer="Test" 
    UpgradeCode="5bed9777-bea6-4dc3-91d7-5dd93819563a"> 

<Package 
    InstallerVersion="300" 
    Compressed="yes" 
    InstallScope="perMachine" 
    Platform="x64" /> 

<MajorUpgrade 
    AllowSameVersionUpgrades="no" 
    DowngradeErrorMessage="Can't downgrade." 
    Schedule="afterInstallInitialize" /> 

<Media 
    Id="1" 
    Cabinet="media1.cab" 
    EmbedCab="yes" /> 

<Property Id="APPLICATIONFOLDER" Secure="yes"> 
    <RegistrySearch Id="FindInstallLocation" 
     Root="HKLM" 
     Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[WIX_UPGRADE_DETECTED]" 
     Name="InstallLocation" 
     Type="raw" 
     Win64="yes" /> 
</Property> 

<Property Id="ApplicationFolderName" Value="WiX64BitDemo" /> 
<Property Id="WixAppFolder" Value="WixPerMachineFolder" /> 

<SetDirectory 
    Id="APPLICATIONFOLDER" 
    Value="[ProgramFiles64Folder][ApplicationFolderName]">APPLICATIONFOLDER=""</SetDirectory> 

<Directory Id="TARGETDIR" Name="SourceDir"> 
    <Directory Id="ProgramFiles64Folder"> 
     <Directory Id="APPLICATIONFOLDER" Name="WiX64BitDemo"> 
      <Component 
       Id="ReadmeComponent" 
       Guid="*" 
       Win64="yes"> 

       <File 
        Id="ReadmeFile" 
        Name="readme.txt" 
        Source="$(var.ProjectDir)readme.txt" 
        KeyPath="yes"/> 
      </Component> 
     </Directory> 
    </Directory> 
</Directory> 

<Feature Id="ProductFeature" Title="WiX64BitDemo" Level="1"> 
    <ComponentRef Id="ReadmeComponent" /> 
</Feature> 

<UI Id="UISequence"> 
    <UIRef Id="WixUI_Advanced"/> 
</UI> 

</Product> 
</Wix> 

Muchas gracias a Sascha Beaumont para la solución de este problema aquí es la muestra de trabajo:.

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
<Product 
    Id="81955f17-31f3-4e51-8294-372f96141c00" 
    Name="WiX64BitDemo" 
    Language="1033" 
    Version="1.0.0.0" 
    Manufacturer="Test" 
    UpgradeCode="5bed9777-bea6-4dc3-91d7-5dd93819563a"> 

<Package 
    InstallerVersion="300" 
    Compressed="yes" 
    InstallScope="perMachine" 
    Platform="x64" /> 

<MajorUpgrade 
    AllowSameVersionUpgrades="no" 
    DowngradeErrorMessage="Can't downgrade." 
    Schedule="afterInstallInitialize" /> 

<Media 
    Id="1" 
    Cabinet="media1.cab" 
    EmbedCab="yes" /> 

<Property Id="APPLICATIONFOLDER" Secure="yes"> 
    <RegistrySearch Id="FindInstallLocation" 
     Root="HKLM" 
     Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[WIX_UPGRADE_DETECTED]" 
     Name="InstallLocation" 
     Type="raw" 
     Win64="yes" /> 
</Property> 

<Property Id="ApplicationFolderName" Value="WiX64BitDemo" /> 
<Property Id="WixAppFolder" Value="WixPerMachineFolder" /> 

<SetDirectory 
    Id="APPLICATIONFOLDER" 
    Value="[ProgramFiles64Folder][ApplicationFolderName]">APPLICATIONFOLDER=""</SetDirectory> 

<Directory Id="TARGETDIR" Name="SourceDir"> 
    <Directory Id="ProgramFiles64Folder"> 
     <Directory Id="APPLICATIONFOLDER" Name="WiX64BitDemo"> 
      <Component 
       Id="ReadmeComponent" 
       Guid="*" 
       Win64="yes"> 

       <File 
        Id="ReadmeFile" 
        Name="readme.txt" 
        Source="$(var.ProjectDir)readme.txt" 
        KeyPath="yes"/> 
      </Component> 
     </Directory> 
    </Directory> 
</Directory> 

<Feature Id="ProductFeature" Title="WiX64BitDemo" Level="1"> 
    <ComponentRef Id="ReadmeComponent" /> 
</Feature> 

<UI Id="UISequence"> 
    <UIRef Id="WixUI_Advanced"/> 
</UI> 

<CustomAction 
     Id="OverwriteWixSetDefaultPerMachineFolder" 
     Property="WixPerMachineFolder" 
     Value="[APPLICATIONFOLDER]" 
     Execute="immediate" 
/> 

<CustomAction 
    Id="SetARPINSTALLLOCATION" 
    Property="ARPINSTALLLOCATION" 
    Value="[APPLICATIONFOLDER]" 
/> 

<InstallUISequence> 
    <Custom Action="OverwriteWixSetDefaultPerMachineFolder" After="WixSetDefaultPerMachineFolder" /> 
</InstallUISequence> 

<InstallExecuteSequence> 
    <Custom Action="OverwriteWixSetDefaultPerMachineFolder" After="WixSetDefaultPerMachineFolder" /> 
    <Custom Action="SetARPINSTALLLOCATION" After="InstallValidate"/> 
</InstallExecuteSequence> 

</Product> 
</Wix> 

Respuesta

9

Algo como esto sería probablemente el truco:

<MajorUpgrade AllowSameVersionUpgrades="yes" 
      DowngradeErrorMessage="Can't downgrade." 
      Schedule="afterInstallInitialize" /> 


<Property Id="APPLICATIONFOLDER" Secure="yes"> 
    <RegistrySearch Id="FindInstallLocation" 
     Root="HKLM" 
     Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[WIX_UPGRADE_DETECTED]" 
     Name="InstallLocation" 
     Type="raw" 
     Win64="yes" /> 
</Property> 


<CustomAction Id="Overwrite_WixSetDefaultPerMachineFolder" Property="WixPerMachineFolder" Value="[ProgramFiles64Folder][ApplicationFolderName]" Execute="immediate" /> 
<InstallUISequence> 
    <Custom Action="Overwrite_WixSetDefaultPerMachineFolder" After="WixSetDefaultPerMachineFolder" /> 
</InstallUISequence> 
<InstallExecuteSequence> 
    <Custom Action="Overwrite_WixSetDefaultPerMachineFolder" After="WixSetDefaultPerMachineFolder" /> 
</InstallExecuteSequence> 

<SetProperty Id="ARPINSTALLLOCATION" Value="[APPLICATIONFOLDER]" After="CostFinalize" /> 

ACTUALIZACIÓN:SetDirectory horarios de la acción antes de la WixSetDefaultPerMachineFolder - códigos actualizadas para los elementos programados manualmente para programar entre WixSetDefaultPerMachineFolder y WixSetPerMachineFolder. Probado muy bien con el código de ejemplo OP bajo Win7 x64

Update2: acción añaden al conjunto de ARPINSTALLOCATION como http://robmensching.com/blog/posts/2011/1/14/ARPINSTALLLOCATION-and-how-to-set-it-with-the-WiX-toolset

+0

Gracias Sascha, pero parece que no funciona. Actualicé la publicación para incluir el ejemplo completo del archivo WXS (instala un solo archivo Readme.txt ubicado en la carpeta del proyecto). Cuando lo ejecuto en un servidor de Windows 2008 de 64 bits, el cuadro de diálogo Carpeta de destino aún apunta a la carpeta Archivos de programa (x86). ¿Hay algo mal con el código? –

+0

Hola Alek, mira la publicación actualizada - esto estuvo bien para mí en Win7 x64 en una prueba de humo de 5 minutos :) – saschabeaumont

+0

¡¡¡Dulce !!! Parece que está funcionando. Muchas gracias, Sascha! –

0

creo que es necesario para establecer la propiedad Win64-Yes para uno de los nodos.

+1

Ya está configurado en Win64 = "sí" en todos los componentes (para la compilación x64). –

6

que tenía que cambiar dos cosas para hacer WIX poner mi aplicación de 64 bits en la carpeta Archivos de programa:

A. En el elemento de WIX paquete, añada 'Plataforma = '64'':

& lsaquo; Descripción del paquete = "desc ..." Fabricante =" empresa ..." InstallerVersion = "200" Plataforma = "64" comprimido = "yes"/ Y rsaquo;

B. En el elemento de directorio para la carpeta superior, cambiar ProgramFilesFolder a ProgramFiles64Folder:

y lsaquo; Directory Id = "ProgramFiles64Folder "name =" PFiles" y rsaquo;

(también tenía que incluir el y lsaquo; name & rsaquo programa; archivo exe.config en la carpeta para el programa de funciona correctamente)

+0

Esto no funciona cuando se usa 'WixUI_Advanced' como estipula el OP. –

Cuestiones relacionadas