2016-04-22 4 views
3

In meiner WiX Bootstrapper Anwendung möchte ich je nach der Outlook Bitness ein 32bit ODER ein 64bit MsiPackage installieren. Also suche ich nach dem Registrierungswert (es kann x64 oder x86 sein), lese es in eine Variable und setze die InstallCondition jedes MsiPackage auf einen Zeichenfolgenvergleich der Variablen mit dem entsprechenden Wert.Wie schreibe ich die MsiPackage/InstallCondition basierend auf einem String-Vergleich in einem Wix-Bundle?

Das Ergebnis ist unerwartet. Der String Vergleich funktioniert offensichtlich nicht.

Mein Bundle.wxs sieht wie folgt aus:

<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> 

Das Installationsprogramm schreibt nun das folgende Protokoll:

[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 

Darin heißt es:

  1. Zeichenfolge einstellen Variable 'OLBitness' zu Wert 'x64'
  2. Bedingung 'OLBitness = x64' ergibt false
  3. Variable: OLBitness = x64

Warum die Bedingung false, während der Wert scheint offensichtlich das zu erwarten?

Wie kann ich die InstallCondition schreiben, um auf Gleichheit der Zeichenketten zu prüfen?

Kann ich eine Eigenschaft verwenden und wenn ja, wie würde ich das tun?

Ich fand Beispiele für RegistrySearches mit Result = "exists" aber nicht mit Result = "value".

Danke für Hinweise!

+0

http://stackoverflow.com/questions/6231950/using-wix-to-create-32bit-and-64bit-installers-from-one-wxs-file Könnte helfen – ChrisBint

Antwort

1

Versuchen

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

und

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

die OLBitness Variable ein "string" Variable ist, und ich denke, dass die x64 könnte durch die Analyse als int in Hex oder etwas repräsentiert abgeholt? ? Wenn es dann versucht, die Zeichenfolge in einen int zu konvertieren, konvertiert es es wirklich falsch, so dass sie nie übereinstimmen.

Sie können dies debuggen, aber es dauert eine Weile einzurichten. Ich musste dies tun, als ich versuchte, Versionen zu vergleichen. Wenn Sie eine Registrierungssuche verwenden, ist der Variablentyp immer eine Zeichenfolge. Die condition.cpp in der Engine vcproj von wix source ist intelligent genug, um eine Stringvariable in einen anderen Typ (numerisch, Version) zu konvertieren und dann zu vergleichen. Und es stellt sich heraus, dass ich Dinkel nur die Variablen Namen falsch ......

Sowieso Sie auch

hinzufügen könnte
<Variable Id="x64Bitness" Value="x64" Type="string" /> 

zu Ihrem Bundle und dann in den Zustand installieren vergleichen Sie es mit x64Bitness statt " x64 "und das würde String-Vergleich erzwingen.

+0

Vielen Dank! Der Vergleich funktioniert mit der '"' und mit der Variable.Übrigens eine kleine Anmerkung: Variable hat das Attribut 'Name' anstelle von' Id'. Was bedeutet '~ =' im Gegensatz zum einfachen '='? In der Praxis sehe ich keinen Unterschied. –

+0

~ = vergleicht nur die Groß- und Kleinschreibung. Es ist fast immer besser, Strings zu vergleichen, die den Fall ignorieren, wenn Sie keine der Strings kontrollieren, es sei denn, Sie wissen sicher, dass Sie den Fall berücksichtigen möchten (wie ein CD-Key oder einige URLs). Ich denke, die Idee ist, dass Sie nicht sicher wissen, ob Version XY von Outlook den Registrierungsschlüssel als Wert "X64" oder "x64" setzt und wenn es jemals ein Großbuchstabe X verwendet, wenn Sie nicht "~" verwenden = "Sie werden die Variablen nicht zuordnen. Hier ist die Liste der Vergleiche https://www.firegiant.com/wix/tutorial/com-expression-syntax-miscellanea/expression-syntax/ –

+1

Ich sehe es lohnt sich, das Tutorial noch einmal zu bearbeiten. –

Verwandte Themen