inno setup技巧篇

介绍

Inno setup 是一个免费的windows安装程序制作软件.windows 98,2000,XP,NT4.0,Me以及更高的版本均可使用.
软件打包中常用到的功能有:
*定制安装方式,如:自定义安装,完全安装
*拥有自由可控的卸载功能
*创建快捷方式,包括开始菜单和桌面
*创建注册表和.ini项目
*支持密码加密
*后台安装和后台卸载
*安装前和安装后执行一系列活动,比如检测注册表是否存在或写入注册表,检测进程是否运行,检测文件版本
*文件压缩,支持bzip2、7-Zip 、lzma格式的压缩.安装程序可以比较文件版本信息,替换正在使用的文件

市面上的很多软件都在使用此款软件作为安装包工具, 例如: bandicam ,迅雷,notepad++,foxmail, FileZilla,PotPlayer,navicat等等……
因为打包快捷,而且可以自己开发插件(.dll)放进去使用.

提前预习

基本的使用方式百度上搜的话能搜出一大堆比如搜”inno setup打包工具使用” “inno setup脚本编写”,但是简单使用的方式,有时候会满足不了客户的特殊需求,所以这次要讲的是百度上有点难搜到,而且是我从入职以来到至今的写安装包的经验总结出来的几点技巧.

  1. inno setup脚本分为几个段落 ,这几个段落需要记住;
  2. [setup],该段包含用于安装程序和卸载程序的全局设置。某些指令对于你创建的任何安装程序都是必需的;
  3. [Icons] ,这个可选段定义所有穿件在开始菜单和其他位置(比如桌面)快捷方式;
  4. [Languages] ,用来定义安装程序中可使用的语言;
  5. [UninstallRun] ,同样是可选的,用来指定在卸载第一步要执行的一些程序.除在下面有注释的外,两个段使用相同的语法;
  6. [Registry] ,这个可选段用来定义一些你想用安装程序在用户系统中创建、修改或删除的注册表键/值;
  7. [Tasks] ,这个段是只选的。它定义安装程序在执行安装期间所有由用户定制的任务。这些任务以选项框和单选项形式在附加任务向导页面中出现;
  8. [UninstallDelete] ,该可选段定义你要卸载程序删除的任何附加文件或目录,除了那些用 [Files] 或 [Dirs] 段条目安装/创建的以外。删除由应用程序创建的 .INI 文件,对于该段是常用的一种方法。该卸载程序处理这些项作为卸载的最后一步;
  9. [Dirs],这个可选段用来定义除创建用户选择的应用程序目录外安装程序自动创建的另外目录。在主应用程序目录下创建子目录对于这个段是公共使用的;
  10. [INI],这个可选段用来定义除创建用户选择的应用程序目录外安装程序自动创建的另外目录。在主应用程序目录下创建子目录对于这个段是公共使用的;
  11. [LangOptions],用于定义特殊语言设置,象字体一样,被安装程序和卸载程序使用。通常,你不需要在脚本文件中创建 [LangOptions] 段,按默认值,由于特殊语言设置在 Inno Setup 的 Default.isl 文件(或由 [Languages] 段条目指定的那个文件)中已经包含

上述内容都可以在附件的 Isetup.chm文档中找到….

技巧内容

1.修改界面上的提示语

开始界面上的提示内容修改,主界面上的内容可以分为两块,如图画蓝线的和画红线的
在这里插入图片描述
画蓝线的在脚本中应该修改的位置, 是[setup]下的AppName和AppVersion如下图:
在这里插入图片描述
画红线的在脚本中默认是不显示的,修改的话需要自己加上[Messages],下面的各种属性需要到百度找, 附件中是我从百度下载下来的[Messages]的属性列表

效果如下:
在这里插入图片描述
在这里插入图片描述
安装完成页面上的提示语修改
在这里插入图片描述
在这里插入图片描述
还有其他界面上的内容也可以修改如:
准备界面(wpReady)
licence界面(wpLicense)
选择菜单分组界面(wpSelectProgramGroup)
选择安装路径界面(wpSelectDir)
自定义界面的话可以在创建界面时在[code]里直接修改,如图
在这里插入图片描述
在这里插入图片描述
例子就讲到这里,还有很多属性能修改,需要的可以从附件中拿到[Message]中的属性,这些属性都可以在……/inno/Default_cn.isl 这个文件中找到,是语言库…
脚本中也可以自己选取使用某个语言库,如图:
在这里插入图片描述
[Code]中的自定义界面创建就请参考CodeClasses.iss,这是innosetup自带的example脚本,附件里找到

2.自动指定上一次安装的路径

这个功能安装包脚本[setup]里已经有提供有这个属性。
UsePreviousAppDir = yes 时会自动跳过安装目录选择界面直接安装到上次安装的目录下
脚本是根据安装包的AppId这个属性来判断是不是跟上次安装的安装包相同.

3. 安装时控制安装的路径,但是显示上次安装的路径

这跟2有稍微的区别,就是能看到上次安装的目录在此基础上可以选择安装路径.
这里就能用到inno的[Code]段中的函数.如图:
在这里插入图片描述
DefaultDirName是指安装的默认路径
{code:GetPath|Client} 中code:GetPath 是[code]段中自己写的一个可以读注册表的函数,|Client是参数,如果没有参数就写成{code:GetPath}即可.
[Code]段中的函数可以出现在整个脚本的任何位置,不在[Code]段中时需要使用 {code:xxxx} 这种调用方式.需要注意的是[Code]段中的函数中的任何变量,必须是已经有值的变量才行,不然运行时会报错. 需要保证这些变量有值就需要在[Code]段中写下初始化的函数

function InitializeSetup(): Boolean;
在安装程序初始化时调用,返回 False 中断安装,否则返回 True。
procedure InitializeWizard();
在启动时使用该事件函数来改变向导或向导页面。你不能在它被触发时使用 InitializeSetup 事件函数,因为向导窗体尚不存在。
一般是用InitializeSetup函数就可以了.
Inno有内置的读取注册表的功能函数RegQueryStringValue,应用举例代码看

function GetPath(Param: String): String;
var
    strPath: String;
    sFloader:String;
    sdefaultpath:String;
begin
    strPath := '';
    sdefaultpath :='C:\Program Files\xxxxx';
    if Param = 'Client' then
    begin
	  sFloader := 'Software\xxxxx';
	  sdefaultpath := 'C:\Program Files\xxxxx';
    end
    if Param = 'Server' then
    begin
	  sFloader := 'Software\xxxxx';
	  sdefaultpath := 'C:\Program Files\xxxxx';
    end
    if (RegQueryStringValue(HKEY_LOCAL_MACHINE, sFloader, 'Path', strPath))then
    begin
		Result := strPath;
    end
    else
    begin
        Result :=sdefaultpath;
    end
end;

在这里插入图片描述
在这里插入图片描述

4.卸载完成后不残留文件

[UninstallDelete]
Name: {app}; Type: filesandordirs; Languages:
加上这段代码,表示卸载后删除文件和目录.可以在附件1中的ISetup.chm文档中搜索UninstallDelete来执行更多的删除操作,删除时能删除好多好多东西……

5.安装时运行批处理文件

安装时运行批处理文件,这样就能把windows中的批处理的强大功能导入到了安装卸载过程中,实现过安装时备份功能,安装时删除,安装时移动等等功能……
此功能是在[Code]段中实现的,因为[Code]段中的代码能在整个脚本中的任何位置执行.下面是批处理文件的参数,文件名,工作目录的写法:
ShellExec(’’,ExpandConstant(sBatName), sBatParams,sBatPath, SW_HIDE, ewWaitUntilTerminated, ResultCode);
第一个参数: 这个不太懂,就写成空字符串就行了. 注:inno中字符串是单引号(‘’)来扩住的
第二个参数: ExpandConstant(sBatName)中ExpandConstant()是更改所有在sBatName中的常量到它们的值。例如,ExpandConstant(’{pf}’)是改变到安装程序的文件名,简单来说就是更改inno中的常量(宏)的字符串让ShellExec这个函数认识这个参数. sBatName:=’xxxx.bat’这样就行了.
第三个参数: sBatParams:=’”’ + 参数 + ‘”’ . 其中”双引号是为了防止运行批处理时出现错误,单引号扩住双引号,我试过 sBatParams := ‘参数’ ,结果参数中包含空格,运行批处理时一直失败.
第四个参数: sBatPath 同理 跟第三个参数相同的思路.
第五个参数: SW_HIDE表示运行时隐藏cmd窗口, SW_SHOW表示运行时显示此窗口
第六个参数: ewNoWait, ewWaitUntilTerminated, ewWaitUntilIdle分别表示:不等待cmd执行完成,等待cmd执行完成,等待用户输入直到超时时间.
第七个参数: 这个参数是返回结果,结果为0除外的都是错误,具体错误原因可以查MSDN
例子.
文件备份举例.rar脚本可以完成的打出一个安装包,也包含很多其他的内容,所以打开安装包之后直接ctrl+f搜索 BackDir , BackFile即可快速找到函数.

6.安装包制作过程中怎么调试

Innosetup默认支持调试功能,跟vs2008编译器差不多,先打断点然后点击单步步入或单步步过,执行到断点之后点击F8就是继续,点击F7就是进入到函数里面继续,如图:
在这里插入图片描述

7.控制面板中安装包显示的名字

修改[Setup]段中
Uninstallable: yes表示有卸载程序,no表示没有
UninstallFilesDir: 表示卸载程序放置的路径
UninstallDisplayName: 表示卸载程序的显示名称

在这里插入图片描述

8.脚本中使用其他插件(.dll)的方法

举例使用IsTask.dll这个插件
在[Setup]段中写入
Source: compiler:IsTask.dll; Flags: dontcopy noencryption
Source: inno\IsTask.dll; DestDir: {app}\
其中DestDir:{app}\ 表示此插件安装后的 dll放置路径.

在[Code]段中任意位置,先导入函数
function KillTask(ExeFileName: string): Integer;
**external ‘KillTask@files:ISTask.dll stdcall delayload’; **

在[Code]段中使用函数,导入过程必须放在使用前面,不然识别函数失败
KillTask(‘tomcat7.exe’);

9.脚本太长时,include方式整理脚本

Include可以说是直接把这段代码复制到这个位置一样,可以把通常不用修改的内容卸载里面
Include可以用在整个脚本的任何位置.
在这里插入图片描述
比如这些也可以另外创建一个文件写进去然后在用include导入.
在这里插入图片描述

总结(工具链接)

生活愉快 ~\(^o^)/~

inno setup 5 下载链接.

猜你喜欢

转载自blog.csdn.net/rhddlr/article/details/84105324