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.chawenti.com/articles/15721.html
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 ...
- 20 Inno Setup制作安装包的几个问题
系统开发好之后,通常需要制作成安装包,才能卖给用户.利用Inno Setup的向导可以制作简单的安装包,但是如果要做个好的安装包的话可能会遇到一些麻烦,今日终于抽空解决了,Inno Setup打包的一 ...
- 使用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制作应用程序安装包
我最近写了一个MFC应用程序,想发给其他的小伙伴玩一玩,直接发了个exe文件过去,结果发现小伙伴那边打不开.原来这个exe文件虽然是MFC静态编译的,但是还依赖了其他几个.dll文件,需要把这几个dl ...
- 用Inno Setup制作WEB程序安装包
原文 用Inno Setup制作WEB程序安装包 最近做了一个WEB程序的安装包,我把制作的过程做个介绍,贴出源码给大家做个参考 看看inno 的脚本 [Setup] AppCopyright=tes ...
- 用Inno setup制作以管理员权限启动的安装包
inno setup制作的安装包,默认是不需要管理员权限启动的.我们制作安装包,往往需要做一些设置工作,这些设置工作可能用到管理员权限.使用Resource Hacker修改inno setup资源, ...
随机推荐
- MySQL命令行导出数据库
MySQL命令行导出数据库:1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录如我输入的命令行:cd C:\Program Files\MySQL\MySQL Server ...
- sass基础编写流程
这是之前整理在word上的基础流程 sass是Ruby语言开发的一个用于动态编程css文件的框架 所以sass的运行依赖Ruby环境 所以要先安装Ruby 参见详细教程(安装参照慕课网有详细的教程) ...
- #import和@class的使用
#import #import 大部分功能和#include是一样的,但是他处理了重复引用的问题,不用再去自己进行重复引用处理. @class 用于声明一个类,告诉编 ...
- web页面放到手机页面,缩放问题
有时候写页面样式不规范,很多页面元素写死尺寸时,web页面尺寸比较大放到移动端访问时,就背缩放了,div或者按钮变得好小 可以加段js,效果会好点 <script> ! function( ...
- Tomcat version 7.0 only support J2EE 1.2。。。。。。。
刚开始使用eclipse编程,换了eclipse版本后导入项目,出现下的报错
- PHP反向代理-百度图片
最近在一些开发中需要调用百度贴吧等一系列的百度图片 但是防盗链实在讨厌 于是就简单利用curl实现了反向代理(应该是这么叫的) 如果网站直接调用百度图片 会出现如下(博客园貌似在白名单 可以直接用百度 ...
- C语言的作用域规则
作用域规则 程序中名字的作用域,通俗的讲,就是这个名字在程序中的使用范围.在C语言中,作用域的规则相对比较简单,主要分为 全局作用域 和 局部作用域 两种. 一个变量如果定义在函数中,那么这个变量的作 ...
- JS识别ios & 安卓
var isAndroid = navigator.userAgent.indexOf('Android') > -1 || navigator.userAgent.indexOf('Adr') ...
- 随机生成UUID(GUID)的方法
- (NSString *)UUID { CFUUIDRef uuid_ref = CFUUIDCreate(NULL); CFStringRef uuid_string_ref= CFUUIDCre ...
- python数据结构与算法
最近忙着准备各种笔试的东西,主要看什么数据结构啊,算法啦,balahbalah啊,以前一直就没看过这些,就挑了本简单的<啊哈算法>入门,不过里面的数据结构和算法都是用C语言写的,而自己对p ...