我正在尝试根据应在自定义操作中设置的值从两个功能中安装一个。
首先,我设置一个属性的值:
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 =“RED”,
我的想法已经用完了,不胜感激。
最佳答案
我做了类似的事情,但最终还是在组件级别进行了控制(在加热过程中使用转换将条件添加到<Component/>
元素而非特征元素中)。但是,我们的条件使用CDATA,同时还使用双引号作为值,您没有在尝试的内容中列出。因此,首先,我将在您的功能中尝试以下条件:
<Condition><![CDATA[STREAM="RED"]]></Condition>
<Condition><![CDATA[STREAM="BLUE"]]></Condition>
如果仍然无法解决问题,请尝试以下操作:
<Property Id="STREAM" Value="RED"/>
我希望以上内容可以解决您的问题,或者至少可以使您找到答案!
关于c++ - 如何根据自定义操作中设置的属性安装功能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49492473/