2010-03-16 164 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

相关问题