Как отобразить сообщение об ошибке, используя управляемые настраиваемые действия с установщиком Windows - PullRequest
9 голосов
/ 16 декабря 2008

Я пишу управляемое настраиваемое действие. Я использую DTF Framework из Windows Installer Xml, чтобы обернуть управляемую dll в пригодную для использования dll CA. CA делает то, что должен, но у меня все еще проблемы с обработкой ошибок:

Dim record As New Record(1)

' Field 0 intentionally left blank
' Field 1 contains error number
record(1) = 27533
session.Message(InstallMessage.Error, record)

Приведенный выше код создает следующий текст, показанный в журнале MSI:

MSI (c) (C4! C6) [13: 15: 08: 749]: Продукт: TestMSI - Ошибка 27533. Пароли с учетом регистра не совпадают.

Номер ошибки относится к коду, содержащемуся в таблице ошибок в MSI. Приведенное выше сообщение является правильным.

Моя проблема: почему установщик Windows НЕ создает диалоговое окно, уведомляющее пользователя об ошибке?

Ответы [ 3 ]

15 голосов
/ 23 апреля 2009

MSI может сделать это, но вам нужно ИЛИ в некоторых дополнительных значениях для аргумента messageType.

например.

Record record = new Record();
record.FormatString = string.Format("Something has gone wrong!");

session.Message(
    InstallMessage.Error | (InstallMessage) ( MessageBoxIcon.Error ) |
    (InstallMessage) MessageBoxButtons.OK,
    record );

Подробнее см. в списке рассылки wix-users.

2 голосов
/ 11 января 2012

Я столкнулся с той же проблемой, в соответствии с Wix: Руководством разработчика по XML установщика Windows Ника Рамиреса, методы журнала и сообщений не работают, когда пользовательское действие вызывается из элемента управления пользовательского интерфейса.

0 голосов
/ 17 марта 2009

Если вы хотите, чтобы отображался диалог, содержащий сообщение, вы должны сделать это самостоятельно.

Вот код, который я использую для обработки ошибок в управляемых настраиваемых действиях, которые запускают SQL. Он показывает окно сообщения, если установка работает с полным пользовательским интерфейсом. Это в c #, но, надеюсь, вы поймете идею.

    private void _handleSqlException(SqlException ex)
    {
        StringBuilder errorMessage = new StringBuilder();
        errorMessage.Append("A SQL error has occurred.");
        for (int i = 0; i < ex.Errors.Count; i++)
        {
            errorMessage.Append("Index #" + i + "\n" +
                "Message: " + ex.Errors[i].Message + "\n" +
                "LineNumber: " + ex.Errors[i].LineNumber + "\n" +
                "Source: " + ex.Errors[i].Source + "\n" +
                "Procedure: " + ex.Errors[i].Procedure + "\n");
        }
        session.Log(errorMessage);
        if (session["UILevel"] == "5")
        {
            MessageBox.Show(errorMessage);
        }
    }
...