使用存储在注册表中的版本号在 Inno Setup 中检测并卸载旧版本的应用程序

2023-11-30

我有一个安装程序在 Windows 注册表中写入此行

[Registry]
Root: "HKCU"; Subkey: "SOFTWARE\W117GAMER"; ValueType: string; ValueName: "DSVersionL4D2"; ValueData: "{#MyAppVersion}"

考虑到{#MyAppVersion}在安装程序时定义并写入

#define MyAppVersion "2.7"

我不断更新安装程序,这就是为什么有些人有旧的安装,当他们更新时,冲突的旧文件被合并,以免卸载以前的版本,有一些方法可以在开始安装之前读取此注册表。

  • 第一种情况:如果用户有旧版本,请将其卸载并 安装新版本
  • 第二种情况:如果用户有相同的版本,告诉他们他们
    已安装最新版本并取消安装
  • 第三种情况:如果用户已经安装了某个版本并且打算
    安装旧版本,告诉他们他们已经拥有最新版本 程序版本

我读过以前的帖子,但它们只适用于程序的“GUID”或“appID”,尝试修改一些代码行,但我什么也得不到,如果有人可以帮助我,我提前谢谢你,对不起我的英语我使用翻译 我来自拉丁美洲

如何检测旧安装并提供删除?

Inno Setup:如何自动卸载以前安装的版本?


随着使用RegQueryStringValue功能 and CompareVersion函数来自比较 Inno Setup 中的版本字符串(你的问题),你可以这样做:

#define MyAppVersion "2.6"

[Code]

function InitializeSetup(): Boolean;
var
  InstalledVersion: string;
  VersionDiff: Integer;
begin
  Result := True;
  if not RegQueryStringValue(
           HKCU, 'Software\My Program', 'DSVersionL4D2', InstalledVersion) then
  begin
    Log('No installed version detected');
  end
    else
  begin
    Log(Format('Found installed version %s', [InstalledVersion]));
    VersionDiff := CompareVersion(InstalledVersion, '{#MyAppVersion}');
    if VersionDiff < 0 then
    begin
      MsgBox(
        Format('You have an old version %s installed, will uninstall it.', [
          InstalledVersion]),
        mbInformation, MB_OK);
      { Uninstall old version here }
    end
      else
    if VersionDiff = 0 then
    begin
      MsgBox(
        'You have this version installed already, cancelling installation.',
        mbInformation, MB_OK);
      Result := False;
    end
      else
    begin
      MsgBox(
        Format(
          'You have newer version %s installed already, ' +
            'cancelling installation.', [InstalledVersion]),
        mbInformation, MB_OK);
      Result := False;
    end;
  end;
end;

只需插入问题中链接的一些答案中的卸载代码即可。


但请注意,您不需要编写自己的版本注册表值。有DisplayVersion, VersionMajor and VersionMinor在标准卸载注册表项中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用存储在注册表中的版本号在 Inno Setup 中检测并卸载旧版本的应用程序 的相关文章

随机推荐

  • 如果数组包含 2 或 3,则返回 True

    我遇到了这个 CodingBat 问题 给定一个长度为 2 的 int 数组 如果它包含 2 或 3 则返回 True 我尝试了两种不同的方法来解决这个问题 谁能解释我做错了什么 This one says index is out of
  • ValueError:地下矩形外表面积

    我正在制作一款相机跟随玩家的平台游戏 我试图通过在整个地图上拥有一个大的表面并且只传输放大的部分来实现这一点 但是我只能获得 30 fps 最小化 和 8 fps 全屏 所以我尝试优化它是在位块传输之前裁剪它 但我得到ValueError
  • 是否有用于电话状态的 NSNotification

    当设备打开 关闭手机时 我们是否可以观察到 NSNotification The NotificationCenter不会发出任何有关此的通知 但请看一下CTCallCenteriOS 4 中引入的类 它有一个callEventHandle
  • R 按键分组获取多列的最大值

    我想做这样的事情 如何使R中的A列唯一并保留B列中具有最大值的行 除了我的data table有一个键列和多个值列 所以说我有以下内容 a b c 1 1 1 1 2 1 2 1 3 1 2 2 4 2 1 1 5 2 2 5 6 2 3
  • Perl - 在关联数组单词和单词上下文中查找并保存

    我有一个像这样的数组 这只是一个小概述 但它有 2000 行及更多这样的行 list affaire chose question cause chose mati re 我想要这样的输出 te affaire gt chose quest
  • 当对象大于视口时,CSS 居中

    我试图让 jquery 轮播位于屏幕中央 即使剪切区域比视口更宽 这基本上总是给元素一个负的左边距 我该如何指定呢 剪切区域的宽度是固定的 但视口区域当然是可变的 这是我能找到的最佳解决方案 在固定宽度内容周围使用环绕元素 然后在内容本身上
  • Android:BroadcastReceiver 重新启动被杀死/崩溃的应用程序

    我有一个应用程序 我希望能够在发生错误或崩溃 应用程序关闭时重新启动它 我熟悉如何注册BroadcastReceivers 使用闹钟等 我是否可以拦截应用程序关闭时发出的任何信号 或者当任何应用程序关闭时操作系统会发送出去 我是否可以拦截应
  • 如果需要,允许使用 Cleartext 流量 Android Studio

    我有 2 部手机 api 28 17 所以当请求 HTTP 时 它与 api 17 一起使用 但不是在 api 28 中 朋友说 我必须使用 android usesCleartextTraffic true 在清单中 但是当构建它在手机中
  • 将 template.js.erb 重写为 template.js.slim

    下面的 js erb 模板重写为 slim 后会是什么样子 new reservation hide after Slim 提供了一种多行方法 var html j render new reservation new reservatio
  • 从输入文件路径logstash中提取字段?

    我想从各个目录读取日志文件 例如 Server1 Server2 Server1子目录为cron auth 这些子目录中是log file分别 所以我正在考虑读取这样的文件 input file path to folders server
  • 有没有办法使用 javascript 从 tiff 图像中提取地理标签?

    我正在开展一个项目 需要使用正射马赛克地图 该地图采用 tiff 格式 我想从该地图中提取地理信息 以便我可以将其正确覆盖在谷歌地图上 我在这个项目中使用平均堆栈 所以我的最后一个问题是 有没有办法使用 javascript 从 tiff
  • 向 Hadoop MapReduce 中的单个映射提供多个非文本文件

    我目前正在编写分布式应用程序 它在 Hadoop MapReduce 的帮助下解析 Pdf 文件 MapReduce 作业的输入是数千个 Pdf 文件 大部分范围从 100KB 到 2MB 输出是一组解析的文本文件 出于测试目的 最初我使用
  • 如何在wordnet层次结构中使用python nltk查找两个同义词集之间的距离?

    假设我有两个同义词集 synset car n 01 和 synset bank n 01 如果我想在 wordnet 层次结构中找到这两个同义词集之间的距离 那么我该如何使用 nltk 来做到这一点 我在互联网上搜索 但我得到了类似 li
  • SwiftUI 返回到 sceneWillEnterForeground SceneDelegate.swift 中的 RootView

    如果应用程序将进入前台 我们尝试将当前视图重置为根 我们如何在 SwiftUI 中做到这一点 func sceneWillEnterForeground scene UIScene let context UIApplication sha
  • pandas dataframe sum 与 groupby

    我有一个 pandas 数据框 其结构如下所示 x 1 7 x 2 2 y 3 1 y 4 3 我必须对第一列进行分组 带有值x and ys 并找到每个的第二列和第三列的总和x and y像这样 x 3 9 y 7 4 我怎样才能使用熊猫
  • 使用java和Android提取bbcode引用但不提取引用标签内的内容

    我将提取带有引号的 bbcode 但当实际输出出现时却无济于事 我想实现 bbcode 解析模块来提取引号作为所需的输出 引用的数量应该是递归方法或其他方法 INput Testing quote http www yourube com
  • ajax 响应后值未更新

    我通过 ajax 将一些表单数据发送到同一页面中的 php 脚本 PHP 必须处理数据并在同一页面中显示结果 我在 ajax 中使用以下语法 ajax type POST url data form serialize success fu
  • Android 通用Asynctask

    我目前有多个活动需要执行 http post 的 asynctask 我希望将 asynctask 作为另一个类文件 以便不同的活动可以调用 asynctask 来执行 http post 请求和 onPostExecute 调用方法 ht
  • iphone:.dSYM 文件位于崩溃报告中的位置

    根据这个页面here如果您有正确的应用程序二进制文件和 dSYM 文件 那么很容易对它们进行符号化 但是 dSYM 和应用程序二进制文件位于哪里 右键单击您的archive gt Show in Finder gt 右键单击文件并单击Sho
  • 使用存储在注册表中的版本号在 Inno Setup 中检测并卸载旧版本的应用程序

    我有一个安装程序在 Windows 注册表中写入此行 Registry Root HKCU Subkey SOFTWARE W117GAMER ValueType string ValueName DSVersionL4D2 ValueDa