20 Inno Setup制作安装包的几个问题
系统开发好之后,通常需要制作成安装包,才能卖给用户。利用Inno Setup的向导可以制作简单的安装包,但是如果要做个好的安装包的话可能会遇到一些麻烦,今日终于抽空解决了,Inno Setup打包的一些问题。具体如下:
1. 卸载时,如何判断应用程序是否运行
InnoSetup 提供变量AppMutex,用来保存应用程序的Mutex名称。现在很多应用程序都是唯一实例运行。这样避免配置文件被错误修改以及其他很多衍生问题。通常都会用WindowsAPI CreateMuex来创建一个Mutex;安装包卸载时会判断AppMutex是否已经被占用。如果被占用则等待并提示用户关闭应用程序。如果应用程序正在运行,通常该exe文件和被使用的dll是不会被删除的,卸载不完全。
在Inno Setup Compile 配置中,将MyProgramsMutexName 定义为 “ityujian-A75DEC53-783F-4425-8431-24D83BD4CE5F” 该字符串需要在被打包的EXE文件中使用。
#define MyProgramsMutexName “ityujian-A75DEC53-783F-4425-8431-24D83BD4CE5F”
[Setup]
AppMutex={#MyProgramsMutexName}
2. 如何提示用户是否删除配置文件
Inno Setup提供Script Language支持,可以在[Code] 章节里使用Pascal Script编写函数 并且Inno Setup提供事件响应。在卸载时,该函数会被调用
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usUninstall then begin
if MsgBox(‘Do you want to delete all config files and log files?’, mbConfirmation, MB_YESNO) = IDYES
then DelFiles();
end;
end;
这是Inno Setup提供的卸载事件函数, if CurUninstallStep = usUninstall 判断是否正在卸载,
如果正在卸载则需判断是否删除配置文件,我开发的应用程序使用ini文件存储配置。MsgBox(‘Do you want to delete all config files and log files?’, mbConfirmation, MB_YESNO) 用于弹出消息框,提示用户选择是否删除文件。
函数DelFiles() 为自定义函数,用来删除文件和目录。
ExpandConstant用于获取变量值,FileExists用于判断文件是否存在;DeleteFile用来删除文件;
DirExists 用于检查目录是否存在;DelTree用于删除目录和里面的文件
procedure DelFiles();
begin
if FileExists(ExpandConstant(‘{app}’) + ‘config.ini’) then DeleteFile(ExpandConstant(‘{app}’) + ‘config.ini’);
if FileExists(ExpandConstant(‘{app}’) + ‘log.txt’) then DeleteFile(ExpandConstant(‘{app}’) + ‘log.txt’);
if DirExists(ExpandConstant(‘{app}’) + ‘Users’) then DelTree(ExpandConstant(‘{app}’) + ‘Users’, true, true, true);
end;
Inno Setup 编译配置文件如下,供参考:
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName “ityujian”
;应用程序名
#define MyAppVersion “1.0”
;版本号
#define MyAppPublisher “Jianyu Studio”
;发布者名称
#define MyAppURL “http://www.cnblogs.com/ityujian/”
;公司的网站
#define MyAppExeName “ityujian.exe”
;exe文件名
#define MyProgramsMutexName “ityujian-A75DEC53-783F-4425-8431-24D83BD4CE5F”
;应用程序中使用的Mutex,卸载时用来判断应用程序是否正在执行
[Setup]
; 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.)
AppId={{ECCF74CD-48BA-4000-988B-18E965893BD6}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputBaseFilename=setup
SetupIconFile=.ityujian.ico
;SetupIconFile 是打包之后exe的图标文件
Compression=lzma
SolidCompression=yes
AppMutex={#MyProgramsMutexName}
;AppMutex是需要打包的应用程序使用的Mutex,卸载之前会先判断该AppMutex是否已经被占用,如果被占用则提示应用程序正在运行,请关闭
[Languages]
Name: “english”; MessagesFile: “compiler:Default.isl”
[Tasks]
Name: “desktopicon”; Description: “{cm:CreateDesktopIcon}”; GroupDescription: “{cm:AdditionalIcons}”; Flags: unchecked
Name: “quicklaunchicon”; Description: “{cm:CreateQuickLaunchIcon}”; GroupDescription: “{cm:AdditionalIcons}”; Flags: unchecked; OnlyBelowVersion: 0,6.1
[Files]
Source: “GdiPlus.dll”; DestDir: “{app}”; Flags: ignoreversion
Source: “ityujian.exe”; DestDir: “{app}”; Flags: ignoreversion
;Source 描述需要打包的EXE文件位置,DestDir描述安装时该EXE文件的相对位置
Source: “ityujian.pdb”; DestDir: “{app}”; Flags: ignoreversion
Source: “Users*”; DestDir: “{app}Users”; Flags: ignoreversion recursesubdirs createallsubdirs uninsneveruninstall
;上句用于将Users目录打进安装包;uninsneveruninstall说明卸载时,不删除该文件夹
Source: “Doc*”; DestDir: “{app}Doc”; Flags: ignoreversion recursesubdirs createallsubdirs
;用户将Doc目录下的用户手册打进安装包
; NOTE: Don’t use “Flags: ignoreversion” on any shared system files
[Icons]
Name: “{group}{#MyAppName}”; Filename: “{app}{#MyAppExeName}”
Name: “{group}{cm:ProgramOnTheWeb,{#MyAppName}}”; Filename: “{#MyAppURL}”
Name: “{group}{cm:UninstallProgram,{#MyAppName}}”; Filename: “{uninstallexe}”
Name: “{commondesktop}{#MyAppName}”; Filename: “{app}{#MyAppExeName}”; Tasks: desktopicon
Name: “{userappdata}MicrosoftInternet ExplorerQuick Launch{#MyAppName}”; Filename: “{app}{#MyAppExeName}”; Tasks: quicklaunchicon
[UninstallDelete]
Type: dirifempty; Name: “{app}”
;Type有多种;Type: dirifempty表示如果安装本应用程序的目录不为空,则不删除安装目录
[Code]
procedure DelFiles();
begin
if FileExists(ExpandConstant(‘{app}’) + ‘config.ini’) then DeleteFile(ExpandConstant(‘{app}’) + ‘config.ini’);
if FileExists(ExpandConstant(‘{app}’) + ‘log.txt’) then DeleteFile(ExpandConstant(‘{app}’) + ‘log.txt’);
if DirExists(ExpandConstant(‘{app}’) + ‘Users’) then DelTree(ExpandConstant(‘{app}’) + ‘Users’, true, true, true);
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usUninstall then begin
if MsgBox(‘Do you want to delete all config files and log files?’, mbConfirmation, MB_YESNO) = IDYES
then DelFiles();
end;
end;
安装之后截图:
本文链接:http://www.cnblogs.com/ityujian/p/Inno_Setup_Problems.html,转载请注明
20 Inno Setup制作安装包的几个问题的更多相关文章
- 解决Inno Setup制作安装包无法创建桌面快捷方式的问题
转自:http://yedward.net/?id=104 昨天想把个java程序做成exe安装软件,然后就去下载了Inno Setup这个软件安装包制作软件,Inno Setup这个软件确实非常好用 ...
- INNO setup 制作安装包
1.获取SQLserver安装路径vardbpath:string;rtn:boolean;rtn := RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWA ...
- Inno Setup制作安装包的几个问题
1. 卸载时,如何判断应用程序是否运行 InnoSetup 提供变量AppMutex,用来保存应用程序的Mutex名称.现在很多应用程序都是唯一实例运行.这样避免配置文件被错误修改以及其他很多衍 ...
- 使用inno setup制作安装包
- 用inno Setup制作web项目安装包
http://www.cnblogs.com/xionghui/archive/2012/03/22/2411207.html 用inno Setup制作安装包 新建一个文件夹exambody,放ap ...
- [Azure DevOps] 使用 Inno Setup 制作桌面软件安装包
1. 桌面应用程序的 CI/CD 桌面应用程序的 CI/CD 过程和网站有一些不同,毕竟桌面应用程序的"部署"只是将安装包分发到目标位置,连应用商店都不用上,根据公司的管理流程可以 ...
- 使用Inno Setup 制作软件安装包详细教程(与开发语言无关)
前言:关于如何制作一个软件安装包的教程,与编程语言无关.以下,请看详情~ 1.下载Inno Setup,下载地址:https://jrsoftware.org/isinfo.php 2.下载最新版本即 ...
- Inno Setup制作应用程序安装包
我最近写了一个MFC应用程序,想发给其他的小伙伴玩一玩,直接发了个exe文件过去,结果发现小伙伴那边打不开.原来这个exe文件虽然是MFC静态编译的,但是还依赖了其他几个.dll文件,需要把这几个dl ...
- 用Inno Setup制作WEB程序安装包
原文 用Inno Setup制作WEB程序安装包 最近做了一个WEB程序的安装包,我把制作的过程做个介绍,贴出源码给大家做个参考 看看inno 的脚本 [Setup] AppCopyright=tes ...
随机推荐
- Open WATCOM指南 - 哦这样的孤单 你冷若冰霜
https://my.oschina.net/GIIoOS/blog/126701 WATCOM的历史可以追溯到1965年 加拿大的学生Waterloo的团队开发了叫WATFOR的Fortran编译器 ...
- 非 GUI 模式运行 JMeter 压力测试
非 GUI 模式,即命令行模式,运行 JMeter 测试脚本能够大大缩减所需要的系统资源. 使用命令:jmeter -n -t <testplan filename> -l <lis ...
- Tensorflow项目实战一:MNIST手写数字识别
此模型中,输入是28*28*1的图片,经过两个卷积层(卷积+池化)层之后,尺寸变为7*7*64,将最后一个卷积层展成一个以为向量,然后接两个全连接层,第一个全连接层加一个dropout,最后一个全连接 ...
- 使用OC swift 截取路径中的最后的文件名
使用 OC swift 截取路径中的最后的文件名 如何截取下面路径中最后的文件名 AppDelegate.swift /Users/XXX/Desktop/Swift/swift02/code/02- ...
- Window Server 2008 R2 安装 Share Point 2013
原文地址:http://www.cnblogs.com/jianyus/p/3631905.html
- 【python】日志系统
来源: http://blog.csdn.net/wykgf/article/details/11576721 http://www.jb51.net/article/42626.htm http:/ ...
- linux命令(47):rmdir命令
1.命令格式: rmdir [选项]... 目录... 2.命令功能: 该命令从一个目录中删除一个或多个子目录项,删除某目录时也必须具有对父目录的写权限. 3.命令参数: - p 递归删除目录dirn ...
- 三:ZooKeeper的ZAB协议
一:ZAB协议概述--->ZooKeeper并没有完全采用Paxos算法,而是使用了一种称为ZooKeeper Atomic Broadcast(ZAB,zookeeper原子消息广播协议)的协 ...
- AC日记——[SDOI2009]HH去散步 洛谷 P2151
[SDOI2009]HH去散步 思路: 矩阵快速幂递推(类似弗洛伊德): 给大佬跪烂-- 代码: #include <bits/stdc++.h> using namespace std; ...
- 【剑指offer】面试题 10. 斐波那契数列
面试题 10. 斐波那契数列 题目一:求斐波那契数列的第n项 题目描述:求斐波拉契数列的第n项 写出一个函数,输入n,求斐波拉契(Fibonacci)数列的第n项.斐波拉契数列定义如下: C++ 实现 ...