Во время установки моего приложения пользователь может установить новый экземпляр 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
как дочерний процесс. Так что эта проблема становится еще сложнее. = (