Alex Shevchuk

Always listen to experts. They’ll tell you what can’t be done, and why. Then do it. - Lazarus Long

Property created in UI sequence lost its value in Execute sequence

Property created in UI sequence lost its value in Execute sequence

  • Comments 3
  • Likes

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]' />

 

Comments
  • Hi Alex,

     I have the reverse issue: I am setting a custom public property (that exists on the client side) during execution in the server process.  I want the value that I set in the server process to be available to the Windows Installer when I go back to the client, but when I get back, the value has remained the same as it was before I went to the server.

     Is it possible to do what I want?  Is there a window in the client process after I come back from the server to pick up this value from the registry and assign it then?

      thank you, Rob

  • Hmm.  That is unusual requirement.  Because there are no standard actions to run after ExecuteAction I assume you are going to use some custom action.  So, it is up to you how to pass the property back to the client process.  I don't know if Windows Installer psses properties back from server process to client process and based on your testing it does not look like it passes them back.  So, use whatever mechanism you prefer to persist property value - registry, some file in temp folder, .ini file in windows directory, etc.  Sorry, I don't know if any "standard" method exists for this particular situation.

    Alex

  •  Thanks for your quick reply!

     I do have a couple of functions already to write to and read from the registry to deal with deferred and commit CAs that need values.

     However, I tried to insert an immediate Installscript CA after the ExecuteAction SA yesterday, and looking at the log, the Installer didn't even call it, so I must be doing something wrong.

     Rob

Your comment has been posted.   Close
Thank you, your comment requires moderation so it may take a while to appear.   Close
Leave a Comment