Отмена установки из моего пользовательского действия - PullRequest
3 голосов
/ 16 марта 2010

Я пишу установщик для моей программы, используя установщик Windows (не wix). В некоторых случаях я хочу отменить процесс установки из моего пользовательского действия. Кроме того, я хочу показать сообщение об ошибке с моим текстом. Как это сделать?

C #, .net 3.5

Ответы [ 3 ]

3 голосов
/ 11 мая 2010

Вы можете сделать это, создав пользовательское действие с ошибкой. Установите условие настраиваемого действия по ошибке как условие сбоя (если условие оценивается как истинное, установка завершится неудачно) и задайте в сообщении свой настраиваемый текст.

1 голос
/ 12 октября 2011

Просто верните ERROR_INSTALL_USEREXIT из вашего пользовательского действия.

http://msdn.microsoft.com/en-us/library/windows/desktop/aa368072(v=vs.85).aspx

Пожалуйста, см. Следующую ссылку для отображения сообщения об ошибке:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa371247(v=vs.85).aspx

1 голос
/ 12 октября 2011

Рабочая вещь для меня:

Контекст: по какой-то причине мне нужно проверить, установлен ли пользователь 3.5SP1, отменить установку и перенаправить на правильную страницу загрузки, если нет.

Шаг1: Измените ваш установщик, как это

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Install(IDictionary stateSaver)
    {
        //Check if the FrameWork 3.5SP1 is installed
        if (mycondition)
        {
            //3.5SP1 is installed, ask for framework install
            if (TopMostMessageBox.Show("body", "title", MessageBoxButtons.YesNo) == DialogResult.Yes)
                System.Diagnostics.Process.Start("http://Microsoft FRW Link");

            WindowHandler.Terminate();
        }
        else
            base.Install(stateSaver);
    }

Шаг2: Используйте этот код для размещения вашего MessageBox (я взял его в другом месте, нет времени, чтобы найти его самостоятельно)

static public class TopMostMessageBox
{
    static public DialogResult Show(string message)
    {
        return Show(message, string.Empty, MessageBoxButtons.OK);
    }

    static public DialogResult Show(string message, string title)
    {
        return Show(message, title, MessageBoxButtons.OK);
    }

    static public DialogResult Show(string message, string title,
        MessageBoxButtons buttons)
    {
        // Create a host form that is a TopMost window which will be the 

        // parent of the MessageBox.

        Form topmostForm = new Form();
        // We do not want anyone to see this window so position it off the 

        // visible screen and make it as small as possible

        topmostForm.Size = new System.Drawing.Size(1, 1);
        topmostForm.StartPosition = FormStartPosition.Manual;
        System.Drawing.Rectangle rect = SystemInformation.VirtualScreen;
        topmostForm.Location = new System.Drawing.Point(rect.Bottom + 10,
            rect.Right + 10);
        topmostForm.Show();
        // Make this form the active form and make it TopMost

        topmostForm.Focus();
        topmostForm.BringToFront();
        topmostForm.TopMost = true;
        // Finally show the MessageBox with the form just created as its owner

        DialogResult result = MessageBox.Show(topmostForm, message, title,
            buttons);
        topmostForm.Dispose(); // clean it up all the way


        return result;
    }
}

Шаг 3: Убить Мсиэкса

internal static class WindowHandler
{
    internal static void Terminate()
    {
        var processes = Process.GetProcessesByName("msiexec").OrderBy(x => x.StartTime); \\DO NOT FORGET THE ORDERBY!!! It makes the msi processes killed in the right order
        foreach (var process in processes)
        {
            var hWnd = process.MainWindowHandle.ToInt32(); 
            ShowWindow(hWnd, 0); //This is to hide the msi window and only show the popup
            try
            {
                process.Kill();
            }
            catch
            {
            }
        }
    }

    [DllImport("User32")]
    private static extern int ShowWindow(int hwnd, int nCmdShow);
}

Смешайте его ложкой, а не шейкером и подавайте;)

...