AM电脑吧 - Win10精简版系统_Win11精简版_Win7旗舰版

Yes
楼主: ②號
收起左侧

Inno Setup入门(十一)——(二十)

[复制链接]
ampc84

签到天数: 15 天

[LV.4]四枚内存条

lz  楼主| ②號 发表于 2012-01-13 00:20:47
Inno Setup入门(十三)——Pascal脚本(2)
事件函数(2)
function CheckPassword(Password: String): Boolean;
如果安装程序在Pascal 脚本中发现该函数,它自动显示密码页并调用CheckPassword 检查密码。返回True 表示接受密码,返回False 拒绝。测试代码如下:
function CheckPassword(Password: String): Boolean;
begin
       if Password='castor' then
              result:=true;
end;
       在安装过程中将会出现询问安装密码的页面,如果输入错误将会出现下面的对话框:
1.jpg
为了避免在 [Code] 段内部贮存真实的密码,最好使用其他的信息进行比较,例如使用GetMD5OfString(Password)计算实际密码的MD5值保护实际密码。
function NeedRestart(): Boolean;
       如果返回True,安装程序在安装结束时提示用户重启系统,False则不提示。测试代码如下:

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

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

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;

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

标记黄色文字下面是各个参数的内容。
procedure RegisterPreviousData(PreviousDataKey: Integer);
本过程实现在自定义向导页中贮存用户输入的设置,在脚本中放入本函数,并调用SetPreviousData(PreviousDataKey, ...) 替换它,每次设置一个。
function CheckSerial(Serial: String): Boolean;
该函数将在用户信息向导页中自动出现一个序列号对象 (前提是[Setup] 段中使用UserInfoPage=yes)。返回True 表示接受序列号,返回False 拒绝。注意:当使用序列号时,该软件并没有被加密,而且Inno Setup 源代码是免费获取的,有经验的人从安装程序中删除序列号保护并不是很困难的事。本函数只是方便用户在你的应用程序中仔细检查输入的序列号 (贮存在{userinfoserial} 常量)。测试代码如下:

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

       在安装过程中将会出现一个页面,如下:
4.jpg
    如果Serial Number不正确,Next按钮将会无效,只有正确的序列号才能使得Next按钮有效,再次说明:不要指望使用这种方法保护你的软件。
function GetCustomSetupExitCode: Integer;
返回一个非零值,命令安装程序返回一个自定义退出代码,本函数只在安装程序运行完成并且退出代码已是零时才调用。常见的退出代码如下:
代码
说明

0
安装程序成功完成

1
安装程序初始化失败

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

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

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

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

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

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

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


例如在用Inno Setup调试编译后的安装文件时,按下Ctrl+F2后,下面的调试输出将会提示如下:
退出代码为6,可见安装程序被调试器强制终止。
function PrepareToInstall(var NeedsRestart: Boolean): String;
       在与安装阶段返回一个非空字符串命令安装程序停止,该字符串将会作为错误消息,设置NeedsRestartTrue将要求用户重启系统,该函数只在安装程序发现不能继续下去的时候才被调用。





回复

举报

ampc84

签到天数: 15 天

[LV.4]四枚内存条

lz  楼主| ②號 发表于 2012-01-13 00:16:48
Inno Setup入门(十二)——Pascal脚本(1)  
事件函数(1)
Inno Setup支持以下函数和过程。
function InitializeSetup(): Boolean;
该函数在安装程序初始化时调用,返回False 将中断安装,True则继续安装,测试代码如下:

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

procedure InitializeWizard();
该过程在开始的时候改变向导或者向导页,不要指望使用InitializeSetup函数实现改变向导页的功能,因为InitializeSetup函数触发时向导窗口并不存在。
procedure DeinitializeSetup();
       该过程在安装终止时被调用,注意及时在用户没有安装任何文件之前退出也会被调用。测试代码如下:

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

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

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;

三个步骤的截图如下:
676102894060751510.jpg

3885199103537765890.jpg

784189285117881431.jpg

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

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

截图如下:

2864852312962322666.jpg
function BackButtonClick(CurPageID: Integer): Boolean;
和前面的NextButtonClick函数相反,当用户单击返回按钮时调用。如果返回True,向导将移到前;如果返回False,它仍保留在当前页,测试代码略。
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
       当用户单击取消按钮或单击窗口中的关闭按钮时调用。Cancel 参数指定取消进程是否该发生;默认为TrueConfirm 参数指定是否显示“退出安装程序吗?”的消息框;默认为True。如果Cancel 设为False,那么Confirm 的值将被忽略。测试代码如下:
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按钮之后直接退出,不需要做进一步的确认。
function ShouldSkipPage(PageID: Integer): Boolean;
       向导调用这个事件函数确定是否在所有页或不在一个特殊页 (PageID 指定) 显示。如果返回True,将跳过该页;如果你返回False,该页被显示。注意: 这个事件函数不被wpWelcomewpPreparing wpInstalling 页调用,还有安装程序已经确定要跳过的页也不会调用 (例如,没有包含组件安装程序的wpSelectComponents)。测试代码如下:
function ShouldSkipPage(PageID: Integer): Boolean;
begin
       if PageID=wpSelectDir then
       Result:=True;
end;
本段代码将会使得安装程序跳过选择安装目录的页面,即如下页面是不会被显示的:

2985605077971233731.jpg
可用的PageID有: wpLicense, wpPassword, wpInfoBefore, wpUserInfo, wpSelectDir, wpSelectComponents, wpSelectProgramGroup, wpSelectTasks, wpReady, wpInfoAfter, wpFinished
procedure CurPageChanged(CurPageID: Integer);
       在新向导页 (CurPageID 指定) 显示后调用。测试代码如下:

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

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


回复

举报

您需要登录后才可以回帖 登录 | 验证注册

Powered by AMpc8.Com (晋ICP备13003365号ghs 晋公网安备 14090202000112号 |GMT+8, 2024/5/19 04:30 |
快速回复 返回顶部 返回列表