8

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

4

3 回答 3

11

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

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

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

获取延迟执行自定义操作的上下文信息

MsiProcessMessage 函数

使用 C#/DTF 它看起来像:

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

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

于 2012-07-30T15:36:39.520 回答
1

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

于 2017-05-05T14:58:17.443 回答
0

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

直接调用 AddProgressInfo 函数适用于我的情况。

      Action<Session, string> updateStatusMessage = (session, msg) =>
      {
            session.Message(InstallMessage.ActionStart, new Record("callAddProgressInfo", msg, ""));
      };
于 2019-09-05T01:36:54.677 回答