我有一个合理标准的Inno Setup安装程序。卸载运行时,需要重新启动,它会删除服务并取消注册DLL。我有一些代码可以检测到旧版本的软件(感谢stackoverflow)。如果检测到旧版本并且用户想要安装较新版本:
现在应该发生的事情(恕我直言)是安装人员应该从中断的地方继续,即。将新版本安装到与旧版本相同的文件夹中。但它没有,没有任何反应。我已经阅读了帮助文件,检查了开关(尽我所能),然后向谷歌博士询问,但没有。
我的问题:是否可以这样做,即。重启后继续安装,如果是,怎么做?
这是我的(很多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;
答案 0 :(得分:2)
当从安装程序调用的卸载程序重新启动系统时,安装程序将中止。
如果您想在重启后恢复安装程序,则必须自己处理。
例如,您可以将安装程序本身添加到RunOnce
:
RegWriteStringValue(
HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\RunOnce',
'ResumeMyInstaller', ExpandConstant('{srcexe}'));