Inno Setup打包教程

2023-11-02

简述

Inno Setup 是一个免费的 Windows 安装程序制作软件。第一次发表是在 1997 年,现在已经更新到Inno Setup 5了。Inno Setup是一个十分简单实用的打包小工具,可以按照我们自己的意愿设置功能,稳定性也十分好。

官方网址:http://www.jrsoftware.org/

 


安装教程

一、下载安装

官方下载地址:http://www.jrsoftware.org/isdl.php

下载后直接安装即可

二、修改安装包的管理员权限

Inno Setup打包的程序在安装时,安装步骤最后一步若选中运行程序,会跳出一个错误提示框。不能执行文件,请求的操作需要提升。这是因为系统运行程序时需要管理员权限,而打包的文件并没有这个权限就试图直接运行。解决方法需要给Inno Setup添加管理员权限。

1. 找到Inno Setup的安装路径,如E:\Inno Setup 5,在里面找到SetupLdr.e32文件。

2.下载一个eXeScope.exe,直接把SetupLdr.e32文件拖入程序中打开,eXeScope.exe可以百度直接搜索下载,或者在这里可以下载https://download.csdn.net/download/sakuya__/11107284

选择XPMainifest下1目录,修改level的值并把相应的ASCII码修改:

修改完后,记得保存。这样修改完后,Inno Setup打包的软件安装后的图标上右下就会有一个小盾牌的图标,表示已经获得管理员权限。

 


打包教程

(1)打开Inno setup 5软件,点击文件—>新建:

(2)点击下一步

(3)第一行填程序的名称,第二行为程序的版本,第三、四行的应用程序发布者和网站可以不填,填写完后选择下一步

(4)这里基本不用更改,点击下一步

 (5)这里上面要选择程序的主执行文件,也就是你编译生成的exe文件,下面选择添加文件夹,把所有你的程序运行需要的dll和资源以及配置文件放在一个文件夹里,选择这个文件夹。然后下一步

(6)这里需要哪些功能,在前边打上对勾即可,点击下一步

(7)这里可以选择许可文件,安装前的文件(如Readme文件等),安装后显示信息等,点击下一步

(8) 此处选择安装语言

(9)在这里选择编译后安装包的输出文件夹,输出文件名等,还可以加载自定义的安装程序图标,填写完成后,点击下一步

 (10)在这里选择是否使用define编译指令,选择是也就是在生成的脚本里使用#define宏定义一些常量,方便脚本编写,不勾选就是不用,看个人。选择后点击下一步,完后完成。

(11) 点击完成后会询问你是否立即编译新的脚本,这个脚本是根据刚才我们前面填写的那些内容自动生成的。可以直接使用编译,也可以自己重新编写,下面我会贴上我自己的写的一个把每行意思注释上,当做参考

 


脚本代码

#define MyAppName "test"
#define MyAppVersion "1.0"
#define MyAppPublisher "sakuya"
#define MyAppExeName "test.exe"

[Setup]
; 注: AppId的值为单独标识该应用程序。
; 不要为其他安装程序使用相同的AppId值。
; (生成新的GUID,点击 工具|在IDE中生成GUID。)
AppId={{241FCDA1-8869-439C-9C7F-BF0061ADE5BC}
;应用程序名称
AppName={#MyAppName}
;应用程序版本号
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
;默认安装文件夹名
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
;输出的exe的地址
OutputDir=C:\Users\Lenovo\Desktop
OutputBaseFilename=test
;exe的图标的路径
SetupIconFile=C:\Users\Lenovo\Desktop\heart.ico
;使用压缩类算法lzma
Compression=lzma
;固定压缩格式
SolidCompression=yes
;不需要管理权限也能安装
PrivilegesRequired=none

[Languages]
;中文语言
Name: "chinesesimp"; MessagesFile: "compiler:Default.isl"

[Tasks]
;Tasks: desktopicon 任务:生成快捷方式
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1

[Files]
;生成的快捷方式所指的原执行文件
Source: "C:\Users\Lenovo\Desktop\test\test.exe"; DestDir: "{app}"; Flags: ignoreversion
;打包的目录
Source: "C:\Users\Lenovo\Desktop\test\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; 注意: 不要在任何共享系统文件上使用“Flags: ignoreversion”

[Icons]
;生成开始菜单可执行程序map.exe是你目录下的可执行文件 WorkingDir: {app}” WorkingDir后面加{app} app的意思是随安装目录生成
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
;生成开始菜单卸载
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}";WorkingDir:"{app}"
;Tasks: desktopicon 上面任务中的,生成快捷方式
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon

[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent

[Code]
var
ErrorCode: Integer;
IsRunning: Integer;
//判定程序已经被安装过而不需要重复安装,判断当前安装路径下已经有要安装的exe
// 安装时判断客户端是否正在运行 
function InitializeSetup(): Boolean;
begin 
  Result :=true; //安装程序继续
  if FileExists(ExpandConstant('{pf}\test\test.exe')) then
  begin
    MsgBox('程序已经安装在你的系统中了!', mbInformation, MB_OK );
    Result := false;
  end; 
  IsRunning:=FindWindowByWindowName('test'); 
  while IsRunning<>0 do 
  begin 
    if Msgbox('安装程序检测到客户端正在运行。' #13#13 '您必须先关闭它然后单击“是”继续安装,或按“否”退出!', mbConfirmation, MB_YESNO) = idNO then 
    begin 
      Result :=false; //安装程序退出 
      IsRunning :=0; 
    end else begin 
      Result :=true; //安装程序继续 
      IsRunning:=FindWindowByWindowName('test'); 
    end; 
  end; 
end; 


// 卸载时判断客户端是否正在运行 
function InitializeUninstall(): Boolean; 
begin 
  Result :=true; //安装程序继续 
  IsRunning:=FindWindowByWindowName('test'); 
  while IsRunning<>0 do 
  begin 
    if Msgbox('安装程序检测到客户端正在运行。' #13#13 '您必须先关闭它然后单击“是”继续安装,或按“否”退出!', mbConfirmation, MB_YESNO) = idNO then 
    begin 
      Result :=false; //安装程序退出 
      IsRunning :=0; 
    end else begin 
      Result :=true; //安装程序继续 
      IsRunning:=FindWindowByWindowName('test'); 
    end; 
  end; 
end; 

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); 
begin 
  case CurUninstallStep of 
  usUninstall: 
  begin // 开始卸载 
    end; 
    usPostUninstall: 
    begin // 卸载完成 
      //MsgBox('CurUninstallStepChanged:' #13#13 'Uninstall just finished.', mbInformation, MB_OK); 
      //插入代码执行卸载后的任务
      //ShellExec('open', 'http://www.baidu.com', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode); 
    end; 
  end; 
end; 

 

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

Inno Setup打包教程 的相关文章

  • QGraphicsView 和 eventFilter

    这个问题已经困扰我两天多了 所以我想我应该问一下 我在Win7上使用Qt 4 5 3 用VC2008编译 我有 MyGraphicsView 继承 QGraphicsView 和 MyFilter 继承 QObject 类 当我将 MyFi
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • 如何在 C++ 和 QML 应用程序中使用 qrc?

    我在 Windows7 上用 c qnd Qt Creator QML 编写了 Qt Quick Desktop 应用程序 现在 我必须部署它 并且我需要隐藏 qml 文件和图像 意味着 将它们放入资源等中 我读到有一个很好的方法可以使用
  • Qt mouseReleaseEvent() 未触发?

    我有一个显示图片的库 我们称之为 PictureGLWidget 其中 class PictureGLWidget public QGLWidget 所以 PictureGLWidget 扩展了 QGLWidget 在PictureGlWi
  • QTextEdit.find() 在 Python 中不起作用

    演示问题的简单代码 usr bin env python import sys from PyQt4 QtCore import QObject SIGNAL from PyQt4 QtGui import QApplication QTe
  • 如何在模型更改时停止ListView“跳跃”

    我需要做什么 我需要创建一个聊天窗口用一个ListView在 QML 中存储聊天消息 我设置listView positionViewAtEnd 以便跟踪最后的消息 我禁用positionViewAtEnd当我向上滚动时 我可以阅读过去的消
  • PyQt:如何设置组合框项目可检查?

    为了将 GUI 小部件数量保持在最低限度 我需要找到一种方法来为用户提供下拉菜单项的选择 这些菜单项可用于过滤掉 listWidget 项中显示的内容 假设 listWidget 列出了 5 个不同类别的项目 Cat A Cat B Cat
  • 如何使用 Qtimer 添加 1 秒延迟

    我目前有一个方法如下 void SomeMethod int a Delay for one sec timer gt start 1000 After one sec SomeOtherFunction a 这个方法实际上是一个附加到信号
  • 如何将图像显示为缩略图

    我有一个QTreeView显示硬盘驱动器和目录 我也有一个QListView显示图像文件如下 但我想将图像显示为缩略图 如下所示 My code mainWidget mainWidget QWidget parent QWidget pa
  • QCombobox 向下箭头图像

    如何更改Qcombobox向下箭头图像 现在我正在使用这个 QSS 代码 但这不起作用 我无法删除向下箭头边框 QComboBox border 0px QComboBox down arrow border 0px background
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 使用 QtWebEngine 将 C++ 对象暴露给 Qt 中的 Javascript

    使用 QtWebkit 可以通过以下方式将 C 对象公开给 JavascriptQWebFrame addToJavaScriptWindowObject如中所述https stackoverflow com a 20685002 5959
  • 如何使QTableView类的restoreState()和saveState()正常工作?

    首先 我想说 我的问题已经在这里讨论过 并且这里是 https stackoverflow com questions 1163030 qt qtableview and horizontalheader restorestate 但答案并
  • QSerialPort 中的 readAll() 不包括最后发送的响应

    我正在使用 Qt 来控制串行设备 如果我向串行设备发送命令 我会执行类似的操作serial gt write command r n 我制作了一个按钮 它将纯文本小部件内的文本更改为串行端口的响应 为了获得串口的响应 我使用serial g
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 在高 dpi Windows 平台上自动重新缩放应用程序?

    我正在编写一个需要在高 dpi Windows 192dpi 而不是 96dpi 上运行的 Qt 应用程序 不幸的是 Qt 框架尚不支持高 dpi 至少在 Windows 上 因此我的应用程序及其所有元素看起来只有应有尺寸的一半 有没有办法
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 如何为 Windows 构建静态 Qt 库并将其与 Qt Creator 一起使用

    我已经下载了以下 Qt 源 http download qt nokia com qt source qt everywhere opensource src 4 7 3 zip http download qt nokia com qt
  • 是否可以在 Qt Creator 中将 Qt 样式表与升级的小部件一起使用?

    我正在尝试使用 Qt 样式表对标准小部件进行一些重大的重新设计 因此 在为不同的小部件手动完成大部分工作之后 objectName选择器 我决定以某种方式对类似的小部件进行分组 例如我有多个QFrames其作用类似于内部表单中的标题 我希望
  • 将 QByteArray 从大端转换为小端

    我想我在这里有点不知所措 我尝试了这么简单的事情 我不敢相信没有任何内置的 Qt 使用 Qt 5 6 2 我尝试将 QByteArray 内的数据从大端转换为小端 总是从相同的测试 QByteArray 开始 就像这样 QByteArray

随机推荐

  • Java(关系操作符+流程控制语句)

    学习模式 看一遍视频 手抄一遍 再看一遍视频 在线题库 学习方法 把握主线 不偏离主线 熟悉 掌握常规写法 java day3 第一板块 关系操作符 表达式与操作符 1 关系操作符 6个 2 算数操作符 3 逻辑操作福 4 赋值操作符 4
  • vue create -p dcloudio/uni-preset-vue my-project创建文件报错443

    因为使用vue3 vite uniapp vant4报错 uniapp暂不支持vant4 所以所用vue2 uniapp vant2 下载uni preset vue master 放到E Auniapp uni preset vue ma
  • Android APK 由于签名异常无法安装-- INSTALL_FAILED_SHARED_USER_INCOMPATIBLE 解决

    前景 在安装第三方APK中会遇到部分已有签名的APK的情况 会有如下的报错信息 adb failed to install W demo apk Failure INSTALL FAILED SHARED USER INCOMPATIBLE
  • 关于 Faster RCNN正负样本选取的问题

    faster rcnn的解读这两篇文章写的很好 很清楚 面试时被问了这个问题 专门记录下来 一文读懂Faster RCNN 从编程实现角度学习Faster R CNN 附极简实现 回顾fast rcnn样本选取问题 在faster rcnn
  • AI与伦理道德

    首先 让我们初步了解什么是AI 人工智能 Artificial Intelligence 英文缩写为AI 它是研究 开发用于模拟 延伸和扩展人的智能的理论 方法 技术及应用系统的一门新的技术科学 人工智能是计算机科学的一个分支 它企图了解智
  • 浅析Oracle等待事件

    oracle 等待事件 一 简述 Oracle等待事件是在Oracle 7 0 12中引入的 当时等待事件大致有100多个 在Oracle 8 0中Oracle等待事件数目增加到150多个 在Oracle 8i中有大约220个等待事件 而在
  • 解决pyodbc.Error: (‘HY000‘, ‘[HY000] [Microsoft][ODBC Microsoft Access Driver]常见错误 无法打开注册表项“Temporary

    经过尝试 问题主要是数据库读写权限的问题 假如需要读写的数据库存放在系统C盘 就会因为权限的问题 pyodbc Error HY000 HY000 Microsoft ODBC Microsoft Access Driver 常见错误 无法
  • Node.js 开发常用到的库和插件工具,同事看到后也悄悄收藏了……

    Node js是一个功能强大 并且非常流行的 JavaScript 运行时环境 使开发人员能够高效率的构建高性能应用程序 下面介绍了8个常见的应用程序开发中用到的库和函数 可以用于缓存数据 操作日期 处理图像 发送电子邮件 发出 HTTP
  • MLCC电容为什么会啸叫?怎么让它闭嘴!

    原文来自公众号 工程师看海 公众号回复获取资料 电源 随着笔记本电脑 手机等设备的普及 由电容器振动所产生的 啸叫 问题越来越多的受到人们的关注 如何优化各电源架构的电容啸叫 让电容闭嘴 是一个有趣的问题 MLCC电容器发生啸叫主要是由陶瓷
  • 【AI绘画】我以Midjourney为主学习AI绘画效果咋样?

    上一篇博客链接 ChatGPT ChatGPT掀起AIGC与AI浪潮 山楂山楂丸的博客 CSDN博客 这周 我加入了新星计划 涉及的领域是我感兴趣以及对未来规划有帮助的 AI绘画 文章目录 前言 一 AI绘画是什么 二 AI绘画进阶 三 我
  • 误差和误差限

    误差和误差限 在数值计算中使用的数通常有两种类型 一种是能够准确反映客观事物数量关系的精确数 如班级有30人 有 1 2 frac 1 2 21 为男生 另一种是近似反映客观事物数量关系的近似数 如书重0 15kg 如果改变观测方法 提高测
  • Python串口通信模块PySerial使用教程(CH340 USB TTL转接芯片)

    CONTENTS 1 CH340 USB TTL介绍 2 PySerial教程 1 CH340 USB TTL介绍 TTL 一般是从单片机或者芯片中发出的电平 高电平为 5V 51单片机 或者 3 3V STM32 USB 转 TTL 模块
  • BP批量导入程序

    REPORT zfic cust batch upload 数据定义 TABLES sscrfields CONSTANTS cn flag TYPE char1 VALUE X DATA smp dyntxt TYPE smp dyntx
  • yolov3训练自己的数据集(MMDetection)

    用FasterRcnn训练了自己标注的数据集Voc格式 现在想用yolo来训练一下 修改了yolo文件内容 打算直接用yolo训练voc格式的数据 出现了一点问题 因为比较着急 就没有再详细研究 MMDetection中大多训练模型为coc
  • web视频播放

    一 3大视频直播协议 一 RTMP 全称 Real Time Messageing Protocol 实时消息传送协议 出身 由Adobe公司基于 Flash Player 播放器对应的音视频flv封装格式提出的一种传输协议 优点 1 延迟
  • ESP32开发:从入门到精通的全面指南

    ESP32开发 从入门到精通的全面指南 ESP32 是一款功能强大的微控制器 它可以帮助开发者构建各种物联网 IoT 应用 ESP32 拥有 WiFi 和蓝牙无线连接功能 并且可以轻松地与各种传感器和设备进行通信 本文将介绍 ESP32 的
  • 【框架1-springboot整合Knife4j框架-API文档框架】

    一 简介 图示 编辑 二 框架使用 1 引入依赖 2 配置config 3 配置application yml 启动knife4j 4 设置端口 5 进入doc html 三 框架配置 1 菜单项设置 2 菜单子项设置 3 请求参数设置 四
  • AcWing600.仰视奶牛(单调栈)

    输入样例 6 3 2 6 1 1 2 输出样例 3 3 0 6 6 0 include
  • 微信小程序接入微信支付流程

    一 基本介绍 1 支付场景 点击支付按钮唤起微信支付弹窗 输入正确密码后完成支付 2 基本流程 点击支付按钮首先生成一个订单 然后在后端调用微信api接口进行统一下单 将接口返回的数据回传到前端拉起支付操作 然后异步通知支付结果 二 配置信
  • Inno Setup打包教程

    简述 Inno Setup 是一个免费的 Windows 安装程序制作软件 第一次发表是在 1997 年 现在已经更新到Inno Setup 5了 Inno Setup是一个十分简单实用的打包小工具 可以按照我们自己的意愿设置功能 稳定性也