Saya menggunakan Pengaturan Inno untuk membuat penginstal.
Saya ingin penginstal mencopot pemasangan versi sebelumnya secara otomatis, alih-alih menimpanya. Bagaimana saya bisa melakukan itu?
installation
inno-setup
Quan Mai
sumber
sumber
Jawaban:
Anda harus bisa membaca uninstall string dari registri, mengingat AppId (yaitu nilai yang Anda digunakan untuk
AppID
di[Setup]
-bagian). Ini dapat ditemukan di bawahSoftware\Microsoft\Windows\CurrentVersion\Uninstall\{AppId}\
(bisa jadi salah satuHKLM
atauHKCU
, jadi sebaiknya periksa keduanya) di mana{AppId}
harus diganti dengan nilai sebenarnya yang Anda gunakan. CariUninstallString
atauQuietUninstallString
nilai dan gunakanExec
fungsi untuk menjalankannya dariInitializeSetup()
fungsi acara Anda .Pembaruan: hapus solusi alternatif yang tidak berfungsi menggunakan
[Run]
entri -bagian dengan{uninstallexe}
- terima kasih kepada semua pemberi komentar yang menunjukkan hal ini!sumber
[Run]
solusi bagian akan berfungsi, karena terlambat dalam proses instalasi. Dari panduan Inno Setup: Bagian [Run] adalah opsional, dan menentukan sejumlah program yang akan dijalankan setelah program berhasil diinstal, tetapi sebelum program Setup menampilkan dialog terakhir.Saya telah menggunakan yang berikut ini. Saya tidak yakin ini cara termudah untuk melakukannya tetapi berhasil.
Penggunaan ini
{#emit SetupSetting("AppId")}
bergantung pada Inno Setup Preprocessor. Jika Anda tidak menggunakannya, potong dan tempel ID Aplikasi Anda secara langsung.[Code] { ///////////////////////////////////////////////////////////////////// } function GetUninstallString(): String; var sUnInstPath: String; sUnInstallString: String; begin 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); Result := sUnInstallString; end; { ///////////////////////////////////////////////////////////////////// } function IsUpgrade(): Boolean; begin Result := (GetUninstallString() <> ''); end; { ///////////////////////////////////////////////////////////////////// } function UnInstallOldVersion(): Integer; var sUnInstallString: String; iResultCode: Integer; begin { Return Values: } { 1 - uninstall string is empty } { 2 - error executing the UnInstallString } { 3 - successfully executed the UnInstallString } { default return value } Result := 0; { get the uninstall string of the old app } 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;
Alternatif
Lihat juga entri blog ini "Contoh Skrip Pengaturan Inno untuk Perbandingan Versi" yang melangkah lebih jauh, dan membaca nomor versi dari versi yang diinstal sebelumnya, dan membandingkan nomor versi itu dengan nomor versi paket penginstalan saat ini.
sumber
... UserSIDs: TArrayOfString; I: Integer; ... if not RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString) then if isAdminLoggedOn() and RegGetSubkeyNames( HKEY_USERS, '', UserSIDs ) then for I := 0 to GetArrayLength( UserSIDs ) - 1 do begin if RegQueryStringValue( HKEY_USERS, UserSIDs[I] + '\' + sUnInstPath, 'UninstallString', sUnInstallString ) then break; end;
Jika Anda "hanya ingin menghapus ikon lama" (karena milik Anda telah diubah / diperbarui) Anda dapat menggunakan ini:
Ini dijalankan "pada awal penginstalan" jadi pada dasarnya menghapus ikon lama, dan yang baru akan tetap dipasang di sana setelah ini selesai.
Saya hanya melakukan ini dengan setiap penginstalan ikon "jika ada yang berubah" (semuanya tetap diinstal ulang).
sumber
Saat menggunakan Inno Setup, tidak ada alasan untuk menghapus versi sebelumnya kecuali versi tersebut diinstal oleh program penginstal yang berbeda. Jika tidak, peningkatan akan ditangani secara otomatis.
sumber
[InstallDelete]
bagian untuk menghapus file / direktori lama. File baru kemudian akan ditempatkan di lokasi yang benar selama instalasi.Jawaban yang diberikan oleh Craig McQueen benar-benar layak. Meskipun, saya akan menambahkan komentar itu:
{#emit SetupSetting("AppId")}
kode tidak bekerja untuk saya, jadi saya hanya menambahkan saya App ID.Jadi, terkait kode Craig McQueen, perubahannya adalah:
InstallLocation
kunci, bukanUninstallString
kunci.DelTree
fungsi alih-alihExec(sUnInstallString, ...)
sumber
Bagi siapa pun yang menggunakan yang
GetUninstallString()
disarankan di atas untuk memaksa uninstall di dalamCurStepChanged()
dan memiliki masalah cache disk, lihat di bawah untuk solusi terkait yang benar-benar menunggu beberapa saat setelah unistallation untuk uninstaller exe untuk dihapus!Masalah cache disk dengan inno-setup?
sumber
Anda dapat menjalankan uninstaller di bagian [code]. Anda harus mencari cara untuk mendapatkan path ke uninstaller yang ada. Untuk mempermudah ketika saya menginstal aplikasi saya, saya menambahkan nilai string registri yang mengarah ke folder yang berisi uninstaller, dan hanya menjalankan uninstaller di callback InitializeWizard.
Perlu diingat bahwa nama uninstaller penyiapan Inno semuanya dalam bentuk uninsnnn.exe, Anda harus memperhitungkannya dalam kode Anda.
sumber
Saya mendapat kode @Crain Mc-Queen diedit, saya pikir kode ini lebih baik karena tidak perlu dimodifikasi di proyek yang berbeda:
sumber
Saya pasti melewatkan sesuatu. File baru disalin ke direktori target sebelum penghapusan instalasi lama terjadi. Kemudian datang uninstaller menghapusnya dan menghapus direktori.
sumber
Jangan gunakan bagian [Run], tetapi [UninstallRun]. Sebenarnya, program di bawah [Run] dijalankan setelah penginstalan, menyebabkan penginstalan program Anda segera setelah penginstalan: - | Sebaliknya, bagian [UninstallRun] dievaluasi sebelum instalasi.
sumber
[UninstallRun]
bukanlah solusi untuk pertanyaan tersebut.Ikuti tautan ini: http://news.jrsoftware.org/news/innosetup/msg55323.html
Dalam fungsi InitializeSetup (), Anda dapat memanggil "MSIEXEC / x {ID program Anda}" setelah pengguna meminta untuk menghapus versi lama
sumber