2012-07-16 47 views
0

我已经设置我的安装程序以使用此post中提及的代码检查现有版本,然后在安装新版本之前调用卸载程序。很棒。我的问题是,卸载/安装步骤后,新版本卸载(unins000.exe)没有创建(或者它可能是但被删除的IDK)。这可以防止稍后再正确卸载新版本。如果没有现有版本,则始终创建卸载程序。我究竟做错了什么?版本升级后未创建卸载程序

+0

你执行卸载安装的任何部分开始之前 - 在InitializeSetup通常是()?你确定目标目录(应放置unins000.exe的目录)是否正确? – Slappy 2012-07-17 05:36:42

+0

您是否在'[Setup]'部分使用'Uninstallable = no'或类似的选项?另外:通常不建议在更新之前卸载。只要将更新安装在顶部并使用'[InstallDelete]'来摆脱任何现在多余的文件。另外,如果你确实建议你最终运行卸载程序,那么你必须从“PrepareToInstall”中这样做。不早,不晚。 – Miral 2012-07-17 09:12:13

+0

我开始在每个我引用的帖子的CurStepChanged(CurStep = ssInstall)中进行卸载。卸载的= YES。我需要运行卸载程序,因为我的服务需要在升级完成前关闭并正常运行。我会尝试将卸载步骤更改为PrepareToInstall。 – Dan 2012-07-17 11:29:09

回答

1

你可以使用克雷格·麦昆的解决方案在这里原贴:InnoSetup: How to automatically uninstall previous installed version?

function GetUninstallString(): String; 
var 
    sUnInstPath: String; 
    sUnInstallString: String; 
    begin 
     sUnInstPath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{{A227028A-40D7-4695-8BA9-41DF6A3895C7}_is1'); //Your App GUID/ID 
     sUnInstallString := ''; 
      if not RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString) then 
       RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString); 
       Result := sUnInstallString; 
    end; 

function IsUpgrade(): Boolean; 
    begin 
     Result := (GetUninstallString() <> ''); 
    end; 

function InitializeSetup: Boolean; 
var 
    V: Integer; 
    iResultCode: Integer; 
    sUnInstallString: String; 
    begin 
     if RegValueExists(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\{A227028A-40D7-4695-8BA9-41DF6A3895C7}_is1', 'UninstallString') then begin 
//Your App GUID/ID 
      V := MsgBox(ExpandConstant('{cm:YesNoUninstall}'), mbInformation, MB_YESNO); //Custom Message if App installed 
      if V = IDYES then begin 
       sUnInstallString := GetUninstallString(); 
       sUnInstallString := RemoveQuotes(sUnInstallString); 
       Exec(ExpandConstant(sUnInstallString), '', '', SW_SHOW, ewWaitUntilTerminated, iResultCode); 
       Result := True; //if you want to proceed after uninstall 
       //Exit; //if you want to quit after uninstall 
      end 
      else begin 
       Result := False; //when older version present and not uninstalled 
      end; 
     end 
     else begin 
      Result := True; //when no previous version found 
     end; 
    end; 
相关问题