检查是否已安装任何(自定义)应用程序的先前版本并自动卸载(应用程序设置是使用NSIS开发的)

时间:2014-11-23 06:24:08

标签: inno-setup

在Inno设置中,我想检查是否安装了以前版本的应用程序,如果检测到它,则自动将其卸载。用于检查应用程序是否存在的注册表项是:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Shockwave Player 静默卸载命令是这样的:C:\Windows\system32\Adobe\Shockwave 12\uninstaller.exe /S注意 - 应用程序的设置是使用NSIS开发的。

还有一件事,如果找到以前的版本,我希望不显示消息框。同一应用程序的先前版本为v12.1.3.153或更低版本。 完整的Inno脚本供参考:http://pastebin.com/HmrNcFd4

所以请提供代码。非常感谢!!

1 个答案:

答案 0 :(得分:1)

首先,为应用程序创建一个新的GUID(它就像是注册表中应用程序的主键)

; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
#define MyAppGUID "D8C85F98-A805-4237-8D7C-C2F050C19B47"
#define MyAppId MyAppName + "_" + MyAppGUID

在[代码]部分和函数InitializeSetup()中添加此指令。

[Code]
function InitializeSetup(): Boolean;
var
  ResultCode: Integer;
  ResultStr:string;
begin
  // Check if the application is already install
  // MsgBox('MyAppId = ' + '{#MyAppId}', mbInformation, mb_Ok);
  begin
    If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#MyAppId}_is1', 'UninstallString', ResultStr) then begin
      If ResultStr<>'' then begin
        ResultStr:=RemoveQuotes(ResultStr);
          if MsgBox('This application is already install. ' #13#13 'Uninstall it ?', mbConfirmation, MB_YESNO) = idYes then
          if not Exec(ResultStr, '/silent', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
            MsgBox('Erreur !!! ' #13#13 '' + SysErrorMessage(ResultCode) + '.', mbError, MB_OK);
      end;
    end;
  end ;
  Result := True;
end;