用户完成设置向导并做出一些选择后,通常会显示VerifyReadyDlg说“你准备安装吗?”
内置的VerifyReadyDlg是静态的。它没有提供他之前做出的选择的摘要。我想修改它以便它做到。
我该怎么做?
实施例
“静态”文字:
我不相信我可以修改MSI中的Control表,因为不允许在安装过程中使用mod。我找到了MsiViewModifyInsertTemporary,但我认为这也不会有用。 Control表中的相关行已存在,并且包含静态数据。我想在显示VerifyReadyDlg之前修改数据。
答案 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
};
一对夫妇注意到:
通常会显示Control表中的InstallText。它可以使用.wxl文件进行自定义,插入如下内容:
<String Id="VerifyReadyDlgInstallText">Whatever.</String>
这导致Control表中的一行。但是您无法在运行时从表中删除行 如果选择X,Y和Height,新自定义文本的宽度与静态InstallText相同,则InstallText将被遮盖。
使用“NOT Installed”作为条件似乎是违反直觉的 - 但请记住,这是运行安装向导之前的世界状态。如果在运行向导之前MSI为Installed
,那么您可能没有安装它,这意味着您无需显示向导中的选项。
当然,您可以通过这种方式添加多个控件。您可以添加多个文本控件,或者...您可以添加行,按钮,复选框等等。对于每一个,您必须适当地设置控件类型和几何。使用Orca检查Control表以确定如何使用。
此方法适用于任何Dialog。在呈现Dialog之前,您必须确保运行自定义操作以将临时行插入到ControlUsee序列中的某个点上的Control表中。