由先前版本的已执行卸载程序导致系统重新启动后恢复安装程序

时间:2018-06-05 06:25:57

标签: windows inno-setup

我有一个合理标准的Inno Setup安装程序。卸载运行时,需要重新启动,它会删除服务并取消注册DLL。我有一些代码可以检测到旧版本的软件(感谢stackoverflow)。如果检测到旧版本并且用户想要安装较新版本:

  1. 调用卸载程序
  2. 已卸载该软件
  3. 系统(正确)重新启动
  4. 系统启动,我重新登录
  5. 现在应该发生的事情(恕我直言)是安装人员应该从中断的地方继续,即。将新版本安装到与旧版本相同的文件夹中。但它没有,没有任何反应。我已经阅读了帮助文件,检查了开关(尽我所能),然后向谷歌博士询问,但没有。

    我的问题:是否可以这样做,即。重启后继续安装,如果是,怎么做?

    这是我的(很多stackoverflow)代码,除了在系统重启时没有任何事情继续(如果你需要安装程序的任何其他部分让我知道):

    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 :(得分:2)

当从安装程序调用的卸载程序重新启动系统时,安装程​​序将中止。

如果您想在重启后恢复安装程序,则必须自己处理。

例如,您可以将安装程序本身添加到RunOnce

RegWriteStringValue(
  HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\RunOnce', 
  'ResumeMyInstaller', ExpandConstant('{srcexe}'));