成功后动态更改 EndDialog 中的 RTF 内容

Dynamically changing RTF content in the EndDialog after success

多亏了这个 ,我能够进行自定义操作,临时更新和修改 MSI 数据库。

简而言之我在做

[CustomAction]
public static ActionResult VerifyLog(Session session)
{
  var sRtfText = @"{\rtf1\ansi\deff0{\colortbl;\red0\green0\blue0;\red255\green0\blue0;}THIS IS NOT DEFAULT TEXT}";
  var view = session.Database.OpenView("SELECT * FROM Control WHERE 
  Dialog_='EndDlg' AND Control='Verification'");
  view.Execute();
  var record = view.Fetch();
  view.Delete(record);
  record.SetString("Text", sRtfText);
  view.InsertTemporary(record); // also tried original post's view.Modify(ViewModifyMode.InsertTemporary, record); as well

  return ActionResult.Success;
}

我的控件默认状态如下

<Dialog Id="EndDlg" Width="600" Height="400" Title="$(var.PRODUCT_NAME)">
  <Control Id="Verification" Type="ScrollableText" X="180" Y="80" Width="410" Height="280" Sunken="yes" TabSkip="no" Text="{\rtf1\ansi\deff0{\colortbl;\red0\green0\blue0;\red255\green0\blue0;}default text\line}"/>
  <!-- Buttons for Navigation... -->
</Dialog>

我的 CustomAction 元素如下。

  <CustomAction Id="CA_01_Verify"
                BinaryKey="WiXCustomAction"
                DllEntry="VerifyLog"
                Execute="immediate"
                Return="check"/>

我的 InstallExecuteSequence 如下。

  <InstallExecuteSequence>
    <Custom Action="CA_01_Verify" Before="CostInitialize"></Custom>
  </InstallExecuteSequence>

但是,在通过 <Show Dialog="EndDlg" OnExit="success"/> 退出时打开结束对话框时,更新的文本不知何故消失了,控件只显示默认文本。

当我在自定义操作中检查文本列时,我可以看到它已正确更新。 (我在通过 CA 进行修改之前进行了检查,以确保默认值存在并且已更新)。

为此,我做了另一个自定义操作,仅检查 EndDlg 验证控件中的文本条目,并确认验证控件的文本列已正确更新。

如果在 table 中更新正常,为什么在 UI 中没有更新?

仅供参考 以下是结果日志

Action 11:49:35: CA_01_Verify. 
Action start 11:49:35: CA_01_Verify.
MSI (s) (2C:A8) [11:49:35:044]: Invoking remote custom action. DLL: C:\WINDOWS\Installer\MSIAC6F.tmp, Entrypoint: VerifyLog
MSI (s) (2C:C8) [11:49:35:045]: Generating random cookie.
MSI (s) (2C:C8) [11:49:35:057]: Created Custom Action Server with PID 26272 (0x66A0).
MSI (s) (2C:80) [11:49:35:086]: Running as a service.
MSI (s) (2C:80) [11:49:35:089]: Hello, I'm your 32bit Impersonated custom action server.
SFXCA: Extracting custom action to temporary directory: C:\WINDOWS\Installer\MSIAC6F.tmp-\
SFXCA: Binding to CLR version v4.0.30319
Calling custom action WiXCustomAction!WiXCustomAction.CustomActions.VerifyLog
VerifyLog started
MSI (s) (2C!90) [11:49:35:230]: PROPERTY CHANGE: Adding VerifyLog property. Its value is 'Started'.
Opening the view from control table
view.Execute()
view.Fetch()
Current Text Column: {\rtf1\ansi\deff0{\colortbl;\red0\green0\blue0;\red255\green0\blue0;}default text\line}
view.Delete()
setting the text with rtf content : {\rtf1\ansi\deff0{\colortbl;\red0\green0\blue0;\red255\green0\blue0;}THIS IS NOT DEFAULT TEXT}
Current Text Column Before set string : {\rtf1\ansi\deff0{\colortbl;\red0\green0\blue0;\red255\green0\blue0;}default text\line}
Current Text Column After set string : {\rtf1\ansi\deff0{\colortbl;\red0\green0\blue0;\red255\green0\blue0;}THIS IS NOT DEFAULT TEXT}
view.Modify
Current Text Column Before Insert: {\rtf1\ansi\deff0{\colortbl;\red0\green0\blue0;\red255\green0\blue0;}THIS IS NOT DEFAULT TEXT}
Current Text Column After Insert: {\rtf1\ansi\deff0{\colortbl;\red0\green0\blue0;\red255\green0\blue0;}THIS IS NOT DEFAULT TEXT}
Success

此处 github.com 中有一个模型示例: https://github.com/glytzhkof/WiXViewLogExperiment

此示例具有从自定义设置 ExitDialog(称为 MyExitDialog)生成的对话框,它显示RTF 文件的内容。请用您自己的 RTF 文件替换磁盘上的“TestFile.rtf”,然后编译 运行 生成的 MSI 以检查其工作原理。


打开 MSI 日志:我这里有另一个关于如何从最后一个 MSI 对话框打开 MSI 日志的示例:https://github.com/glytzhkof/WiXOpenLogFile(第一次没有正确理解需求 - 但一直想要这个功能 - 它没有完成,而是一个功能演示)。

(如果没有创建 MSI 日志,可以隐藏打开的日志复选框 - 使用 Enable Global MSI Logging.reg 文件为所有 MSI 操作启用 MSI 日志记录. 日志在 TEMP 文件夹中以随机名称显示。)


Link 部分:

WiX GUI 既是 MSI 文件中嵌入的 MSI GUI,也是 Burn setup.exe 可以使用许多不同的现代技术创建的启动器 GUI。所以 MSI GUI 与 setup.exe GUI。

WiX GUI 上的一些选定链接: