我正在尝试根据应在自定义操作中设置的值安装两个功能中的一个 首先,我设置了一个属性的值:
UINT __stdcall ConfigurationCheckAction(MSIHANDLE hInstall)
{
HRESULT hr = S_OK;
UINT er = ERROR_INSTALL_FAILURE;
hr = WcaInitialize(hInstall, "ConfigurationCheckAction");
if (condition) {
MsiSetProperty( hInstall, TEXT("STREAM"), TEXT("RED") );
}
else {
MsiSetProperty( hInstall, TEXT("STREAM"), TEXT("BLUE") );
}
return WcaFinalize(er);
}
其次,我每两个特征制作两个条件:
<Feature Id='Complete' Level='1'>
<Feature Id="Red" ConfigurableDirectory="TARGETDIR" Title="F1" Level="0">
<Condition Level="1">STREAM</Condition>
</Feature>
<Feature Id="Blue" ConfigurableDirectory="TARGETDIR" Title="F2" Level="0">
<Condition Level="1">NOT STREAM</Condition>
</Feature>
</Feature>
请注意,我之前没有在wxs文件中定义属性,因为我想从自定义操作中设置它。
在InstallInitialize和Execute立即执行之前调用我的自定义操作。
从安装日志中我确认已设置该属性。 但是,我的条件安装不起作用,因为似乎条件中的内容总是被评估为false。
我尝试评估条件: STREAM,STREAM = RED,STREAM =&#34; RED&#34;,&lt; ![CDATA [STREAM = RED]] GT;
我的想法已经不多了,我会很感激帮助。
答案 0 :(得分:1)
我做了类似的事情,但我们最终在组件级别控制了这一点(在加热期间使用转换将条件添加到<Component/>
元素而不是feature元素)。但我们的条件使用CDATA,同时也使用双引号作为值,您不会在您尝试过的内容中列出。首先,我要在您的功能中尝试以下条件:
<Condition><![CDATA[STREAM="RED"]]></Condition>
<Condition><![CDATA[STREAM="BLUE"]]></Condition>
如果仍然无效,我会尝试以下方法:
将具有默认值的STREAM属性添加到WiX。然后使用该默认值对其进行测试,以查看是否将默认值设置为开头使其工作。这可能意味着您需要尽快设置属性,可能需要关闭UI事件。 <Property Id="STREAM" Value="RED"/>
作为最后的手段,您可以像我一样为每个组件添加条件,但我们只是出于非常具体的原因,希望您可以使用条件功能来处理上述建议!
我希望上述内容可以解决您的问题,或者至少引导您找到答案!
答案 1 :(得分:1)
测试所有这些都太迟了,但这里有一些信息。我明天会回来的。基本上我认为问题是你的自定义动作排序。在成本计算之前尝试。
需要考虑的一些事项:
CostInitialize
之前对设置属性自定义操作进行排序?您声明在InstallInitialize之前设置它,但是在CostInitialize之前尝试它(您可能已经尝试过)。InstallUISequence
以及InstallExecuteSequence
中插入此自定义操作?如果安装程序以静默方式运行,则需要在两个序列中插入。我相信在CostInitialize
两个序列之前。交叉链接以便于检索 :
答案 2 :(得分:0)
感谢您的回复。最后,结合你的建议帮助了我。
我想说明做了什么和什么做不起作用:
<Condition><![CDATA[STREAM="RED"]]></Condition>
答案 3 :(得分:0)
关于自定义操作的正确顺序,custom action type 51的描述包含决定性提示:
“要影响组件或功能部件的条件中使用的属性,自定义操作必须在操作序列中的CostFinalize操作之前进行。”