2012-07-31 25 views
15

如何检测用户是否已安装软件,如果有,如何提供删除旧版本的可能性?如何检测旧的安装和报价删除?

我写了一些行来检查。现在是否正确?如果这是正确的,那么我该如何让用户选择是否要继续安装或卸载旧版本?

#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

需要注意的是,通常没有任何需要与基于Inno Setup的做到这一点。从非Inno设置升级时例外。一旦你使用Inno,那么它神奇地为你处理这一切。 – Deanna 2012-07-31 12:10:25

+1

[InnoSetup:如何自动卸载以前安装的版本?]的可能重复(http://stackoverflow.com/questions/2000296/innosetup-how-to-automatically-uninstall-previous-installed-version) – Deanna 2012-07-31 12:11:30

+0

@Deanna对于我的客户确实一直在用inno setup安装这个软件。但Inno并没有真正“处理”它,是吗?它所做的只是覆盖所有旧文件。我可以生成一个卸载程序。但是我想在我的初始设置中使用卸载功能。 – Exa 2012-07-31 12:34:40

回答

18

你可以使用克雷格·麦昆的解决方案在这里原贴:InnoSetup: How to automatically uninstall previous installed version?

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

感谢这工作!不过,我想这个问题很快就会被重复关闭。没有看到关于这个问题已经被问到的另一个问题。 – Exa 2012-07-31 12:35:29

+0

如何使用/调用这个函数?在哪一节? innosetup新手在这里 – sam 2015-05-08 08:57:18

+1

+1只是几个笔记。如果应用程序是由非管理员安装的(因此注册表项在“HKCU”而不是“HKLM”中),代码将不起作用。也可以使用'{#SetupSetting(“AppId”)}'或预处理器变量来避免在注册表键路径中重复'AppId'。查看我对[Inno Setup:如何覆盖安装而不是更改?](http://stackoverflow.com/q/30566752/850848)的答案。或[此代码的源代码](http://stackoverflow.com/a/2099805/850848),其中后者也覆盖。 – 2016-02-24 13:34:20