Como detectar a instalação antiga e oferecer a remoção?

Como faço para detectar se o usuário já instalou o software e, em caso afirmativo, como oferecer a possibilidade de remover a versão antiga?

Eu escrevi algumas linhas para verificar isso. Isso está correto por enquanto? Se isso estiver correto, como posso permitir que o usuário escolha se deseja continuar a instalação ou desinstalar a versão antiga?

#define UNINSTKEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\setupname_is1" var uninstallPath: string; function InitializeSetup: Boolean; begin if (RegQueryStringValue(HKLM,'{#UNINSTKEY}','UninstallString',uninstallPath)) and (uninstallPath  '') and (fileexists(uninstallPath)) then begin Result := (MsgBox(CustomMessage('NotVerifiedVersionFound'), mbConfirmation, MB_YESNO or MB_DEFBUTTON2) = IDYES); end; { ... } end; 

Você poderia usar a solução de Craig McQueen publicada originalmente aqui: InnoSetup: Como desinstalar automaticamente a versão instalada anterior?

 function GetUninstallString: string; var sUnInstPath: string; sUnInstallString: String; begin Result := ''; 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 Result := True; { in case when no previous version is found } if RegValueExists(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\{A227028A-40D7-4695-8BA9-41DF6A3895C7}_is1', 'UninstallString') then { Your App GUID/ID } begin V := MsgBox(ExpandConstant('Hey! An old version of app was detected. Do you want to uninstall it?'), 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 Result := False; { when older version present and not uninstalled } end; end;