2010-03-16 137 views
17

由於用戶混淆,我們的應用程序需要單獨安裝32位和64位版本的Windows。雖然32位安裝程序在win64上運行良好,但它有可能造成支持頭痛,我們希望防止這種情況發生。WiX:阻止32位安裝程序在64位Windows上運行

我想阻止32位MSI安裝程序在64位Windows機器上運行。爲此,我有以下條件:

<Condition Message="You are attempting to run the 32-bit installer on a 64-bit version of Windows."> 
    <![CDATA[Msix64 AND (NOT Win64)]]> 
</Condition> 

有了這樣定義的Win64中:

<?if $(var.Platform) = "x64"?> 
<?define PlatformString = "64-bit"?> 
<?define Win64 ?> 
<?else?> 
<?define PlatformString = "32-bit"?> 
<?endif?> 

事情是,我不能讓這個檢查工作的權利。要麼它一直在燃燒,要麼在任何時候都燃燒。我們的目標是檢查運行時msix64變量與編譯時Win64變量的存在性,如果這些變量不對齊,則會拋出一個錯誤,但邏輯不能正常工作。有沒有人想出更好的解決方案?

回答

15

僅將Condition元素包含在32位軟件包中(即使用?if?預處理器語句)。條件是「不是Msix64」:啓動條件必須是真實的,因此如果Msix64被設置,啓動條件將失敗,這意味着它是一個x64操作系統和一個32位軟件包,正確的做法是塊。

+0

這最終導致了詭計。我的錯誤是讓'Condition'的邏輯倒退。 – 2010-04-06 01:18:13

+1

Msix64需要默認情況下不在XP上的Windows Installer 3.1(請參閱http://msdn.microsoft.com/zh-cn/library/aa370522(v=VS.85).aspx) – 2011-07-21 19:52:36

3

condition元素與安裝期間存在的windows安裝程序屬性一起使用。

但是,您將Win64定義爲wix變量,而不是Windows安裝程序屬性。 Wix變量僅在創建設置時存在。您必須將它們引用爲$(var.MyWixVariable),然後wix預處理器將用它們的定義值替換它們。

我反而試試這個:

<?if $(var.Platform) = "x64"?> 
<?define PlatformString = "64-bit"?> 
<Property Id="Win64" Value="1" /> 
<?else?> 
<?define PlatformString = "32-bit"?> 
<?endif?> 

如果$(var.Platform)具有時創建的安裝正確的價值,那麼這將導致被記錄在Windows安裝程序數據庫中的「Win64的」屬性(即MSI文件),並且該屬性將在安裝期間用於條件元素。

+0

當通過光的維克斯3.6運行表明嵌套屬性元素不能放在同語法這將引發錯誤。 – Jon 2013-08-14 08:48:28

+0

@JonSamwell:這些處理指令('')專供candle.exe中的預處理器使用。如果您正確使用wix,Light.exe不應該看到它們。 – 2013-08-20 08:42:34

3

添加這個條件

<Condition Message="This is designed for 32bit OS">%PROCESSOR_ARCHITECTURE ~= "x86" AND %PROCESSOR_ARCHITEW6432 &lt;&gt; "amd64"></Condition> 

您可以創建一個安裝有32位組件和64位組件,並把這兩個條件中的各個組件

<Component Id="bit32Component" Guid="..." Feature="ProductFeature"> 
    <Condition>%PROCESSOR_ARCHITECTURE~="x86" AND %PROCESSOR_ARCHITEW6432&lt;&gt;"amd64"></Condition> 
</Component> 
<Component Id="bit64Component" Guid="..." Feature="ProductFeature"> 
    <Condition>%PROCESSOR_ARCHITECTURE~="amd64" OR %PROCESSOR_ARCHITEW6432~="amd64"></Condition> 
</Component> 

這裏是我用

參考

http://blogs.msdn.com/david.wang/archive/2006/03/26/HOWTO-Detect-Process-Bitness.aspx

6

我們用下面的...

<?if $(var.ProcessorArchitecture)=x86 ?> 
<Condition Message="!(loc.LaunchCondition_Error64)"> 
    <![CDATA[Installed OR Not VersionNT64]]> 
</Condition> 
<?endif?> 
+1

VersionNT64需要Windows Installer 4.0(請參閱http://msdn.microsoft.com/en-us/library/windows/desktop/aa372497.aspx) – 2013-09-17 00:37:23

相關問題