转载

事件函数

Inno Setup支持以下函数和过程。

1. 【安装初始化】该函数在安装程序初始化时调用,返回False 将中断安装,True则继续安装,测试代码如下:

function InitializeSetup(): Boolean;
function InitializeSetup(): Boolean;
begin
Result := MsgBox('安装程序正在初始化,你确定要安装吗?', mbConfirmation, MB_YESNO) = idYes;
if Result = False then
  MsgBox('你放弃了安装,程序直接退出', mbInformation, MB_OK);
end;

2. 该过程在开始的时候改变向导或者向导页,不要指望使用InitializeSetup函数实现改变向导页的功能,因为InitializeSetup函数触发时向导窗口并不存在。

procedure InitializeWizard();

3. 【安装终止时】该过程在安装终止时被调用,注意及时在用户没有安装任何文件之前退出也会被调用。测试代码如下:

procedure DeinitializeSetup();
procedure DeinitializeSetup();
begin
msgbox('DeinitializeSetup is called',mbInformation, MB_OK);
end;

4. 该过程提供用户完成预安装和安装之后的任务,更多的是提供了安装过程中的状态。参数CurStep=ssInstall是在程序实际安装前(所有的路径等都配置好之后准备写入文件钱),CurStep=ssPostInstall是实际安装完成后,而CurStep=ssDone是在一次成功的安装完成后、安装程序终止前(即点击finish按钮后执行)。测试代码如下:

procedure CurStepChanged(CurStep: TSetupStep);
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssinstall then
MsgBox('准备写入文件了', mbInformation, MB_OK);
if CurStep=ssPostinstall then
MsgBox('文件复制完成', mbInformation, MB_OK);
if CurStep=ssDone then
MsgBox('软件成功安装', mbInformation, MB_OK);
end;

三个步骤的截图如下:

5. 当用户单击下一步按钮时调用。如果返回True,向导将移到下一页;如果返回False,它仍保留在当前页。测试代码如下:

function NextButtonClick(CurPageID: Integer): Boolean;
function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := MsgBox('到下一页去吗?', mbConfirmation, MB_YESNO) = idYes;
end;

6. 和前面的NextButtonClick函数相反,当用户单击返回按钮时调用。如果返回True,向导将移到前;如果返回False,它仍保留在当前页,测试代码略。

function BackButtonClick(CurPageID: Integer): Boolean;

7. 当用户单击取消按钮或单击窗口中的关闭按钮时调用。Cancel参数指定取消进程是否该发生;默认为True。Confirm参数指定是否显示“退出安装程序吗?”的消息框;默认为True。如果Cancel设为False,那么Confirm的值将被忽略。测试代码如下:

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
cancel:=False;
end;

和你所预料的一样,本段代码将会导致Cancel按钮失效,即逼迫用户完成安装或者采用非正常方式终止安装程序。

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:=false;
end;

而上面的这段代码将会在用户点击Cancel按钮之后直接退出,不需要做进一步的确认。

8. 向导调用这个事件函数确定是否在所有页或不在一个特殊页 (用PageID指定) 显示。如果返回True,将跳过该页;如果你返回False,该页被显示。注意:这个事件函数不被wpWelcome、wpPreparing和wpInstalling 页调用,还有安装程序已经确定要跳过的页也不会调用 (例如,没有包含组件安装程序的wpSelectComponents)。测试代码如下:

function ShouldSkipPage(PageID: Integer): Boolean;
function ShouldSkipPage(PageID: Integer): Boolean;
begin
if PageID=wpSelectDir then
Result:=True;
end;

本段代码将会使得安装程序跳过选择安装目录的页面,即如下页面是不会被显示的:

可用的PageID有: wpLicense, wpPassword, wpInfoBefore, wpUserInfo, wpSelectDir, wpSelectComponents, wpSelectProgramGroup, wpSelectTasks, wpReady, wpInfoAfter, wpFinished

9. 在新向导页 (由CurPageID 指定)显示后调用。测试代码如下:

procedure CurPageChanged(CurPageID: Integer);
procedure CurPageChanged(CurPageID: Integer);
begin
Msgbox('ha,new page!',mbInformation, MB_OK);
end;

该段代码将会导致每出现一个新的一面的时候就会弹出一个消息框。

10. 如果安装程序在Pascal 脚本中发现该函数,它自动显示密码页并调用CheckPassword检查密码。返回True 表示接受密码,返回False拒绝。测试代码如下:

function CheckPassword(Password: String): Boolean;
function CheckPassword(Password: String): Boolean;
begin
if Password='castor' then
result:=true;
end;

在安装过程中将会出现询问安装密码的页面,如果输入错误将会出现下面的对话框:

为了避免在 [Code] 段内部贮存真实的密码,最好使用其他的信息进行比较,例如使用GetMD5OfString(Password)计算实际密码的MD5值保护实际密码。

11. 如果返回True,安装程序在安装结束时提示用户重启系统,False则不提示。测试代码如下:

function NeedRestart(): Boolean;
function NeedRestart(): Boolean;
begin
result:=True;
end;

在安装完成之后的finish页面,将会出现如下的选项:

12. 如果脚本中存在该函数,则在Ready to Install页面变为活动页的时候自动调用该函数,该函数返回一段文本,该文本显示于Ready to Install页面中的设置备注中,并且该文本将用NewLine参数分割为一个单独的多行字符串,参数Space指代空格,测试是六个,其它参数将包含安装程序用于设置段的字符(可能是空的)。例如MemoDirInfo参数包含选择目录段的字符串。测试代码如下:

function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoComponentsInfo, MemoTasksInfo: String): String;

var
res: String; begin res:='UpdateReadyMemo Function is here'+NewLine+'This is the Second Line';
res:=res+Space+'And with Six Spaces';
res:=res+NewLine+'MemoUserInfoInfo'+MemoUserInfoInfo;
res:=res+NewLine+'MemoDirInfo'+MemoDirInfo;
res:=res+NewLine+'MemoTypeInfo'+MemoTypeInfo;
res:=res+NewLine+'MemoComponentsInfo'+MemoComponentsInfo;
res:=res+NewLine+'MemoComponentsInfo'+MemoComponentsInfo;
res:=res+NewLine+'MemoTasksInfo'+MemoTasksInfo; Result:=res; end;

运行后在安装前会出现确认页面:

标记黄色文字下面是各个参数的内容。

13. 本过程实现在自定义向导页中贮存用户输入的设置,在脚本中放入本函数,并调用SetPreviousData(PreviousDataKey, ...)替换它,每次设置一个。

procedure RegisterPreviousData(PreviousDataKey: Integer);

14. 该函数将在用户信息向导页中自动出现一个序列号对象 (前提是[Setup]段中使用UserInfoPage=yes)。返回True表示接受序列号,返回False 拒绝。注意:当使用序列号时,该软件并没有被加密,而且Inno Setup源代码是免费获取的,有经验的人从安装程序中删除序列号保护并不是很困难的事。本函数只是方便用户在你的应用程序中仔细检查输入的序列号 (贮存在{userinfoserial}常量)。测试代码如下:

function CheckSerial(Serial: String): Boolean;
function CheckSerial(Serial: String): Boolean;
begin
if Serial='ABCDEF-1234567890' then
Result:=True;
end;

在安装过程中将会出现一个页面,如下:

如果Serial Number不正确,Next按钮将会无效,只有正确的序列号才能使得Next按钮有效,再次说明:不要指望使用这种方法保护你的软件。

15. 返回一个非零值,命令安装程序返回一个自定义退出代码,本函数只在安装程序运行完成并且退出代码已是零时才调用。常见的退出代码如下:

function GetCustomSetupExitCode: Integer;

代码

说明

0

安装程序成功完成

1

安装程序初始化失败

2

用户在实际安装前点击取消,或者在开始的“这将安装……”时选择否

3

当准备到下一个安装阶段的时候发生致命错误,只有在比较极端的情况下发生这种错误,例如内存耗尽。

4

实际安装过程中发生致命错误

5

用户在实际安装过程中点击取消或者在“终止-重试-忽略”对话框中点击了终止

6

安装程序被调试器强制终止

7

准备安装阶段发现安装无法进行

8

准备安装阶段发现安装无法进行,并且系统需要重启来解决问题

例如在用Inno Setup调试编译后的安装文件时,按下Ctrl+F2后,下面的调试输出将会提示如下:

退出代码为6,可见安装程序被调试器强制终止。

16. 在与安装阶段返回一个非空字符串命令安装程序停止,该字符串将会作为错误消息,设置NeedsRestart为True将要求用户重启系统,该函数只在安装程序发现不能继续下去的时候才被调用。

function PrepareToInstall(var NeedsRestart: Boolean): String;

【Inno Setup】Pascal 脚本 ---- 事件函数的更多相关文章

  1. 一个比较完整的Inno Setup 安装脚本(转)

    一个比较完整的Inno Setup 安装脚本,增加了对ini文件设置的功能,一个安装包常用的功能都具备了. [Setup] ; 注: AppId的值为单独标识该应用程序. ; 不要为其他安装程序使用相 ...

  2. 一个比较完整的Inno Setup 安装脚本

    一个比较完整的Inno Setup 安装脚本,增加了对ini文件设置的功能,一个安装包常用的功能都具备了. [Setup] ; 注: AppId的值为单独标识该应用程序. ; 不要为其他安装程序使用相 ...

  3. 直接用bat命令对Inno Setup的脚本文件.iss进行编译

    直接用bat命令对Inno Setup的脚本文件.iss进行编译 2010-06-17 15:17 qjn0059 | 浏览 2163 次 编程语言外语学习 分享到:   2010-06-29 11: ...

  4. Inno Setup Pascal Script to search for running process

    I am currently trying to do a validation at the uninstall moment. In a Pascal script function, in In ...

  5. Inno Setup 通用脚本及简要说明( 一般情况够用了)

    ;以下脚本主要完成创建开始菜单和桌面的快捷方式,目录安装. #define MyAppName "我的软件名" #define MyAppVersion "1.0&quo ...

  6. Inno Setup, Pascal 字符串带双引号如何写

    Windows 的路径中如果有空格,就需要用双引号括起来.只能填 ASCII-Code-Number (decimal),不能用一般的 escape 方法. # + path + # 查询这个表的第一 ...

  7. Inno Setup的常用脚本

    Inno Setup的常用脚本 分类: VC++神奇理论 2012-12-06 10:07 3234人阅读 评论(2) 收藏 举报 安装不同的目录: [Files] Source: "我的程 ...

  8. Inno Setup for Windows service

    Inno Setup for Windows service? up vote86down votefavorite 77 I have a .Net Windows service. I want ...

  9. inno setup介绍及官方网站地址

    使 用 笔 记 1.Inno Setup 是什么?Inno Setup 是一个免费的 Windows 安装程序制作软件.第一次发表是在 1997 年,Inno Setup 今天在功能设置和稳定性上的竞 ...

随机推荐

  1. c#的全局异常捕获

    以下操作在Program.cs中 1.最简单的方式try...catch.. 一般用在某一段容易出错的代码,如果用在整个软件排查,如下所示 static void Main() { try { App ...

  2. 【高并发】什么是ForkJoin?看这一篇就够了!

    写在前面 在JDK中,提供了这样一种功能:它能够将复杂的逻辑拆分成一个个简单的逻辑来并行执行,待每个并行执行的逻辑执行完成后,再将各个结果进行汇总,得出最终的结果数据.有点像Hadoop中的MapRe ...

  3. Golang入门(2):一天学完GO的基本语法

    摘要 在配置好环境之后,要研究的就是这个语言的语法了.在这篇文章中,作者希望可以简单的介绍一下Golang的各种语法,并与C和Java作一些简单的对比以加深记忆.因为这篇文章只是入门Golang的第二 ...

  4. Shell:Day02.笔记

    重定向和管道符:1.重定向 程序 = 指令 + 数据        命令   变量  在程序中,数据如何输入?有如何输出?  数据输入:键盘 -- 标准输入,但是并不是唯一输入方式:    --std ...

  5. 【数据库】MySQL数据库(五)

    一.DCL语句 1.添加权限: '; 注:sakili为数据库名,z1为新创建的数据库用户,123为密码 数据库添加权限 2.权限收回: revoke insert on sakila.* from ...

  6. 家庭版记账本app进度之关于listview显示账单,并为其添加点击事件

    这个主要学习是关于listview的学习. 怎样去自定义adapter,以及使用.自己创建文件,还有就是为listview的每一个子控件添加点击事件. 在整个过程中收获到的知识点如下: 一.对于数据库 ...

  7. python3启动子进程之 os.fork()

    python3启动子进程之 os.fork() 先了解python3 os.fork()  使用说明 在生物学家开始克隆研究之前,计算机科学家就拥有成功的克隆历史.他们克隆了进程,尽管他们没有将其称为 ...

  8. NonRegisteringDriver造成的内存频繁FullGc

    某天上服务器看了下gc情况,发现状况不对,启动了才2天的服务器发生了360次fullgc,这个频率肯定高了 说明 S0C.S1C.S0U.S1U:Survivor 0/1区容量(Capacity)和使 ...

  9. python3(十三)map reduce

    # map()函数接收两个参数,一个是函数,一个是Iterable, # map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回. def f(x): return x * ...

  10. 自己模拟的ftl 用法:

    基类 public class Ftl_object_data_model { //三种基本属性 private boolean canRead=true;//是否能读取 ;//长度 private ...