Wix: Как я могу установить во время выполнения текст, который будет отображаться в VerifyReadyDlg?

После того, как пользователь проходит через мастер установки и делает несколько вариантов, обычно нужно отобразить VerifyReadyDlg, чтобы сказать "Готовы ли вы установить?"

Встроенный VerifyReadyDlg является статическим. Это не представляет резюме выборов, которые он сделал ранее. Я хотел бы изменить это так, чтобы это сделало.

Как я могу это сделать?


пример

"Статический" текст:
alt text

Интеллектуальный текст:
alt text

Я не верю, что могу изменить таблицу управления в MSI, потому что моды во время процесса установки не разрешены. Я нашел MsiViewModifyInsertTeorary, но я не думаю, что это будет работать. Соответствующая строка в таблице Control уже присутствует и содержит статические данные. Я хочу изменить данные непосредственно перед отображением VerifyReadyDlg.

Ответ 1

Возможно, вам не удастся изменить существующие строки в таблицах MSI, но вы можете вставить новые "временные" строки.

Итак, в пользовательском действии во время выполнения вставьте одну или несколько временных строк в таблицу управления. В 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 в таблице Control. Его можно настроить с помощью файла .wxl, вставив что-то вроде этого:

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

    Это приводит к строке в таблице управления. Но вы не можете удалять строки из таблицы во время выполнения.
    Если вы выберете X, Y и Height, Width для вашего нового пользовательского текста будет таким же, как для статического InstallText, то InstallText будет закрыт.

  • Может показаться противоречивым использование "НЕ установлен" в качестве условия - но помните, что это состояние мира перед запуском Мастера установки. Если MSI Installed до запуска Мастера, то вы, вероятно, не устанавливаете его, а это означает, что вам не нужно отображать выбор, сделанный в мастере.

  • Конечно, вы можете добавить несколько элементов управления таким образом. Вы можете добавить несколько элементов управления текстом или... Вы можете добавить строки, кнопки, флажки, что угодно. Для каждого из них вам необходимо установить тип управления и геометрию соответствующим образом. Используйте Orca, чтобы изучить таблицу Control, чтобы выяснить, как это сделать.

  • Этот подход работает для любого диалога. Вам нужно только выполнить произвольное действие, чтобы вставить строки temp в таблицу Control, в какой-то момент в InstallUISequence, перед визуализацией Dialog.