Wix: Как я могу установить, во время выполнения, текст, который будет отображаться в VerifyReadyDlg?
После того, как пользователь пройдет через мастер установки и сделает несколько вариантов, обычно нужно отобразить VerifyReadyDlg, чтобы сказать "Готовы ли вы установить?"
Встроенный VerifyReadyDlg является статическим. Это не представляет резюме выборов, которые он сделал ранее. Я хотел бы изменить это так, чтобы это сделало.
Как я могу это сделать?
пример
"Статический" текст:
Интеллектуальный текст:
http://i46.tinypic.com/s4th7t.jpg
Я не верю, что могу изменить таблицу управления в MSI, потому что моды в процессе установки не разрешены. Я нашел MsiViewModifyInsertTeorary, но я не думаю, что это будет работать. Соответствующая строка в таблице Control уже существует и содержит статические данные. Я хочу изменить данные непосредственно перед отображением VerifyReadyDlg.
1 ответ
Возможно, вам не удастся изменить существующие строки в таблицах 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
};
Пара замечаний:
InstallText в таблице управления обычно отображается. Его можно настроить с помощью файла.wxl, вставив что-то вроде этого:
<String Id="VerifyReadyDlgInstallText">Whatever.</String>
Это приводит к строке в таблице управления. Но вы не можете удалить строки из таблицы во время выполнения.
Если вы выберете X, Y и Height, Width для вашего нового пользовательского текста такими же, как для статического InstallText, InstallText будет скрыт.Может показаться нелогичным использование "НЕ установлено" в качестве условия, но помните, что это состояние мира до запуска мастера установки. Если MSI
Installed
перед запуском мастера вы, вероятно, не устанавливаете его, а это означает, что вам не нужно отображать варианты, сделанные в мастере.Конечно, вы можете добавить несколько элементов управления таким образом. Вы можете добавить несколько элементов управления Text или... Вы можете добавить строки, кнопки, флажки, что угодно. Для каждого из них вам необходимо установить тип и геометрию элемента управления соответствующим образом. Используйте Orca, чтобы изучить контрольную таблицу, чтобы выяснить, как это сделать.
Этот подход работает для любого диалога. Вы должны быть уверены, что запустили пользовательское действие для вставки временных строк в таблицу Control, в какой-то момент в InstallUISequence, перед тем, как отобразится диалог.