inno setup打包工具--从5.2.4版本升级到5.5.4u,脚本的变动

本文分享了将InnoSetup从5.2.4版本升级到Unicode版本的过程,解决了繁体乱码问题,并介绍了如何优化安装界面、加速帮助文档加载速度、调整函数参数等实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

负责的一个项目使用的打包工具是inno setup5.2.4版本,项目较老,很多不好变动,且此版本会导致繁体乱码等诸多编码问题,故下决心要升级工具版本,使用Unicode版本的工具,可以避免乱码问题

遇到的问题:

1、安装界面有四种类型供选择,以前是选择一种类型,置灰其他类型,现在要改成点击哪个类型选中哪个类型,查了很久找到了一个[Components]里面的Flags,终结此烦恼:

Flags:exclusive

贴上帮助文档里面的解释:

2、由于有四种类型选择,且每一种类型有不同的自定义端口修改页面,以前是四种类型共用一个端口页面,再根据不同的类型置灰不同的端口,这样就显的安装页面有点丑,而且要继续增加端口,也遇到了瓶颈,最终解决方法:

初始化的时候初始4个页面,每个页面初始化不同的端口,再根据选择的类型去屏蔽不需要的页面,关于屏蔽的方法,依旧查了很久,此处只能哀叹,inno setup的资料确实少,只能抱着帮助文档中英文版在那不停的找:

函数:ShouldSkipPage   帮助文档里面的解释:

可这样调用:

function ShouldSkipPage(PageID:Integer):Boolean;
begin
 result:=false;
 if ((PageID=APage.ID) or (PageID=BPage.ID)) and  ((server = 3) or (server = 4)) then begin
  result:=true;
 end;
 if ((PageID=CPage.ID) or (PageID=DPage.ID)) and  ((server = 1) or (server = 2) or (server = 4)) then begin
  result:=true;
 end;
 if (PageID=EPage.ID) and  ((server = 1) or (server = 2) or (server = 3)) then begin
  result:=true;
 end; 
end;

调用:

ShouldSkipPage(APage.ID);

ShouldSkipPage(BPage.ID);

ShouldSkipPage(CPage.ID);

ShouldSkipPage(DPage.ID);

ShouldSkipPage(EPage.ID);

结果:

server 1跟2显示APage和BPage

server 3显示CPage和DPage

server 4显示EPage

3、点击安装页面的“帮助文档”按钮,打开帮助文档耗时很长,根据不精确计算,大概需要一分多钟,额,普通人估计都不愿意点

由于脚本中使用的是ExtractTemporaryFile函数来提取帮助文档,在查询英文inno setup Help里面此函数的时候,发现如下解释:

百度粗略翻译下的意思是:需要解压提取的文件最好位于 [Files]尽量靠前的地方,因为解压是根据[Files]顺序来,直至解压到需要打开的文件为止,所以将脚本中帮助文档放到[Files]段最前面,打包之后再点击按钮,超快就打开了

4、LoadStringFromFile函数参数变动

5.2.4:function LoadStringFromFile(const FileName: String; var S: String): Boolean;

5.5.4u:function LoadStringFromFile(const FileName: String; var S: AnsiString): Boolean;

5.5.4u很多函数的参数由String变成AnsiString

5.5.4u还有另外一个函数:function LoadStringsFromFile(const FileName: String; var S: TArrayOfString): Boolean;

对比了String跟AnsiString、TArrayOfString,最终选择使用LoadStringsFromFile,将原来的String参数换成TArrayOfString

由于脚本中使用的功能是,加载配置文件,修改配置文件内容,保存配置文件,所以加载的函数变更,修改和保存的函数也需要一并变更:

原来修改配置文件内容的函数StringChange换成TArrayOfStringChanges,由于没有现成可用的,于是自己写了个TArrayOfStringChanges的自定义函数,原理是将TArrayOfString先转换成String,然后再调函数进行修改配置操作:

function TArrayOfStringChanges(svArray:TArrayOfString; FromStr, ToStr: String): TArrayOfString;
var
    nLines,i:Integer;
    tempStr:String;
begin
    nLines := GetArrayLength(svArray);
    for i := 0 to nLines - 1 do
    begin
       tempStr := svArray[i];
       if ( Pos(FromStr, tempStr)>0 ) then
       begin
         StringChangeEx(svArray[i], FromStr, ToStr, True);
       end;     
    end;
    Result := svArray;
end;

保存文件的函数由SaveStringToFile换成SaveStringsToFile或SaveStringsToUTF8File,具体使用哪一个,根据文件的编码格式决定。

5、TArrayOfStringToString 自己封装了一个用来将TArrayOfString先转换成String,方便在某一些函数里面调用

function TArrayOfStringToString(svArray:TArrayOfString): String;
var
    nLines,i:Integer;
begin
 Result := '';
 nLines := GetArrayLength(svArray);
    for i := 0 to nLines - 1 do
    begin
        Result := Result+svArray[i];
    end;
end;

6、组件相关的一些知识

点击某一个组件时,触发的是IsComponentSelected 函数

组件选中/不选中:WizardForm.ComponentsList.Checked[0]:=true/false;  组件数字编码从0开始,按顺序排

组件置灰/有效:WizardForm.ComponentsList.ItemEnabled[0] := false/true;

7、其他一些小知识

打开一个选择目录的对话框:function BrowseForFolder(const Prompt: String; var Directory: String; const NewFolderButton: Boolean): Boolean;

------总结下:要更好的使用inno setup,除了要学会查看帮助文档,还要学点pascal

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值