Возобновить установку после перезагрузки системы, вызванной выполнением удаления предыдущей версии - PullRequest
0 голосов
/ 05 июня 2018

У меня достаточно стандартный установщик Inno Setup.Когда деинсталляция запускается, необходима перезагрузка, она удаляет сервис и отменяет регистрацию DLL.У меня есть некоторый код, который обнаруживает более старую версию программного обеспечения (спасибо stackoverflow).Если обнаружена более старая версия и пользователь хочет установить более новую версию:

  1. Деинсталлятор вызывается
  2. Программа деинсталлирована
  3. Система (правильно)перезагружается
  4. Система запускается, и я снова вхожу в систему

Что должно произойти сейчас (ИМХО), это то, что установщик должен продолжить с того места, где он остановился, т.е.установка новой версии в ту же папку, что и старая версия.Но это не так, ничего не происходит.Я прочитал файлы справки, проверил переключатели (в меру своих ограниченных возможностей) и спросил доктора Гугла, но ничего.

Мой вопрос: Возможно ли это сделать, т.е.,продолжить установку после перезагрузки, и, если да, то как?

Вот мой (в значительной степени стековый поток) код, который работает, за исключением того, что ничего не продолжается при перезагрузке системы (если вам нужен какой-либо из других разделовустановщик, дайте мне знать):

function InitializeSetup(): Boolean;
var
  oldVersion: String;
  uninstaller: String;
  ErrorCode: Integer;
begin

  if RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#MyAppID}_is1') then
  begin
    RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#MyAppID}_is1', 'DisplayVersion', oldVersion);
    if (CompareVersion(oldVersion, '{#MyAppVersion}') < 0) then
    begin
      if MsgBox('Version ' + oldVersion + ' of EMPSecure is already installed. Continue to use this old version?', mbConfirmation, MB_YESNO) = IDYES then
      begin
        Result := False;
      end
      else
      begin
          RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#MyAppID}_is1', 'UninstallString', uninstaller);
          ShellExec('runas', uninstaller, '/SILENT', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
          if (ErrorCode <> 0) then
          begin
            MsgBox( 'Failed to uninstall EMPSecure version ' + oldVersion + '. Please restart Windows and run setup again.', mbError, MB_OK );
            Result := False;
          end
          else
          begin
            Result := True;
          end;
      end;
    end
    else
    begin
      MsgBox('Version ' + oldVersion + ' of EMPsecure is already installed. This installer will exit.', mbInformation, MB_OK);
      Result := False;
    end;
  end
  else
  begin
    Result := True;
  end;
end;

1 Ответ

0 голосов
/ 05 июня 2018

Когда деинсталлятор, вызванный из программы установки, перезапускает систему, программа установки прерывается навсегда.

Если вы хотите возобновить программу установки после перезапуска, вы должны позаботиться об этом самостоятельно.

Например, вы можете добавить сам установщик в RunOnce:

RegWriteStringValue(
  HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\RunOnce', 
  'ResumeMyInstaller', ExpandConstant('{srcexe}'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...