代码之家  ›  专栏  ›  技术社区  ›  foobar

WiX:CustomAction基于另一个CustomAction的结果

  •  0
  • foobar  · 技术社区  · 8 年前

    我想执行2个自定义操作,比如ca1和ca2,其中ca2的执行取决于ca1的结果,如下所示:

    if ( ca1 == SUCCESS )
    {
      Perform ca2
    }
    

    因此,只有当我的ca1返回成功(没有失败)时,才应该执行ca2。

    4 回复  |  直到 8 年前
        1
  •  5
  •   Michael Urman    8 年前

    您描述的是默认值。如果自定义操作失败,安装将中止,之后只能执行回滚操作。因此,为了让你的问题有意义,首先你必须忽略或掩盖第一个自定义操作的失败。

    MsiDoAction (或其包装物)。这样做会模糊自定义操作之间的界限,所以我假设这不是您描述的场景。

    这就剩下了第三种也是最后一种方法:找到一个外部沟通渠道。为了立即采取行动,我建议ca1在成功时设置一个属性(调用 MsiSetProperty 或类似DTF会话的包装器[ ]),ca2或读取( MsiGetProperty / MsiEvaluateCondition )或者直接以该财产的价值为条件。对于延迟操作,属性不会传播,因此您必须识别其他一些通道。(可能提前选择路径的临时文件会起作用。)

        2
  •  2
  •   Stein Åsmul    8 年前

    决不能使用即时模式自定义操作更改系统

    另一个“ 外部通信通道 “Michael Urman提到的自定义操作之间可能是HKLM中的一个注册表项,您可以编写该注册表项,然后将其读回。

    然而,真正的解决方案是尝试WiX的内置防火墙功能 http://wixtoolset.org/documentation/manual/v3/xsd/firewall/firewallexception.html

        3
  •  1
  •   Doc    8 年前

    来自WiX文档 here

        <InstallExecuteSequence>
             <Custom Action='FooAction1' After='InstallFiles'/>
             <Custom Action='FooAction2' After='FooAction1' Condition='FOOACTION1SUCCESS'/>
        </InstallExecuteSequence>
    

    让您在FooAction1中的代码设置属性MsiSetProperty('FOOACTION1SUCCESS',1')

        4
  •  0
  •   Doc    8 年前

    让第一个自定义操作设置属性。然后,仅当该属性存在或设置为预期值时,才运行第二个自定义操作。