如何根据自定义操作中的属性集安装功能



我试图根据应在自定义操作内部设置的值中安装两个功能。
首先,我设置了属性的值:

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文件内部的属性,因为我想从自定义操作中进行设置。

我的自定义操作是在立即安装和执行之前调用的。

在安装日志中,我可以确认设置该属性。但是,我的有条件安装不起作用,因为似乎总是被评估为false。

我尝试评估条件:流,流=红色,流="红色",&lt;![cdata [stream = red]]>

我用尽了想法的想法。。我明天再回来。本质上,我认为问题是您的自定义动作测序。在成本之前尝试。

有些要考虑的事情:

  • 自定义操作排序:您需要对自定义操作进行序列,并且需要在静音和交互式安装模式下存在。
    • 您是否尝试在CostInitialize之前对设置属性自定义操作进行测序?您说明在installitialize之前将其设置,但请先在成本限制之前尝试(您可能已经尝试过(。
    • 您是否记得在InstallUISequence以及InstallExecuteSequence中插入此自定义操作?如果设置在静音模式下运行,则需要在两个序列中插入。我相信这两个序列的CostInitialize之前。
  • 功能级别:通过功能级别操纵功能,而installlevel只是一种功能控制的一种方法,您还可以通过命令行设置功能或使用自定义行动。
    • 将功能级别设置为0应该在设置的自定义对话框中隐藏该功能。
    • 设置功能级别高于设置的安装级别将从安装中取消选择。
    • 以及设置功能级别较低或等于设置的安装级别的另一种方式将选择安装功能。
    • 条件语法允许的灵活性非常灵活,并且可以提供您需要的功能 - 但我从未正确使用过它们。这是installshield论坛的示例。
  • addLocal&amp;删除:您可以通过更改附加位置的值并从自定义操作中删除属性(从技术上讲也重新安装和广告(来操纵功能选择 - 并且可以通过命令行设置这些属性。
  • win32 :您还可以使用win32函数msigetFeatureState和msisetFeatureState-从C 自定义操作 - 设置功能选择。

坦率地说,这有点生气。还要记住,有功能动作状态(功能将发生什么(和已安装的状态(它在哪个状态中(。Win32功能文档应解释。


易于检索的交联

  • 未选择的功能已安装

我做了类似的事情,但是我们最终在组件级别控制了它(将条件添加到<Component/>元素中,而不是使用功能元素在高温期间转换(。但是我们的病情利用CDATA,同时还使用双引号为该值,您在尝试的内容中不列出。因此,首先,我会在您的功能中尝试以下条件:

<Condition><![CDATA[STREAM="RED"]]></Condition>
<Condition><![CDATA[STREAM="BLUE"]]></Condition>

如果仍然不起作用,我会尝试以下内容:

  1. 在Wix中添加带有默认值的流属性。然后使用该默认值对其进行测试,以查看是否将默认值设置为"开始"使其正常工作。这可能意味着您需要更快地设置该属性,甚至可能是UI事件。<Property Id="STREAM" Value="RED"/>

  2. 作为最后的手段,您可以像我一样将条件添加到每个组件,但我们只出于非常具体的原因而这样做,希望您能获得有条件的功能来处理上述建议!

我希望以上解决您的问题,或者至少会导致您找到答案!

谢谢您的答复。最后,您的建议组合对我有所帮助。

我想说明什么事和什么不起作用:

  1. 不需要用默认值添加属性(以及添加此属性secure ='yes''的属性(
  2. (
  3. 在Costitialize之前调用自定义行动并不能独自解决该问题,但我认为这是解决问题的因素之一。
  4. 有条件的sintax通过:
    纠正a(将条件放在CDATA的内部,并在建议的财产价值中添加报价:<Condition><![CDATA[STREAM="RED"]]></Condition>
    b(逆转条件级别,因此功能具有条件级别1,条件的级别为0。这意味着该功能始终安装,除非条件表达式为false。

关于自定义操作的正确顺序,自定义操作类型51的描述包含决定性提示:

'要影响组件或功能上的条件中使用的属性,必须在动作序列中的COSTECHINAL操作之前进行自定义操作。

相关内容

最新更新