How to write the MsiPackage / InstallCondition based on a string comparison in a Wix bundle?

3

In my WiX Bootstrapper Application I want to install a 32bit OR a 64bit MsiPackage depending on the Outlook Bitness. So I search for the registry value (it can be x64 or x86), read it into a variable and set the InstallCondition of each MsiPackage to a string comparison of the variable with the appropriate value.

The result ist unexpected. The string comparison obviously doesn't work.

My Bundle.wxs looks like this:

<Wix ...>
<Bundle ... >
  <util:RegistrySearchRef Id="VSTORuntimeTest" />
  <util:RegistrySearchRef Id="VSTORuntimeVersionV4R" />
  <util:RegistrySearchRef Id="VSTORuntimeVersionV4" />

  <util:RegistrySearchRef Id="Outlook14Installed"/>
  <util:RegistrySearchRef Id="Outlook15Installed"/>
  <util:RegistrySearchRef Id="Outlook16Installed"/>
  <util:RegistrySearchRef Id="Outlook14Bitness"/>
  <util:RegistrySearchRef Id="Outlook15Bitness"/>
  <util:RegistrySearchRef Id="Outlook16Bitness"/>

  <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense">
    <bal:WixStandardBootstrapperApplication ... />
  </BootstrapperApplicationRef>
  <Variable Name="InstallSubFolder"
          Type="string"
          Value="$(var.CompanyFolderName)\$(var.ProductFolderName)" />

  <Chain>
    <PackageGroupRef Id="NetFx40Web"/>

    <ExePackage Id="VSTORuntime" SourceFile="$(var.SolutionDir)\WiX\vstor_redist.exe" Permanent="yes" Vital="yes" Cache="no" Compressed="no"
        DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=158917"
        PerMachine="yes"
        InstallCommand="/q /norestart"
        DetectCondition="VSTORFeature"
        InstallCondition="NOT VSTORFeature OR NOT (VSTORVersionV4R >=v10.0.40303) OR NOT (VSTORVersionV4 >=v10.0.21022)" />

    <MsiPackage
      Id="OLAddin64bit"
      Vital="yes"
      Name="$(var.ProductName) 64 bit"
      SourceFile="$(var.Setup_64bit_WiX.TargetPath)"
      InstallCondition="OLBitness = x64">
      <MsiProperty Name="INSTALLLOCATION" Value="[ProgramFiles64Folder][InstallSubFolder]"/>
    </MsiPackage>

    <MsiPackage
      Id="OLAddin32bit"
      Vital="yes"
      Name="$(var.ProductName) 32 bit"
      SourceFile="$(var.Setup_32bit_WiX.TargetPath)"
      InstallCondition="NOT (OLBitness = x64)">
      <MsiProperty Name="INSTALLLOCATION" Value="[ProgramFilesFolder][InstallSubFolder]"/>
    </MsiPackage>
  </Chain>
</Bundle>

<Fragment>
  <util:RegistrySearch Id="VSTORuntimeTest" Root="HKLM" Key="SOFTWARE\Microsoft\VSTO Runtime Setup\v4R\" Value="VSTORFeature_CLR40" Variable="VSTORFeature"/>
  <util:RegistrySearch Id="VSTORuntimeVersionV4R" Root="HKLM" Key="SOFTWARE\Microsoft\VSTO Runtime Setup\v4R\" Value="Version" Variable="VSTORVersionV4R"/>
  <util:RegistrySearch Id="VSTORuntimeVersionV4" Root="HKLM" Key="SOFTWARE\Microsoft\VSTO Runtime Setup\v4\" Value="Version" Variable="VSTORVersionV4"/>

  <util:RegistrySearch Id="Outlook14Installed" Root="HKLM" Key="SOFTWARE\Microsoft\Office\14.0\Outlook\InstallRoot\"                            Variable="Outlook14Installed"  Result="exists" Win64="yes"/>
  <util:RegistrySearch Id="Outlook15Installed" After="Outlook14Installed" Root="HKLM" Key="SOFTWARE\Microsoft\Office\15.0\Outlook\InstallRoot\" Variable="Outlook15Installed"  Result="exists" Win64="yes" />
  <util:RegistrySearch Id="Outlook16Installed" After="Outlook15Installed" Root="HKLM" Key="SOFTWARE\Microsoft\Office\16.0\Outlook\InstallRoot\" Variable="Outlook16Installed"  Result="exists" Win64="yes" />

  <util:RegistrySearch Id="Outlook14Bitness" Condition="Outlook14Installed" Variable="OLBitness" After="Outlook16Installed" Root="HKLM" Key="SOFTWARE\Microsoft\Office\15.0\Outlook\" Value="Bitness" Win64="yes" />
  <util:RegistrySearch Id="Outlook15Bitness" Condition="Outlook15Installed" Variable="OLBitness" After="Outlook16Installed" Root="HKLM" Key="SOFTWARE\Microsoft\Office\15.0\Outlook\" Value="Bitness" Win64="yes" />
  <util:RegistrySearch Id="Outlook16Bitness" Condition="Outlook16Installed" Variable="OLBitness" After="Outlook16Installed" Root="HKLM" Key="SOFTWARE\Microsoft\Office\16.0\Outlook\" Value="Bitness" Win64="yes" />

  <bal:Condition
    Message="Outlook 2010 or newer required.">
    Outlook14Installed Or Outlook15Installed or Outlook16Installed
  </bal:Condition>
</Fragment>

</Wix>

The installer now writes the following log:

[5FBC:FE84][2016-04-22T16:30:05]i001: Burn v3.10.1.2213, Windows v6.3 (Build 9600: Service Pack 0), path: Setup.exe
[5FBC:FE84][2016-04-22T16:30:05]i000: Initializing string variable 'InstallSubFolder' to value 'foo'
[5FBC:FE84][2016-04-22T16:30:05]i009: Command Line: ''
...
[5FBC:FE84][2016-04-22T16:30:05]i100: Detect begin, 4 packages
[5FBC:FE84][2016-04-22T16:30:05]i000: Setting string variable 'NETFRAMEWORK40' to value '1'
[5FBC:FE84][2016-04-22T16:30:05]i000: Registry key not found. Key = 'SOFTWARE\Microsoft\Office\14.0\Outlook\InstallRoot\'
[5FBC:FE84][2016-04-22T16:30:05]i000: Setting numeric variable 'Outlook14Installed' to value 0
[5FBC:FE84][2016-04-22T16:30:05]i000: Registry key not found. Key = 'SOFTWARE\Microsoft\Office\15.0\Outlook\InstallRoot\'
[5FBC:FE84][2016-04-22T16:30:05]i000: Setting numeric variable 'Outlook15Installed' to value 0
[5FBC:FE84][2016-04-22T16:30:05]i000: Setting numeric variable 'Outlook16Installed' to value 1
[5FBC:FE84][2016-04-22T16:30:05]i052: Condition 'Outlook14Installed' evaluates to false.
[5FBC:FE84][2016-04-22T16:30:05]i052: Condition 'Outlook15Installed' evaluates to false.
[5FBC:FE84][2016-04-22T16:30:05]i052: Condition 'Outlook16Installed' evaluates to true.
[5FBC:FE84][2016-04-22T16:30:05]i000: Setting string variable 'OLBitness' to value 'x64'
[5FBC:FE84][2016-04-22T16:30:05]i000: Setting string variable 'VSTORFeature' to value '1'
[5FBC:FE84][2016-04-22T16:30:05]i000: Setting string variable 'VSTORVersionV4' to value '10.0.60301'
[5FBC:FE84][2016-04-22T16:30:05]i000: Setting string variable 'VSTORVersionV4R' to value '10.0.50903'
[5FBC:FE84][2016-04-22T16:30:05]i052: Condition 'NETFRAMEWORK40' evaluates to true.
[5FBC:FE84][2016-04-22T16:30:05]i052: Condition 'VSTORFeature' evaluates to true.
[5FBC:FE84][2016-04-22T16:30:05]i101: Detected package: NetFx40Web, state: Present, cached: None
[5FBC:FE84][2016-04-22T16:30:05]i101: Detected package: VSTORuntime, state: Present, cached: None
[5FBC:FE84][2016-04-22T16:30:05]i101: Detected package: Addin64bit, state: Absent, cached: None
[5FBC:FE84][2016-04-22T16:30:05]i101: Detected package: Addin32bit, state: Absent, cached: None
[5FBC:FE84][2016-04-22T16:30:05]i052: Condition 'Outlook14Installed Or Outlook15Installed or Outlook16Installed' evaluates to true.
[5FBC:FE84][2016-04-22T16:30:05]i199: Detect complete, result: 0x0
[5FBC:10EE4][2016-04-22T16:30:07]i000: Setting numeric variable 'EulaAcceptCheckbox' to value 1
[5FBC:FE84][2016-04-22T16:30:07]i200: Plan begin, 4 packages, action: Install
[5FBC:FE84][2016-04-22T16:30:07]w321: Skipping dependency registration on package with no dependency providers: NetFx40Web
[5FBC:FE84][2016-04-22T16:30:07]i052: Condition 'NOT VSTORFeature OR NOT (VSTORVersionV4R >=v10.0.40303) OR NOT (VSTORVersionV4 >=v10.0.21022)' evaluates to false.
[5FBC:FE84][2016-04-22T16:30:07]w321: Skipping dependency registration on package with no dependency providers: VSTORuntime
[5FBC:FE84][2016-04-22T16:30:07]i052: Condition 'OLBitness=x64' evaluates to false.
[5FBC:FE84][2016-04-22T16:30:07]i052: Condition 'NOT (OLBitness=x64)' evaluates to true.
[5FBC:FE84][2016-04-22T16:30:07]i000: Setting string variable 'WixBundleRollbackLog_Addin32bit' to value 'foo.log'
[5FBC:FE84][2016-04-22T16:30:07]i000: Setting string variable 'WixBundleLog_OLPlannerAddin32bit' to value 'foo.log'
[5FBC:FE84][2016-04-22T16:30:07]i201: Planned package: NetFx40Web, state: Present, default requested: Present, ba requested: Present, execute: None, rollback: None, cache: No, uncache: No, dependency: None
[5FBC:FE84][2016-04-22T16:30:07]i201: Planned package: VSTORuntime, state: Present, default requested: Absent, ba requested: Absent, execute: None, rollback: None, cache: No, uncache: No, dependency: None
[5FBC:FE84][2016-04-22T16:30:07]i201: Planned package: Addin64bit, state: Absent, default requested: Absent, ba requested: Absent, execute: None, rollback: None, cache: No, uncache: No, dependency: None
[5FBC:FE84][2016-04-22T16:30:07]i201: Planned package: Addin32bit, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, cache: Yes, uncache: No, dependency: Register
[5FBC:FE84][2016-04-22T16:30:07]i299: Plan complete, result: 0x0
[5FBC:FE84][2016-04-22T16:30:07]i300: Apply begin
[5FBC:FE84][2016-04-22T16:30:07]i010: Launching elevated engine process.
...
[5FBC:FE84][2016-04-22T16:30:15]i399: Apply complete, result: 0x80070642, restart: None, ba requested restart:  No
[5FBC:FE84][2016-04-22T16:30:16]i500: Shutting down, exit code: 0x642
[5FBC:FE84][2016-04-22T16:30:16]i410: Variable: EulaAcceptCheckbox = 1
[5FBC:FE84][2016-04-22T16:30:16]i410: Variable: InstallSubFolder = foo
[5FBC:FE84][2016-04-22T16:30:16]i410: Variable: NETFRAMEWORK40 = 1
[5FBC:FE84][2016-04-22T16:30:16]i410: Variable: OLBitness = x64
[5FBC:FE84][2016-04-22T16:30:16]i410: Variable: Outlook14Installed = 0
[5FBC:FE84][2016-04-22T16:30:16]i410: Variable: Outlook15Installed = 0
[5FBC:FE84][2016-04-22T16:30:16]i410: Variable: Outlook16Installed = 1
[5FBC:FE84][2016-04-22T16:30:16]i410: Variable: VSTORFeature = 1
[5FBC:FE84][2016-04-22T16:30:16]i410: Variable: VSTORVersionV4 = 10.0.60301
[5FBC:FE84][2016-04-22T16:30:16]i410: Variable: VSTORVersionV4R = 10.0.50903
[5FBC:FE84][2016-04-22T16:30:16]i410: Variable: WixBundleAction = 5
[5FBC:FE84][2016-04-22T16:30:16]i410: Variable: WixBundleElevated = 0
[5FBC:FE84][2016-04-22T16:30:16]i410: Variable: WixBundleFileVersion = 1.0.0.0
[5FBC:FE84][2016-04-22T16:30:16]i410: Variable: WixBundleInstalled = 0
...
[5FBC:FE84][2016-04-22T16:30:16]i007: Exit code: 0x642, restarting: No

It states:

  1. Setting string variable 'OLBitness' to value 'x64'
  2. Condition 'OLBitness=x64' evaluates to false
  3. Variable: OLBitness = x64

Why evaluates the condition to false while the value obviously seems to be the expected?

How can I write the InstallCondition to test for equality of strings?

Can I use a property and if so how would I do that?

I found examples for RegistrySearches with Result="exists" but not with Result="value".

Thanks for any hints!

wix
bootstrapper
asked on Stack Overflow Apr 22, 2016 by Heiko B.

1 Answer

1

Try

InstallCondition="OLBitness ~= &quot;x64&quot;"

and

InstallCondition="NOT (OLBitness ~= &quot;x64&quot;)"

the OLBitness variable is a "string" variable and I think the x64 might get picked up by the parsing as a int represented in hex or something?? Then when it tries to convert the string to an int it converts it really wrongly so they never match.

You can debug this but it takes a while to set up. I had to do this for when I was trying to compare versions. When you use a registry search the variable type is always string. The condition.cpp in the engine vcproj from wix source is smart enough to try and convert a string variable to another type (numeric, version) then comparing. And it turns out I just spelled the variables name incorrectly......

Anyways, you could also add

<Variable Id="x64Bitness" Value="x64" Type="string" />

to your Bundle and then in the install condition compare it to x64Bitness instead of "x64" and that would force string comparison.

answered on Stack Overflow Apr 22, 2016 by Brian Sutherland

User contributions licensed under CC BY-SA 3.0