Wix:如何在运行时设置要在VerifyReadyDlg中显示的文本?

时间:2009-11-24 16:02:51

标签: wix windows-installer

用户完成设置向导并做出一些选择后,通常会显示VerifyReadyDlg说“你准备安装吗?”

内置的VerifyReadyDlg是静态的。它没有提供他之前做出的选择的摘要。我想修改它以便它做到。

我该怎么做?


实施例

“静态”文字:
alt text

智能文字:
alt text

我不相信我可以修改MSI中的Control表,因为不允许在安装过程中使用mod。我找到了MsiViewModifyInsertTemporary,但我认为这也不会有用。 Control表中的相关行已存在,并且包含静态数据。我想在显示VerifyReadyDlg之前修改数据。

1 个答案:

答案 0 :(得分:3)

您可能无法修改MSI表中的现有行,但可以插入新的“临时”行。

因此,在自定义操作中,在运行时,将一个或多个临时行插入Control表。在Javascript中,它看起来像这样:

var controlView = Session.Database.OpenView("SELECT * FROM Control");
controlView.Execute();

var record             = Session.Installer.CreateRecord(12);
record.StringData(1)   = "VerifyReadyDlg";    // Dialog_ - the dialog to mod
record.StringData(2)   = "CustomVerifyText1"; // Control - any unique name will do
record.StringData(3)   = "Text";              // Type
record.IntegerData(4)  = 25;                  // X
record.IntegerData(5)  = 70;                  // Y
record.IntegerData(6)  = 320;                 // Width
record.IntegerData(7)  = 65;                  // Height
record.IntegerData(8)  = 2;                   // Attributes
record.StringData(9)   = "";                  // Property
record.StringData(10)  = text1;               // Text - the text to be displayed
record.StringData(11)  = "";                  // Control_Next
record.StringData(12)  = "";                  // Help
controlView.Modify(MsiViewModify.InsertTemporary, record);
controlView.Close();    

您可能希望仅在安装时显示自定义文本。在这种情况下,以相同的方式添加条件:

var controlCondView    = Session.Database.OpenView("SELECT * FROM ControlCondition");
controlCondView.Execute();

record                 = Session.Installer.CreateRecord(4);
record.StringData(1)   = "VerifyReadyDlg";    // Dialog_
record.StringData(2)   = "CustomVerifyText1"; // Control_ - same name as above
record.StringData(3)   = "Show";              // Action
record.StringData(4)   = "NOT Installed";     // Condition
controlCondView.Modify(MsiViewModify.InsertTemporary, record);
controlCondView.Close();

Msi常量的定义如下:

// http://msdn.microsoft.com/en-us/library/aa372516(VS.85).aspx
var MsiViewModify = 
{
    Refresh          : 0,
    Insert           : 1,
    Update           : 2,
    Assign           : 3,
    Replace          : 4,
    Merge            : 5,
    Delete           : 6,
    InsertTemporary  : 7,   // cannot permanently modify the MSI during install
    Validate         : 8,
    ValidateNew      : 9,
    ValidateField    : 10,
    ValidateDelete   : 11
};

一对夫妇注意到:

  1. 通常会显示Control表中的InstallText。它可以使用.wxl文件进行自定义,插入如下内容:

    <String Id="VerifyReadyDlgInstallText">Whatever.</String>

    这导致Control表中的一行。但是您无法在运行时从表中删除行 如果选择X,Y和Height,新自定义文本的宽度与静态InstallText相同,则InstallText将被遮盖。

  2. 使用“NOT Installed”作为条件似乎是违反直觉的 - 但请记住,这是运行安装向导之前的世界状态。如果在运行向导之前MSI为Installed,那么您可能没有安装它,这意味着您无需显示向导中的选项。

  3. 当然,您可以通过这种方式添加多个控件。您可以添加多个文本控件,或者...您可以添加行,按钮,复选框等等。对于每一个,您必须适当地设置控件类型和几何。使用Orca检查Control表以确定如何使用。

  4. 此方法适用于任何Dialog。在呈现Dialog之前,您必须确保运行自定义操作以将临时行插入到ControlUsee序列中的某个点上的Control表中。