我正在尝试根据应在自定义操作中设置的值从两个功能中安装一个。
首先,我设置一个属性的值:

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>

如果仍然无法解决问题,请尝试以下操作:
  • 将具有默认值的STREAM属性添加到WiX。然后使用该默认值对其进行测试,以查看是否设置了默认值以使其开始起作用。这可能意味着您需要尽快设置属性,可能需要关闭UI事件。 <Property Id="STREAM" Value="RED"/>
  • 作为最后的选择,您可以像我一样向每个组件添加条件,但是我们只是出于非常具体的原因才这样做,希望您可以使用条件功能来处理以上建议!

  • 我希望以上内容可以解决您的问题,或者至少可以使您找到答案!

    关于c++ - 如何根据自定义操作中设置的属性安装功能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49492473/

    10-14 15:26
    查看更多