2016-04-22 6 views
3

私のWiX Bootstrapperアプリケーションでは、Outlook Bitnessに応じて32ビットまたは64ビットのMsiPackageをインストールしたいと考えています。そこで、レジストリ値(x64またはx86)を検索し、変数に読み込み、各MsiPackageのInstallConditionを、変数と適切な値の文字列比較に設定します。Wixバンドル内の文字列比較に基づいてMsiPackage/InstallConditionを書き込む方法は?

結果は予想外です。文字列比較は明らかに機能しません。

マイBundle.wxsは次のようになります。

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

インストーラは今、次のログを書き込みます。

[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 

それは述べている:文字列変数を設定

  1. 'をOLBitness' に値 'x64'
  2. 条件 'OLBitness = x64'はfalseに評価されます
  3. 変数:値は明らかに期待しているように見える一方でOLBitness = x64の

なぜfalseに条件を評価しますか?

文字列の等価性をテストするためにInstallConditionを書くにはどうすればよいですか?

プロパティを使用することはできますか?その場合はどうすればいいですか?

Result = "exists"ではなく、Result = "value"でRegistrySearchesの例が見つかりました。

ありがとうございました!

+0

http://stackoverflow.com/questions/6231950/using-wix-to-create-32bit-and-64bit-installers-from-one-wxs-file助けてくれるかもしれない – ChrisBint

答えて

1

OLBitness変数は、「文字列」変数であると私はx64のヘクスか何かで表現intとして解析によってピックアップされる可能性がありますと思いますか?

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

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

をお試しください?その後、文字列をintに変換しようとすると、本当に間違って変換されるため、文字列を変換します。

これをデバッグすることはできますが、設定にはしばらく時間がかかります。私はバージョンを比較しようとしていたときにこれを行う必要がありました。レジストリ検索を使用する場合、変数の型は常に文字列です。 wixソースのエンジンvcprojのcondition.cppは、文字列変数を別の型(数値、バージョン)に変換して比較しようとするほどスマートです。そして、それはまた、あなたのバンドルに

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

を追加してインストールした状態で「x64Bitnessにそれを比較する代わりの可能性が、私はただの変数はとにかく間違って......

に名前を付ける綴ら判明しますx64 "とすると、文字列の比較が強制されます。

+0

ありがとう!比較は '"'と変数で動作します。小さな注釈を書き留めてください:変数は 'Id'ではなく' Name'属性を持っています。単純な '='とは対照的に '〜='の意味は何ですか?実際には違いは見られません。 –

+0

〜=は大文字と小文字を区別しない文字列を比較するだけです。大文字と小文字を無視して文字列を比較するほうが、大文字と小文字を区別したい場合(CDキーやURLのように)、文字列の1つを制御しないと比較する方が良いでしょう。私はあなたがOutlookのバージョンXYが値 "X64"または "x64"としてレジストリキーを置くかどうかを確かに知っていないと思います。 = "あなたは変数にマッチしません。比較のリストはhttps://www.firegiant.com/wix/tutorial/com-expression-syntax-miscellanea/expression-syntax/ –

+1

です。このチュートリアルをもう一度試してみる価値はあると思います。 –

関連する問題