J'utilise Inno Setup pour créer un programme d'installation.
Je veux que le programme d'installation désinstalle automatiquement la version installée précédemment, au lieu de l'écraser. Comment puis-je faire cela ?
J'utilise Inno Setup pour créer un programme d'installation.
Je veux que le programme d'installation désinstalle automatiquement la version installée précédemment, au lieu de l'écraser. Comment puis-je faire cela ?
Pour tous ceux qui utilisent le GetUninstallString()
suggéré ci-dessus pour forcer une désinstallation dans CurStepChanged()
et a des problèmes de cache sur le disque, voir ci-dessous pour une solution apparentée qui attend en fait un certain temps après la désinstallation pour que l'exe de désinstallation soit supprimé !
Vous pouvez exécuter un désinstalleur dans la section [code]. Vous devez trouver comment obtenir le chemin vers le désinstalleur existant. Pour simplifier, lorsque j'installe mes applications, j'ajoute une valeur de chaîne de registre qui pointe vers le dossier contenant le désinstalleur, et j'exécute simplement le désinstalleur dans le callback InitializeWizard.
Gardez à l'esprit que les noms des désinstallateurs d'Inno setup sont tous de la forme uninsnnn.exe, vous devez en tenir compte dans votre code.
J'ai modifié le code de @Crain Mc-Queen, je pense que ce code est meilleur parce qu'il n'a pas besoin d'être modifié dans différents projets :
[Code]
function GetNumber(var temp: String): Integer;
var
part: String;
pos1: Integer;
begin
if Length(temp) = 0 then
begin
Result := -1;
Exit;
end;
pos1 := Pos('.', temp);
if (pos1 = 0) then
begin
Result := StrToInt(temp);
temp := '';
end
else
begin
part := Copy(temp, 1, pos1 - 1);
temp := Copy(temp, pos1 + 1, Length(temp));
Result := StrToInt(part);
end;
end;
function CompareInner(var temp1, temp2: String): Integer;
var
num1, num2: Integer;
begin
num1 := GetNumber(temp1);
num2 := GetNumber(temp2);
if (num1 = -1) or (num2 = -1) then
begin
Result := 0;
Exit;
end;
if (num1 > num2) then
begin
Result := 1;
end
else if (num1 < num2) then
begin
Result := -1;
end
else
begin
Result := CompareInner(temp1, temp2);
end;
end;
function CompareVersion(str1, str2: String): Integer;
var
temp1, temp2: String;
begin
temp1 := str1;
temp2 := str2;
Result := CompareInner(temp1, temp2);
end;
function InitializeSetup(): Boolean;
var
oldVersion: String;
uninstaller: String;
ErrorCode: Integer;
vCurID :String;
vCurAppName :String;
begin
vCurID:= '{#SetupSetting("AppId")}';
vCurAppName:= '{#SetupSetting("AppName")}';
//remove first "{" of ID
vCurID:= Copy(vCurID, 2, Length(vCurID) - 1);
//
if RegKeyExists(HKEY_LOCAL_MACHINE,
'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + vCurID + '_is1') then
begin
RegQueryStringValue(HKEY_LOCAL_MACHINE,
'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + vCurID + '_is1',
'DisplayVersion', oldVersion);
if (CompareVersion(oldVersion, '{#SetupSetting("AppVersion")}') < 0) then
begin
if MsgBox('Version ' + oldVersion + ' of ' + vCurAppName + ' 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\' + vCurID + '_is1',
'UninstallString', uninstaller);
ShellExec('runas', uninstaller, '/SILENT', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
Result := True;
end;
end
else
begin
MsgBox('Version ' + oldVersion + ' of ' + vCurAppName + ' is already installed. This installer will exit.',
mbInformation, MB_OK);
Result := False;
end;
end
else
begin
Result := True;
end;
end;
Pour ceux qui sont intéressés, j'ai écrit une DLL pour Inno Setup 6 et plus qui fournit un mécanisme simple pour supporter la désinstallation automatique.
La DLL fournit un moyen de détecter si le paquet que vous installez est déjà installé (par l'intermédiaire de AppId
) et de décider, en fonction de la version installée, si vous voulez la désinstaller automatiquement (par exemple, vous pourriez vouloir la désinstaller automatiquement si l'utilisateur effectue une mise à niveau inférieure).
Je ne suis pas sûr de ce que vous essayez de dire, mais notez qu'il ne s'agit pas toujours uniquement de copier des fichiers. Imaginez que vous ayez installé votre produit, qui, avec la prochaine version, est livré avec une structure de fichiers totalement modifiée, où de nombreux fichiers d'origine ont été supprimés et les nouveaux fichiers ont des noms différents et sont stockés dans des répertoires différents. Quel serait le moyen le plus simple de faire une mise à jour ? Ne serait-ce pas de désinstaller la version précédente ?
J'utilise INNO pour installer un pilote et les applications qui l'accompagnent. Naturellement, l'installation/la suppression du pilote n'est pas effectuée directement par INNO. INNO copie plutôt une application d'installation/suppression de pilote et l'exécute. La désinstallation se fait de la même manière : INNO exécute le programme de suppression du pilote, puis supprime les fichiers.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
2 votes
Notez que comme mlaan a déclaré il n'est normalement pas nécessaire de le faire avec une installation basée sur Inno, à moins que vous ne mettiez à niveau une version non Inno.
7 votes
Deanna : cela dépend des cas. Pour certains programmes avec des systèmes de plugins automatiques, qui lisent tout ce qui se trouve dans un dossier, la suppression des anciens fichiers est une nécessité absolue lors de l'installation d'une nouvelle version, et le simple fait d'exécuter la désinstallation est généralement le moyen le plus propre de le faire.
1 votes
@Nyerguds Mais InnoSetup s'occupe de cela en ayant une option pour supprimer certains fichiers/dossiers avant que l'installation ne commence (drapeau "InstallDelete") donc vous n'auriez pas besoin de désinstaller l'ancienne version d'abord.
3 votes
NickG : Encore une fois, cela dépend du cas. Ce serait la situation idéale, oui, et de loin la préférée, mais en réalité, il y a beaucoup de situations non idéales. Les fichiers dll enregistrés, sur de nombreuses versions cibles possibles, en sont un exemple.
0 votes
Voir aussi Détecter et désinstaller l'ancienne version de l'application dans Inno Setup en utilisant son numéro de version stocké dans le registre. .