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

时间:2018-03-26 13:19:03

标签: c++ wix windows-installer custom-action

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

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;

我的想法已经不多了,我会很感激帮助。

4 个答案:

答案 0 :(得分:1)

我做了类似的事情,但我们最终在组件级别控制了这一点(在加热期间使用转换将条件添加到<Component/>元素而不是feature元素)。但我们的条件使用CDATA,同时也使用双引号作为值,您不会在您尝试过的内容中列出。首先,我要在您的功能中尝试以下条件:

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

如果仍然无效,我会尝试以下方法:

  1. 将具有默认值的STREAM属性添加到WiX。然后使用该默认值对其进行测试,以查看是否将默认值设置为开头使其工作。这可能意味着您需要尽快设置属性,可能需要关闭UI事件。 <Property Id="STREAM" Value="RED"/>

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

  3. 我希望上述内容可以解决您的问题,或者至少引导您找到答案!

答案 1 :(得分:1)

测试所有这些都太迟了,但这里有一些信息。我明天会回来的。基本上我认为问题是你的自定义动作排序。在成本计算之前尝试。

需要考虑的一些事项:

  • 自定义操作排序 :您需要对自定义操作进行排序,并且需要在静默和交互式安装模式下都存在。
    • 您是否尝试在CostInitialize之前对设置属性自定义操作进行排序?您声明在InstallInitialize之前设置它,但是在CostInitialize之前尝试它(您可能已经尝试过)。
    • 您是否记得在InstallUISequence以及InstallExecuteSequence中插入此自定义操作?如果安装程序以静默方式运行,则需要在两个序列中插入。我相信在CostInitialize两个序列之前。
  • 功能级别 :通过feature levelINSTALLLEVEL操纵功能只是进行功能控制的一种方法,您也可以通过命令行或使用自定义操作。
    • 将要素级别设置为0应该会在设置的自定义对话框中隐藏该要素。
    • 设置高于设置的INSTALLLEVEL的功能级别将取消选择安装中的功能。
    • 另一种方法是将功能级别设置为低于或等于设置的INSTALLLEVEL,将选择要安装的功能。
    • The conditional syntax允许非常灵活,并且可以直接提供您需要的功能 - 但我从未正确使用它们。 Here is an example from the Installshield forum
  • ADDLOCAL&amp;删除 :您可以通过更改自定义操作中的ADDLOCALREMOVE属性的值(技术上也是REINSTALL和ADVERTISE)来操作要素选择 - 这些属性可以也可以通过命令行设置。
  • Win32 :您还可以使用Win32函数MsiGetFeatureStateMsiSetFeatureState - 来自C ++自定义操作 - 来设置要素选择。< / LI>
坦率地说整个事情有点疯狂。另请注意,功能操作状态(功能会发生什么)和功能安装状态(它处于什么状态)。 Win32函数文档应该解释。

交叉链接以便于检索

答案 2 :(得分:0)

感谢您的回复。最后,结合你的建议帮助了我。

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

  1. 不需要使用默认值向WiX添加属性(以及添加此属性的属性Secure =&#39; yes&#39;)
  2. 在CostInitialize之前调用自定义操作本身并没有解决问题,但我认为这是解决问题的因素之一。
  3. 条件sintax通过以下方式纠正:
    a)将条件置于CDATA内并按建议添加属性值:<Condition><![CDATA[STREAM="RED"]]></Condition>
    b)反转条件级别,因此特征具有条件级别1且条件具有级别0.这意味着始终安装该特征,除非条件表达式为假。

答案 3 :(得分:0)

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

“要影响组件或功能部件的条件中使用的属性,自定义操作必须在操作序列中的CostFinalize操作之前进行。”