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资源, ...
随机推荐
- 如何开发、调试Hybrid项目-- 入门篇
前言 随着移动浪潮的兴起,各种APP层出不穷,极速的业务扩展提升了团队对开发效率的要求,这个时候使用IOS&Andriod开发一个APP似乎成本有点过高了,而H5的低成本.高效率.跨平台等特性 ...
- c++ sort降序排序
sort是c++ STL中提供的一个函数模板,可以用来对多种类型进行排序. 默认是升序排序.它有两种使用方法: default (1) template <class RandomAccessI ...
- 第三个Sprint冲刺第十天
讨论地点:宿舍 讨论成员:邵家文.李新.朱浩龙.陈俊金 讨论问题:做最后的工作
- Page 指令的各个属性及其功能
转载:http://www.cnblogs.com/elleniou/archive/2012/09/09/2678101.html 语法规则: <@%page attribute1=”valu ...
- Watin 杂谈
Web自动化测试(三)[弹出窗口处理] http://blog.csdn.net/cctv_hu/article/details/5984373 http://www.cyqdata.com/cnbl ...
- Sqoop使用手册
转载请注明出处:http://www.cnblogs.com/xiaodf/ 1 Sqoop概述 2 版本说明 3 驱动安装 3.1 MySQL 4 基本用法 4.1 导入 4.1.1 保护密码 4. ...
- C++中的异常处理机制
C++中的捕获异常机制catch参数中实参的类型不同,采取的处理方式则不相同,且与普通的函数调用还不一样,具体表现为当抛出异常throw A()或throw obj时,对象会进行一次额外的对象复制操作 ...
- http学习 1-3 chapter3-报文
如果说HTTP是因特网的信使,那么HTTP报文就是它用来搬东西的包裹了. 报文是如何流动的. HTTP报文的三个组成部分(起始行.首部和实体的主体部分) 请求和响应报文之间的区别 请求报文支持的各种功 ...
- tomcat取带有中文的参数乱码的解决办法
1. 对于post参数,可以用filter来处理,在dofilter之前,加入以下代码: request.setCharacterEncoding("UTF-8"); 2. 对于g ...
- 返回顶部demo
<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...