【问题标题】:Check if previous version of any (custom) application is installed and uninstall automatically (the app setup was developed using NSIS)检查是否安装了任何(自定义)应用程序的早期版本并自动卸载(应用程序设置是使用 NSIS 开发的)
【发布时间】:2014-11-24 22:05:40
【问题描述】:

在 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

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

【问题讨论】:

  • 你应该 compare version 值来自该注册的DisplayVersion。键(请注意,可以安装 64 位播放器,因此您应该在两个视图中检查)与您要安装的内容相对应。如果该版本较低,则运行存储在UninstallString 键值中的内容(或执行uninstaller from here)。

标签: inno-setup


【解决方案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;

【讨论】:

  • 这与提出的问题无关。问题是关于 foreign 应用程序(更具体地说是 Adob​​e Shockwave Player)。
  • 还有一件事:我不想要一个消息框,如果发现应该自动卸载上一个版本
  • 还有一件事:我只想检查名为 'shockwave' 的组件(请参阅我的完整版)。如果用户没有选择“冲击波”组件,则不应进行检查。不是那么重要,但如果可能的话也添加:)
  • 您好 v20100v,您的代码不起作用。这是我新修改的包含您的代码的 inno 脚本:pastebin.com/tjywm8g5。不是语法错误,我测试了它安装旧版本的Shockwave,然后运行新版本。没有对话框,老版本没有卸载!
  • 启动 regedit.exe 并验证您的密钥 SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall{#MyAppId}_is1 在 HKLM 中包含您的定义(#define MyAppId "Adobe Shockwave Player"),您必须找到类似 SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Shockwave Player_is1 的条目。也许,您的注册表中不存在此条目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 2022-12-05
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 2013-09-16
  • 2011-10-14
相关资源
最近更新 更多