From e61bd319acaca0b683d283e605789435f4b67d1f Mon Sep 17 00:00:00 2001 From: luisangelsm Date: Thu, 27 Nov 2025 21:47:14 +0100 Subject: [PATCH] Uninstall the previous version of YACReader before installing the new one Some users have experience problems when installing the app over an older installation, let's see if this works as expected. --- ci/win/build_installer.iss | 55 ++++++++++++++++++++++++++++++++++ ci/win/build_installer_qt6.iss | 55 ++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+) diff --git a/ci/win/build_installer.iss b/ci/win/build_installer.iss index 350d2e8c..23d9c753 100644 --- a/ci/win/build_installer.iss +++ b/ci/win/build_installer.iss @@ -1,6 +1,7 @@ [Setup] DefaultGroupName=YACReader LanguageDetectionMethod=locale +AppId={{019AC70F-0312-76B8-BD8F-BE9DCBF49E25} AppName=YACReader AppVerName=YACReader v{#VERSION}.{#BUILD_NUMBER} AppVersion={#VERSION}.{#BUILD_NUMBER} @@ -134,6 +135,60 @@ CompileLogMethod=append var donationPage: TOutputMsgWizardPage; var URLLabel: TNewStaticText; +function GetUninstallString(): String; +var + sUnInstPath: String; + sUnInstallString: String; +begin + // First try the new AppId-based key + sUnInstPath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#emit SetupSetting("AppId")}_is1'); + sUnInstallString := ''; + if not RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString) then + RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString); + + // If not found, try the old AppName-based key (for versions without AppId) + if sUnInstallString = '' then begin + sUnInstPath := 'Software\Microsoft\Windows\CurrentVersion\Uninstall\YACReader_is1'; + if not RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString) then + RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString); + end; + + Result := sUnInstallString; +end; + +function IsUpgrade(): Boolean; +begin + Result := (GetUninstallString() <> ''); +end; + +function UnInstallOldVersion(): Integer; +var + sUnInstallString: String; + iResultCode: Integer; +begin + Result := 0; + sUnInstallString := GetUninstallString(); + if sUnInstallString <> '' then begin + sUnInstallString := RemoveQuotes(sUnInstallString); + if Exec(sUnInstallString, '/SILENT /NORESTART /SUPPRESSMSGBOXES','', SW_HIDE, ewWaitUntilTerminated, iResultCode) then + Result := 3 + else + Result := 2; + end else + Result := 1; +end; + +procedure CurStepChanged(CurStep: TSetupStep); +begin + if (CurStep=ssInstall) then + begin + if (IsUpgrade()) then + begin + UnInstallOldVersion(); + end; + end; +end; + procedure URLLabelOnClick(Sender: TObject); var ErrorCode: Integer; begin diff --git a/ci/win/build_installer_qt6.iss b/ci/win/build_installer_qt6.iss index 7baab194..3c518cfc 100644 --- a/ci/win/build_installer_qt6.iss +++ b/ci/win/build_installer_qt6.iss @@ -1,6 +1,7 @@ [Setup] DefaultGroupName=YACReader LanguageDetectionMethod=locale +AppId={{019AC70F-0312-76B8-BD8F-BE9DCBF49E25} AppName=YACReader AppVerName=YACReader v{#VERSION}.{#BUILD_NUMBER} AppVersion={#VERSION}.{#BUILD_NUMBER} @@ -138,6 +139,60 @@ CompileLogMethod=append var donationPage: TOutputMsgWizardPage; var URLLabel: TNewStaticText; +function GetUninstallString(): String; +var + sUnInstPath: String; + sUnInstallString: String; +begin + // First try the new AppId-based key + sUnInstPath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#emit SetupSetting("AppId")}_is1'); + sUnInstallString := ''; + if not RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString) then + RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString); + + // If not found, try the old AppName-based key (for versions without AppId) + if sUnInstallString = '' then begin + sUnInstPath := 'Software\Microsoft\Windows\CurrentVersion\Uninstall\YACReader_is1'; + if not RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString) then + RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString); + end; + + Result := sUnInstallString; +end; + +function IsUpgrade(): Boolean; +begin + Result := (GetUninstallString() <> ''); +end; + +function UnInstallOldVersion(): Integer; +var + sUnInstallString: String; + iResultCode: Integer; +begin + Result := 0; + sUnInstallString := GetUninstallString(); + if sUnInstallString <> '' then begin + sUnInstallString := RemoveQuotes(sUnInstallString); + if Exec(sUnInstallString, '/SILENT /NORESTART /SUPPRESSMSGBOXES','', SW_HIDE, ewWaitUntilTerminated, iResultCode) then + Result := 3 + else + Result := 2; + end else + Result := 1; +end; + +procedure CurStepChanged(CurStep: TSetupStep); +begin + if (CurStep=ssInstall) then + begin + if (IsUpgrade()) then + begin + UnInstallOldVersion(); + end; + end; +end; + procedure URLLabelOnClick(Sender: TObject); var ErrorCode: Integer; begin