Wix DoAction以更新文本

Wix DoAction以更新文本,wix,windows-installer,Wix,Windows Installer,是否可以在Wix更新文本对话框中进行自定义操作?我一直在寻找各种方法来做这件事,但对我来说什么都不管用 我有一个按钮控件定义为 <Control Id="RunButton" Type="PushButton" X="0" Y="0" Height="18" Width="56" Text="Run"> <Publish Event="DoAction" Value="CustomAction">1</Publish> </Control>

是否可以在Wix更新文本对话框中进行自定义操作?我一直在寻找各种方法来做这件事,但对我来说什么都不管用

我有一个按钮控件定义为

<Control Id="RunButton" Type="PushButton" X="0" Y="0" Height="18" Width="56" Text="Run">
    <Publish Event="DoAction" Value="CustomAction">1</Publish>
</Control>
这是我在许多论坛上发现的基本流程,但它对我不起作用

该操作定义为Execute=“immediate”和Return=“Check”

我还尝试将“Record”对象更改为3个字段,并将相同的属性设置为字段1、2和3。这也不管用


谁能解释一下我做错了什么?这在Wix中是不可行的吗?本质上,我试图在自定义操作中设置一个长时间运行的流程,并希望能够向用户报告操作的进度

如果您检查文档的操作:

它说您不能通过MsiProcessMessage发送消息,而session.message实际上就在它下面,所以这很可能是它无法工作的原因。我怀疑您正在查看的论坛描述了MsiProcessMessage的一般用法,而没有对这一特殊情况提出警告

不知道自定义操作在做什么,我不能提出任何建议。在执行序列中,您可以将CA与进度条集成,但您处于UI序列中,可能正在收集大量数据或检查某些内容


如果您的自定义操作更新了系统,则它应作为延迟的自定义操作处于执行序列中。这不仅可以影响进度条并提供说明发生了什么的文本,而且安装可能会失败,或者用户可能会取消安装,事务性安装的全部要点是,失败会将其回滚,就像安装从未启动一样。这意味着您应该保存数据库并在回滚自定义操作中恢复它。您可能遇到的另一个问题是UI中的即时自定义操作没有提升,因此您可能无法更新数据库。不仅如此,静默安装绕过UI,因此不会调用自定义操作,并且无法使用组策略或SCCM方法推出产品

如果您检查文档的操作:

它说您不能通过MsiProcessMessage发送消息,而session.message实际上就在它下面,所以这很可能是它无法工作的原因。我怀疑您正在查看的论坛描述了MsiProcessMessage的一般用法,而没有对这一特殊情况提出警告

不知道自定义操作在做什么,我不能提出任何建议。在执行序列中,您可以将CA与进度条集成,但您处于UI序列中,可能正在收集大量数据或检查某些内容


如果您的自定义操作更新了系统,则它应作为延迟的自定义操作处于执行序列中。这不仅可以影响进度条并提供说明发生了什么的文本,而且安装可能会失败,或者用户可能会取消安装,事务性安装的全部要点是,失败会将其回滚,就像安装从未启动一样。这意味着您应该保存数据库并在回滚自定义操作中恢复它。您可能遇到的另一个问题是UI中的即时自定义操作没有提升,因此您可能无法更新数据库。不仅如此,静默安装绕过UI,因此不会调用自定义操作,并且无法使用组策略或SCCM方法推出产品

Windows Installer的内部UI不会间接更新太多。从根本上说,您必须决定是要进行一次更新(更像您的描述),还是要查找进度消息(更像您的方法)。对于进度消息,您应该注意PhilDW的回答,因为这需要成为执行序列的一部分。对于UI事件(如用户单击按钮)的一次性更新,请考虑使用属性和SETFITCH控件事件:

  • 控件应显示包含属性引用的文本,例如
    布丁:[FLAVOR]
  • 您的DoAction控件事件可以设置一些属性,甚至可能是
    FLAVOR
    本身,但为了清楚起见,我可能建议从DoAction设置
    FLAVOR\u
  • 然后添加一个SetProperty控件事件,该事件将
    FLAVOR
    设置为
    [FLAVOR\u FROMDOACTION]
    。这将更新控件的文本

    • Windows Installer的内部用户界面不会间接更新。从根本上说,您必须决定是要进行一次更新(更像您的描述),还是要查找进度消息(更像您的方法)。对于进度消息,您应该注意PhilDW的回答,因为这需要成为执行序列的一部分。对于UI事件(如用户单击按钮)的一次性更新,请考虑使用属性和SETFITCH控件事件:

      • 控件应显示包含属性引用的文本,例如
        布丁:[FLAVOR]
      • 您的DoAction控件事件可以设置一些属性,甚至可能是
        FLAVOR
        本身,但为了清楚起见,我可能建议从DoAction
        设置
        FLAVOR\u
      • 然后添加一个SetProperty控件事件,该事件将
        FLAVOR
        设置为
        [FLAVOR\u FROMDOACTION]
        。这将更新控件的文本

      我的目的是创建一个数据库升级页面(我正在使用SQLite作为此应用程序的数据源),并让用户单击一个升级按钮,该按钮将调用自定义操作。我希望使用CA加载我的数据库升级过程,并在进度发生变化时附加事件侦听器,以便将ActionData消息发送回安装程序。使用VS2008中的旧Windows安装程序,我们能够通过生成自定义对话框页面来创建一个与此完全相同的页面。我可以用WPF做类似的事情吗?CA有没有生成一个WPF窗口来处理这个进程?我的目的是让一个数据库升级pa
      <Control Id="MessageText" X="0" Y="20" Width="100" Height="18">
          <Subscribe Event="ActionData" Attribute="Text" /> 
      </Control>
      
      using(var rec = new Record(0)){
          rec.SetString(0, "Starting...");
          session.Message(InstallMessage.ActionData, rec);
      }