Property created in UI sequence lost its value in Execute sequence

Problem

You create a property in the UI sequence and set its value.  When you try to use this property in the Execute sequence, the property is missing or blank.

Sample

In this sample we will use Application Search to find the installation path to the Zune software during execution of the InstallUISequence.  We will use that property to launch the Zune.exe at the end of installation.

Here is the WiX source:

<?xml version="1.0" encoding="UTF-8"?>

<Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi">

  <Product Id="{E2842676-5648-4A17-8993-E4BA183AAB55}"

           Name="Minimal Windows Installer Sample"

           Language="1033"

           Codepage="1252"

           Version="1.0.0"

           Manufacturer="Acme Corporation"

           UpgradeCode="{57068987-D43F-4B69-AD33-0B2CB755F6FB}">

    <Package Id="{????????-????-????-????-????????????}"

             Description="Minimal Windows Installer Sample"

             Comments="This installer database contains the logic and data required to install [ProductName]."

             InstallerVersion="200"

             Languages="1033"

             SummaryCodepage="1252"

             Platforms="Intel"

             ReadOnly="no"

             Compressed="yes"

             AdminImage="no"

             Keywords="Installer"

             ShortNames ="no"

             Manufacturer="Acme Corporation" />

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

    <Directory Id="TARGETDIR" Name="SourceDir">

      <Directory Id="ProgramFilesFolder">

        <Directory Id="INSTALLDIR" Name="Minimal" LongName="MinimalInstallation">

          <Component Id="Component1"

                     Guid="{73440E8A-D60D-4600-A4EF-F9716D1D2AD8}">

            <File Id="ReadMe" DiskId="1" Name="Readme.txt" Source="Readme.txt" Vital="yes" KeyPath="yes" />

          </Component>

        </Directory>

      </Directory>

    </Directory>

    <!-- Find Zune's installation path -->

    <Property Id="ZUNEFOLDER">

      <RegistrySearch Id="ZuneReg"

                      Root="HKLM"

                      Key="SOFTWARE\Microsoft\Zune"

                      Name="Installation Directory"

                      Type="raw" />

    </Property>

    <!-- Set the property to the <path>\Zune.exe -->

    <CustomAction Id="SetZunePath"

                  Property="ZunePath"

                  Value="[ZUNEFOLDER]Zune.exe" />

    <!-- Custom action to start the executable -->

    <CustomAction Id="StartZune"

                  Property="ZunePath"

                  ExeCommand=""

                  Return="asyncNoWait" />

    <InstallExecuteSequence>

      <Custom Action="StartZune" After="InstallFinalize">Not Installed</Custom>

    </InstallExecuteSequence>

    <InstallUISequence>

      <Custom Action="SetZunePath" After="AppSearch" />

    </InstallUISequence>

    <Feature Id="Feature1"

             Title="Feature1 title"

             Description="Feature1 description"

             Level="1"

             ConfigurableDirectory="INSTALLDIR" >

      <ComponentRef Id="Component1" />

    </Feature>

  </Product>

</Wix>

Compile this code using the following commands:

d:\Wix\candle.exe Minimal.wxs

d:\Wix\light.exe -out Minimal.msi Minimal.wixobj

When we install this installation package, it installs successfully, but Zune.exe is not launched.

Let's add the custom action Type 19 to see the value of ZunePath property:

<CustomAction Id='PrintZunePath' Error='ZunePath=[ZunePath]' />

<InstallExecuteSequence>

  <Custom Action="StartZune" After="InstallFinalize">Not Installed</Custom>

  <Custom Action='PrintZunePath' After='StartZune' />

</InstallExecuteSequence>

At the end of installation we will see the message box with the message "ZunePath=".  Obviously, our ZunePath property is empty or, more likely, does not exist.  How is that possible?

Remember that Microsoft Windows Installer has two processes: client and server.  All UI sequence actions are done in the client process and all Execute sequence actions - in the server process.  Only public properties are passed from client to server process.

So, to fix this problem, simply change the name of the ZunePath property to ZUNEPATH:

<!-- Set the property to the <path>\Zune.exe -->

<CustomAction Id="SetZunePath"

              Property="ZUNEPATH"

              Value="[ZUNEFOLDER]Zune.exe" />

<!-- Custom action to start the executable -->

<CustomAction Id="StartZune"

              Property="ZUNEPATH"

              ExeCommand=""

              Return="asyncNoWait" />

<CustomAction Id='PrintZunePath' Error='ZUNEPATH=[ZUNEPATH]' />