INNO setup 制作安装包

2023-11-10

1、获取SQLserver安装路径
var
dbpath:string;
rtn:boolean;
rtn := RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWAREMicrosoftMSSQLServerSetup','SQLPath', dbpath);
if (!rtn) then dbpath := ExpandConstant('{app}');

2、获取本机的IP地址
ip:string;
rtn:boolean;

rtn :=RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SYSTEMCurrentControlSetServices{083565F8-18F0-4F92-8797-9AD701FCF1BF}ParametersTcpIp','IpAddress', ip);

if (not rtn) or (ip='0.0.0.0') or (ip='') then ip := '127.0.0.1';

 

3.修改安装包左侧位图,其大小一般为164x314px,在INNO脚本的[Setup]段添加如下代码:
 

WizardImageFile=ResWizardImage.bmp


  注:红色的标记为位图路径,可以用相对路径或绝对路径

4.修改安装包右上角位图,其大小一般为55x55px,在INNO脚本的[Setup]段添加如下代码:
WizardSmallImageFile=ResWizardSmallImage.bmp

5.修改安装包左下角的BeveledLabel内容,常见有两种方式
  (1)临时性修改  在INNO脚本的[Messages]段添加如下代码:
 

BeveledLabel=软件汉化:高芳銮(Raindy)

  
  (2)永久性修改  用记事本打开INNO目录中的“Default.isl” 修改“BeveledLabel = ”后的内容:
 

BeveledLabel=   软件汉化:高芳銮(Raindy)



6.修改安装包欢迎标签内容,即WelcomeLabel2
  用记事本打开INNO目录中的“Default.isl” 修改“WelcomeLabel2 = ”后的内容:
 

WelcomeLabel2=正在准备安装 [name/ver]...%n%n推荐您在继续安装前关闭所有其它应用程序。%n%n软件汉化:高芳銮(Raindy)%n%n电子邮件:Raindyok@qq.com%n%n


  注:%n在INNO脚本中为换行符

7.安装结束后动行主程序或打开文件等,只需在INNO脚本的[Run]段修改代码:
 

 
Filename: {app}PDFUnlocker.exe; Description: 启动 PDF Unlocker; Flags: nowait postinstall shellexec;
Filename: {app}汉化说明.txt; Description: 查看说明; Flags: nowait postinstall shellexec

8、自定义BeveledLabel文字
[Messages]
BeveledLabel=中天VIP工作室
9、自定义安装程序界面左上角“安装”文字
[message]
SetupAppTitle=需要的字
SetupWindowTitle=需要的字
10、自定义安装程序版本号
VersionInfoVersion=1.1
VersionInfoTextVersion=1.1

 

参考代码

1、系统进程监测

[Code]
var
is_value: integer;
function InitializeSetup(): Boolean;
begin
Result :=true;
is_value:=FindWindowByClassName(‘TfrmCmdCenter’);
while is_value<>0 do
begin
if Msgbox(‘安装程序检测到您的迅雷软件当前正在运行。’ #13#13 ‘您必须先关闭它然后单击“是”继续安装,或按“否”退出!’, mbConfirmation, MB_YESNO) = idNO then
begin
Result :=false; //安装程序退出
is_value :=0;
end else begin
Result :=true; //安装程序继续
is_value:=FindWindowByClassName(‘TfrmCmdCenter’);
end;
end;
end;

function InitializeUninstall(): Boolean;
begin
is_value:=FindWindowByClassName(‘TfrmCmdCenter’);
if is_value<>0 then begin
MsgBox(‘卸载程序检测到您的迅雷软件当前正在运行。’ #13#13 ‘为了更安全完整的卸载,您必须关闭它在进行卸载操作!’, mbError, MB_OK);
Result :=false;
end else Result :=true;
end;

2.自定义安装程序右上角图片大小
[code]
procedure InitializeWizard();
begin
WizardForm.WizardSmallBitmapImage.width:=150; //设置页眉图片的大小
WizardForm.WizardSmallBitmapImage.left:=WizardForm.width-150; //设置左边页眉留出的空隙
WizardForm.PAGENAMELABEL.width:=0; //设置标题文字显示的大小
WizardForm.PAGEDESCRIPTIONLABEL.width:=0; //设置标题文字显示的大小
end;

3.跳关安装程序的欢迎界面
INNO 的设计中本身可以跳过所有向导页面(用 ShouldSkipPage 函数),但是唯独不能跳过欢迎页面,据说作者是有意为了防止该功能被滥用,即产生完全没有界面的在后台运行的安装程序。
要跳过欢迎页面,只能调用系统的功能。

参考一
复制内容到剪贴板代码:
[Code]
const
WM_LBUTTONDOWN = 513;
WM_LBUTTONUP = 514;

procedure InitializeWizard();
begin
PostMessage(WizardForm.NextButton.Handle,WM_LBUTTONDOWN,0,0);
PostMessage(WizardForm.NextButton.Handle,WM_LBUTTONUP,0,0);
// 其它代码
end;
参考二
复制内容到剪贴板代码:
[Code]
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpWelcome then
WizardForm.NextButton.OnClick(WizardForm);
end;
两者都能跳过欢迎页面

4.跳过准备安装界面
使用inno打包,我们会注意到,在选择好安装向导所指定的所有项目后,安装向导会进入一个准备安装的界面提示你所有的安装信息。此时,我们只能点击安装按钮,安装才可以继续。有时候,为了某种需要,我们可能不想让程序显示这个准备安装的界面,那么如何去掉这个界面呢?请看以下的代码:
[code]
function ShouldSkipPage(PageID: Integer): Boolean;
begin
if PageID=wpReady then
result := true;
end;

5.判断注册表检查程序时候存在
有时候,我们制作软件的汉化或者补丁程序,需要判断软件是否已安装,如果软件已安装就安装此补丁,如果软件未安装就终止安装程序并且提示用户安装原版软件后再运行此补丁,那么如何实现此功能呢,这里就给大家提供一个我的判断实力。通过检查注册表相关键值来判断指定程序是否已安装,以下是我制作的一个程序的增强补丁,需要在源程序安装的基础上进行安装,具体脚本判断如下:
[CODE]
var
MyKeyExist: boolean;

function InitializeSetup(): boolean;
begin
MyKeyExist:= true;
if Not RegValueExists(HKEY_LOCAL_MACHINE, 'SOFTWAREAdobeAudition3.0', 'ApplicationPath') then
begin
MyKeyExist:= false;
MsgBox('安装程序检测到您的系统内没有安装Adobe Audition3.0,请先安装软件在运行此补丁。', mbInformation, MB_OK);
end;
Result:= MyKeyExist;
end;

6.如何让协议许可页面默认选中我同意按钮
为了让初学者更方便的安装软件,有时候我们会发现一些使用inno setup打包的程序在许可页面默认已经选中了我同意按钮,只需要点击下一步即可继续安装,那么这个效果是如何实现的呢?下面是代码:
[code]
procedure InitializeWizard();
begin
WizardForm.LICENSEACCEPTEDRADIO.Checked := true;
end;

7.安装前检测是否已经安装
function InitializeSetup(): boolean;
begin
Result := true;
if FileExists(ExpandConstant('{pf}我的程序我的程序.exe')) then
begin
MsgBox('程序已经安装在你的系统中了,请先卸载!', mbInformation, MB_OK );
Result := false;
end;
end;
其中{pf}我的程序我的程序.exe替换为你自己的路径即可
加入此代码的含义,就是检测目录下是否包括代码中指定的文件名的文件,如果有则当您运行程序后直接弹出提示告诉您软件已经存在,请先卸载。因此,这个代码有个局限性,就是只能检测固定的目录的文件,如果用户的文件并未安装到脚本所指定的检测目录,那么就将无法检测到。所以,判断也就失效了。


8、安装完成后显示新特性
[Run]
Filename: "{app}WhatsNew.Txt"; Description: "安装完成后显示新特性"; Flags: postinstall shellexec skipifsilent

 

9、静默安装vcredist_x86.exe
[Run]
Filename: {app}vcredist_x86.exe; Parameters: /q; WorkingDir: {tmp}; Flags: skipifdoesntexist; StatusMsg: "Installing Microsoft Visual C++ Runtime ..."; Check: NeedInstallVC9SP1

[Code]
var
 vc9SP1Missing: Boolean;

function NeedInstallVC9SP1(): Boolean;
begin
 Result := vc9SP1Missing;
end;

function InitializeSetup(): Boolean;
var
 version: Cardinal;
begin
 if RegQueryDWordValue(HKLM, 'SOFTWAREMicrosoftWindowsCurrentVersionUninstall{9A25302D-30C0-39D9-BD6F-21E6EC160475}', 'Version', version) = false
 then
   begin
     vc9SP1Missing := true;
   end;
 result := true;
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

INNO setup 制作安装包 的相关文章

  • SAP ERP系统是什么?SAP好用吗?

    A公司是一家传统制造企业 公司曾先后使用过数个管理软件系统 但各部门使用的软件都是单独功能 导致企业日常管理中数据流与信息流相对独立 形成了 信息孤岛 随着公司近年业务规模的快速发展以及客户数量的迅速增加 企业原有的信息系统在销售预测及生产
  • 光波导结构

    摘要 增强现实和混合现实 AR MR 领域的新应用引起了人们对带有光栅区域的光波导系统的越来越多的关注 这些光波导系统用于输入和输出耦合以及扩瞳目的 VirtualLab Fusion为这类系统的仿真和设计提供了几个强大的工具 其中一个是具
  • 如何在运行时替换 Moose 对象的方法?

    是否可以在运行时替换 Moose 对象的方法 通过查看源代码Class MOP Method http search cpan org perldoc Class MOP Method which Moose Meta Method htt
  • PHP Yii:运行时数据库连接

    我想在运行时使用 Yii 连接到第二个数据库 数据库名称将来自用户登录后的数据库表 我在教程中看到我应该这样做 db2 Yii createComponent array class gt EMongoClient server gt mo
  • PyCharm:如何推断运行时创建的对象的类型

    我正在尝试使用一个创建对象的库 并在运行时将它们添加到全局命名空间 PyCharm 无法找到对对象的引用 因为它们最初不在命名空间中 如何让 PyC harm 内省不抱怨 找不到参考 我不想用noinspection tags 示例代码 为
  • 从java程序运行jar文件

    我正在尝试从另一个 Java 程序执行 jar 文件 我正在使用以下代码 try Runtime runtime Runtime getRuntime runtime exec path upto jar catch Exception e
  • 查找关联程序以使用 Java 打开文件

    我希望使用计算机上安装的关联程序 在本例中使用 MS Word 或 Open Office Writer 从 Java 应用程序打开文件 比如说 word 文档 问题是我想等到这个子进程完成 这可以使用 Process 类中的 waitFo
  • 在没有 C 运行时的情况下使用 64 位整数 - 链接错误 __alldiv

    我正在尝试在不使用 C 运行时 msvcrt 或 libcmt 的情况下构建 Windows 控制台应用程序 也就是说 仅链接 kernel32 lib 并使用 WIN32 API 中的控制台函数而不是 printf 等 我的问题是 在链接
  • 节省内存和编译时间

    有什么方法可以使用模块在 perl 中节省内存和编译时间吗 例如 不加载所有不必要的 未使用的子程序 或者 如果我将我的潜艇分成许多不同的 这是一个好方法pm文件 然后我只加载必要的模块 例如 usr bin perl w sub mysu
  • 如何以编程方式设置或清除 32BIT 标志?

    编译时 我总是将其设置为 Any CPU 然而 有些客户没有所需二进制文件的 64 位版本 即使在 x64 系统上运行也是如此 在这些情况下 我要求他们使用 corflags exe 32BIT 选项修改我的二进制文件 http msdn
  • 什么时候插入排序比合并排序快?

    对于家庭作业问题 我被告知插入排序以 8n 2 运行 合并排序以 64 n lg n 运行 作为我得到的解决方案的一部分 它说只要 n 它来自这个 代数 推理路线 steps in insertion sort lt steps in me
  • Android 运行时布局教程

    有谁知道如何在 android 运行时执行活动布局或有一个很好的参考 这是我的活动的代码 我确信我只是忽略了在这里做一些事情 package com isi sa import android app Activity import and
  • 有什么办法可以提取底层Xaml吗?

    无论如何 是否可以从控件中提取底层 xaml IE 我有一个名为 fooBox 的文本框 我可以在运行时从文本框获取代表文本框的 xaml 吗 这向您展示了完整的生命周期 从控件到 XAML 再到控件 如你看到的 string s Xaml
  • MySQL Workbench 连接到 AWS 上的 RDS 数据库实例时执行的任何操作都会出现极大延迟

    首先 我完全意识到 Stack Overflow 本身可能不是一个理想的子论坛来问这个问题 但我问了我的教授 他告诉我去问 Bing AI 而 Bing AI 告诉我在这里问这个问题 所以如果还有其他一些特定的子论坛会更好 请在评论或答案中
  • 如何在运行时更改android中睡眠/定时器线程的延迟?

    我试图做的是每次计数器变为 5 的倍数时减少计时器延迟 但是 一旦代码进入 if 块 它就停止递增计时器 我不明白发生了什么事 这是代码 thread new Thread public void run try if count 5 0
  • Scala:在运行时替换方法

    假设我有课 class Original def originalMethod 1 现在 假设我有一个例子 val instance new Original 现在是否可以做点什么instance在运行时替换originalMethod用不
  • 如何获取变量的内存大小?

    有谁知道如何获取变量的内存大小 int string struct等 并打印它 是否可以 var i int 1 I want to get something like this fmt Println Size of i is i Al
  • 运行时 SQL 查询生成器

    我的问题类似于 Java中有什么好的动态SQL生成器库吗 https stackoverflow com questions 5620985 is there any good dynamic sql builder library in
  • 无法在 Mac OS X 上启动应用程序 我收到错误 LSOpenURLsWithRole() 应用程序失败,错误为 -10810

    问题 我正在尝试启动一个应用程序 遗传网络分析仪 http www genostar com category products gna 但它默默地失败了 使用时open gna app产生以下错误消息 LSOpenURLsWithRole
  • 带 If 的嵌套 For 循环的时间复杂度

    void f int n for int i 1 i lt n i if i int sqrt n 0 for int k 0 k lt pow i 3 k do something 我的思考过程 执行if语句的次数 sum i 1 to

随机推荐

  • jenkins搭建自动化部署(Windows)

    官网 https jenkins io 选择相应版本下载 安装后找到安装目录下jenkins war 可以放在tomcat下运行 也可直接运行命令 java jar jenkins war 启动 关闭命令 net start jenkins
  • mysql 5.6压缩安装_mysql5.6zip格式安装过程

    第一步 到官网下载mysql 5 6 44 winx64的压缩包文件格式 第二步 在我的电脑 gt 属性 gt 高级 gt 环境变量 path变量中添加mysql bin文件夹的路径 第三步 配置完环境变量之后先别忙着启动mysql 我们还
  • 08-分布式

    1 分布式中 接口的幂等性的设计 在高并发场景的架构里 幂等性是必须得保证的 比如说提交作业 查询和删除不在 幂等讨论范围 1 建唯一索引id 每次操作 都根据操作和内容生成唯一的id 在执行之前先判断id是否存在 如果不存在 则 执行后续
  • rem的使用方式

    rem是什么 rem是指相对于根元素的字体大小的单位 在日常开发过程中我们通常把根元素 html body 的字体设置为10px 方便于我们计算 此时子元素的1rem就相当于10px rem与em的区别 各自的优缺点 em子元素字体大小的e
  • CVPR 2019 论文大盘点—人体姿态篇

    CV君盘点了CVPR 2019 中有关人体姿态的论文 其中研究 3D人体姿态估计的论文最多 有 11 篇 研究 2D 姿态估计的 7 篇 姿态迁移 2 篇 人体图像生成 1 篇 人体捕捉 2 篇 另外还有2篇创建了新的基准数据集 姿态估计是
  • python云图

    安装相关插件 python3 m pip install jieba wordcloud matplotlib import matplotlib pyplot as plt import jieba from wordcloud impo
  • 【Spring Boot】【前后端分离】后端接口返回结果统一封装

    文章目录 创建 SpringBoot 项目 封装返回结果 实现返回对象的自动封装 处理异常 测试 最近在尝试使用前后端分离的模式写一个简单的个人博客 遇到接口数据返回结构的问题 在网上查了一圈 发现了一个很好用的方法 在复现的过程中也遇到了
  • 算法设计与分析课后总结

    算法设计与分析课后总结 算法设计与分析 第1章 算法设计基础 课后习题 第二章算法分析基础 课后习题 1 考虑下面算法 回答下列问题 算法完成什么功能 算法的基本语句时什么 基本语句执行了多少次 2 分析以下程序段中基本语句的执行次数 要求
  • 100天精通Python(可视化篇)——第92天:Pyecharts绘制炫酷柱状图、条形图实战大全

    文章目录 专栏导读 1 基础柱状图 2 旋转x轴标签 3 旋转坐标轴 4 添加坐标轴名称 5 添加标记点 6 添加标注线 7 添加数据 8 添加自定义背景图 9 堆叠柱状图 10 柱状图与折线图组合 11 三维柱状图 12 水平滑动 鼠标滚
  • 包、模块、函数的关系结构

    三者关系 python中程序的结构是由包 模块 函数 类大致构成 其关系如下 package module function 模块定义与调用 1 python中一个 py文件都可以是一个module module可以有函数 类 代码组成 如
  • 使用python解决中英混合参考文献中et al 和等的问题

    这个代码使用zipfile将docx进行解压 然后操作document xml文件 找到中文中的et al之后替换为 等 然后再压缩为docx import zipfile import re import os import shutil
  • curl服务器文件,curl 向远程服务器传输file文件

    public function upload 获取上传文件信息 文件名称以自己实际上传文件名称为准 fileinfo FILE filename 请求参数 依据商户自己的参数为准 requestParam version requestPa
  • 声网(agora)音视频通话sdk—微信小程序demo

    首先需要注册一个声网账号 注册成功后创建项目 appid是指声网项目的appid 后续会在小程序的配置文件中用到 微信小程序接入视频通话 需要声网给开通小程序的权限 给声网邮箱发送邮件 注明开通微信小程序接入权限 并给发送appid app
  • Python代码扫描:企业级代码代码安全漏洞扫描Bandit

    目录 什么是Bandit 特点 安装 配置 配置Bandit Pycharm配置外置工具 使用实践 命令行参数 检查单个文件 检查整个目录 PyCharm中对单个文件或者项目目录的扫描 一个使用案例 应用场景 总结 参考资料 注意 后续技术
  • js DOM

    DOM Document Object Model HTML 和 XML 文档的编程接口 通过 DOM JavaScript 能够访问和改变 HTML 文档的所有元素 1 查找 通过 id 查找 HTML 元素 div div 2 通过标签
  • Paper and Codes Leaderboard

    目录 介绍 模型入选标准 1 目标检测 Paper and Codes for COCO by 2023 3 31 COCO FPS Models by 2023 02 18 Look at Batch Size 2 图像分类 ImageN
  • 【Backbone: MLP-Mixer】MLP-Mixer: An all-MLP Architecture for Vision

    Abstract CNN和attention based结构很棒 但不是必须的 本文提出MLP Mixer 一种基于多层感知机 MLPs 的框架 包含两种layers 1 channel mixing MLPs 应用在image patch
  • C++(30)——lambda表达式原理及应用

    lambda lambda这个词起源于数学上的 在C 中利用lambda表达式 可以方便的定义和创建匿名函数 lambda可以看做函数对象的升级版 改进了函数对象以下的缺点 使用在泛型算法中的参数传递的过程中 比较性质 自定义操作 优先级队
  • J2EE之自定义MVC框架知识(中篇)

    J2EE之自定义MVC框架知识 中篇 文章目录 J2EE之自定义MVC框架知识 中篇 前言 1 优化中央控制器中的action容器 使其加载变成可配置的 1 1 编写 xml文件 config xml 1 2 导入XML建模相关的类 Act
  • INNO setup 制作安装包

    1 获取SQLserver安装路径vardbpath string rtn boolean rtn RegQueryStringValue HKEY LOCAL MACHINE SOFTWAREMicrosoftMSSQLServerSet