【问题标题】:WiX: dynamically changing the status text during CustomActionWiX:在 CustomAction 期间动态更改状态文本
【发布时间】:2012-07-30 13:25:11
【问题描述】:

我在 wix 安装程序中有一个相当长的 CustomAction,我希望能够在操作运行时更改“状态:...”文本,以查看其内部状态是否有进展和更新。 我知道如何设置自定义操作的进度文本 - 但我想要的是在自定义操作运行期间动态更改进度文本。

【问题讨论】:

    标签: wix wix3.5


    【解决方案1】:

    延迟自定义操作可以调用 MsiProcessMessage 函数。然后,您可以使用 INSTALLMESSAGE_ACTIONSTART、INSTALLMESSAGE_ACTIONDATA 和 INSTALLMESSAGE_PROGRESS 将消息发布到 UI。

    另一种可能性是将您的自定义操作分解为更小的自定义操作,并使用 ProgressText(ActionText 表)来描述安装的不同阶段。 (让每个 CA 承担单一职责。)

    有时当 CA 做太多工作时,很难正确计划回滚。

    Obtaining Context Information for Deferred Execution Custom Actions

    MsiProcessMessage function

    使用 C#/DTF 看起来像:

        using (Record record = new Record(0))
        {
            record.SetString(0, "foo");
            session.Message(InstallMessage.ActionData, record);
        }
    

    using 语句处理记录以释放底层 MSI 句柄。记录中的字段数以及如何设置数据将取决于 ActionText 表中定义的模板。

    【讨论】:

    • 谢谢。我相信这就是我一直在寻找的。我的自定义操作是用 C# 编写的,您可能对 DTF 有解释吗?
    • DTF doco 中的所有类和成员都引用了底层的 MSI API 对应项,您可以使用帮助文件中的搜索选项卡找到它们。我将更新我的答案以提供示例。 (你没有提到你在编写 CA 的内容。)
    • 谢谢。像魅力一样工作:)
    【解决方案2】:

    Chris 已正确解释了如何从您的 CA 向 ActionData 发送消息,但如果您使用的是 InstallShield,请确保在 SetupProgress 对话框上创建标签并订阅 ActionData 文本事件。简单地说,为标签创建ActionText 事件是不够的,因为它只会显示您在 ActionText 表中创建的 CA 描述。

    【讨论】:

      【解决方案3】:

      以上答案对我不起作用。状态永远不会更新。

      在我的情况下直接调用 AddProgressInfo 函数。

            Action<Session, string> updateStatusMessage = (session, msg) =>
            {
                  session.Message(InstallMessage.ActionStart, new Record("callAddProgressInfo", msg, ""));
            };
      

      【讨论】:

        猜你喜欢
        • 2018-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-16
        相关资源
        最近更新 更多