2012-07-31 17 views
15

Kullanıcının yazılımı önceden yükleyip yüklemediğini nasıl tespit edebilirim ve eski sürümü kaldırma olasılığını nasıl sunabilirim?Eski kurulum nasıl tespit edilir ve kaldırılır?

Bunu kontrol etmek için birkaç satır yazdım. Şimdilik bu doğru mu? Bu doğruysa, kullanıcının yüklemeye devam etmek mi yoksa eski sürümü mi kaldırmak istediğini nasıl seçebilirim?

#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; 
+2

Not. İstisnalar, Inno olmayan bir kurulumdan yükseltme yaparken. Inno'yu kullandıktan sonra, bunu sizin için sihirli bir şekilde ele alır. – Deanna

+1

Mümkün olan yinelenen [InnoSetup: Yüklenen önceki sürümü otomatik olarak nasıl kaldırılır?] (Http://stackoverflow.com/questions/2000296/innosetup-how-to-automatically-uninstall-previous-installed-version) – Deanna

+0

@Deanna Benim için müşteri bu yazılımın her zaman bir inno kurulumuyla kurulacağı doğrudur. Ama Inno gerçekten "işlemez" değil mi? Tek yaptığı tüm eski dosyaların üzerine yazıyor. Ve bir Uninstaller oluşturabilirim. Ama ilk kurulumumdaki Kaldırma işlevselliğini istiyorum. – Exa

cevap

18

en başta burada yayınlanan Craig McQueen'in çözümü kullanabilirsiniz: InnoSetup: How to automatically uninstall previous installed version? bir Inno tabanlı kurulum ile bunu yapmak için herhangi bir ihtiyaç normalde olmadığını

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; 
+0

Bu işe yaradı! Sanırım bu soru yakında çoğaltılacak. Bu konuyla ilgili daha önce sorulmuş olan başka bir soru görmedim. – Exa

+0

bu işlevi nasıl kullanırım? hangi bölümde? innosetup acemi burada – sam

+1

+1 Sadece birkaç not. Uygulama yönetici olmayan bir kullanıcı tarafından yüklendiyse kod çalışmaz (kayıt defteri anahtarı HKCU'da değil, HKLM'de değil). Kayıt defteri anahtar yolunda 'AppId 'tekrarını önlemek için' {#SetupSetting ("AppId")} 'veya preprocessor değişkenini de kullanabilirsiniz. Örneğim için [Inno Setup: Yüklemenin üzerine yazılır, ancak değişiklik yapılmaz mı?] (Http://stackoverflow.com/q/30566752/850848) cevabımı görün. Ya da [bu kodun kaynağı] (http://stackoverflow.com/a/2099805/850848), bunun da sonuncusu kaplıdır. –

İlgili konular