Отмена программно запущенной SQL Server Express Install - PullRequest
1 голос
/ 09 марта 2009

Во время установки моего приложения пользователь может установить новый экземпляр SQL Server Express 2005 на локальном компьютере, если он по какой-либо причине не хочет использовать уже существующий SQL Server 2005 в своей сети.

Поскольку установка SQL Server является необязательной, она не является обязательной для моего установщика. Вместо этого я просто связываю установку sqlexpr32.exe на моем установочном носителе и программно запускаю ее с соответствующими аргументами командной строки для выполнения автоматической установки. (Примечание: я использую флаг командной строки / qb, поэтому установка не работает без вывода сообщений, показывает интерфейс пользователя, но не запрашивает ввод данных пользователем ). И если кто-то захочет узнать, я следую этой статье Microsoft о том, как запустить установку SQL Server Express.

Вот что я делаю в своем пользовательском действии установки:

// All this runs on a background thread so the user
// can cancel my app's setup at any time

// Launch the installer
Process setupProcess = new Process();
setupProcess.StartInfo.FileName = "sqlexpr32.exe";
setupProcess.StartInfo.Arguments = " a bunch of command line args here";
setupProcess.StartInfo.UseShellExecute = false; // to avoid a shell window
setupProcess.Start();

// At this point the SQL Server installer is running

// Monitor the process on 2-second intervals:
while (!setupProcess.WaitForExit(2000))
{
    if(WasCancelled) // flag that is set when the user cancels my app's setup
    {
        // This following line is my problem. Sending CloseMainWindow does not 
        // seem to work. The SQL Server installer just keeps running.
        setupProcess.CloseMainWindow();
        setupProcess.WaitForExit();
        break;
    }
} 

// After this point I build a results report for the user. 
// My app's installer does not yet quit even if it was canceled.

Итак, мой вопрос: Как я могу «сигнализировать» процессу установки SQL Server об отмене и выходе?

Эта строка, похоже, ничего не делает:

setupProcess.CloseMainWindow();

Это также не работает:

setupProcess.Close(); // This closes my handle. Not the target process.

И я, очевидно, не хотел бы просто убивать процесс, поскольку я мог бы оставить машину пользователя в не очень желаемом состоянии, в лучшем случае с большим количеством мусорных файлов или еще хуже, с поврежденной установкой.

Есть идеи? Отправка ключей или симуляция пользовательских кликов? Или, надеюсь, что-то менее хакерское?

EDIT:

Кажется, я выяснил, почему CloseMainWindow не работает:

  • Процесс, который я запускаю (sqlexpr32.exe), на самом деле не тот, который показывает пользовательский интерфейс для установщика SQLServer, а самораспаковывающийся exe, который, в свою очередь, запускает сервер sql real setup.exe как дочерний процесс. Так что эта проблема становится еще сложнее. = (

1 Ответ

2 голосов
/ 07 апреля 2009

Что если вы дождетесь завершения установки, а после этого - если пользователь отменил основной процесс - вы un установите его немедленно ?

Я знаю, что это более длительный процесс, но он понятен и прост.

...