在InnoSetup制作的安装程序中下载安装其他程序

本文介绍了如何在InnoSetup创建的安装程序中,通过引用ISSI库下载并安装额外程序。然而,这种方法存在一些限制:它会覆盖原有的InitializeSetup事件函数,需要使用特定语法;不能直接动态判断下载需求,可能需要修改_issi.isi文件;且下载完成后,执行命令和参数在_issi.isi中硬编码,可能导致某些安装程序报错。

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

InnoSetup网站上提供的 ispack就有此功能,其实现没有公布,但应该是采用了 isxdl(这是 ISTools的一部分,属于 InnoSetup的推荐扩展)。

isxdl以dll的方式提供,可以利用已有的窗口句柄显示其界面, InnoSetup的另一个推荐扩展 ISSI提供了对isxdl的一个封装实现:
#define ISSI_English
#define ISSI_Download_Title "Title Of Your Application"
#define ISSI_Download_URL "http://someserver/setup.exe"
#define ISSI_IncludePath "C:/ISSI"
#include ISSI_IncludePath+"/_issi.isi"

This #Include will make it easy to make a 'loader setup'. It will download another (Inno) setup.exe and installs it through the loader setup.

但实际使用中,这样的做法非常不灵活:
  1. 首先,一旦Include ISSI_IncludePath+"/_issi.isi",你原先定义的InitializeSetup等事件函数都将被替换,必须用更加别扭的语法才能使用。
  2. 其次,由于使用的是预处理宏,因此这个实现不能动态地判断是否需要下载,当然你可以修改_issi.isi文件来实现动态判断,但这实在有点过分了。
  3. 再其次,setup.exe下载完成后的执行命令竟然被写死在_issi.isi的代码中,还为其加上了两个命令行参数,某些安装程序就可能为了这两个不认识的命令行参数而报错。

由于以上三个毛病,一般不推荐直接使用ISSI_Download_URL宏来实现下载功能。而是直接调用 isxdl

下面是一个集成了下载的功能的inno setup脚本片段:
{    从isxdl.dll中引入函数,这些函数声明可以从 isxdl 安装后目录中的isxdl.iss文件中找到    }
function isxdl_Download(hWnd: Integer; URL, Filename: PChar): Integer;
    external 'isxdl_Download@files:isxdl.dll stdcall';

function isxdl_SetOption(Option, Value: PChar): Integer;
    external 'isxdl_SetOption@files:isxdl.dll stdcall';

{    响应NextButtonClick事件,动态显示下载对话框,
    这里调用的NeedDownloadXXX是你自己写的函数,判断是否需要下载   }

function NextButtonClick(CurPage: Integer): Boolean;
var
    hWnd : Integer;
    nRet : Integer;
    bRet : Boolean;

begin
    Result := true;

    if (CurPage = wpReady) And NeedDownloadXXX() then begin
            {    
wizardhwnd可以获得当前page的窗口句柄    }
            hWnd := StrToInt(ExpandConstant('{wizardhwnd}'));
            isxdl_SetOption('label', '下载安装XXX');
            isxdl_SetOption('description', '正在下载XXX,请稍候');

            if isxdl_Download(    hWnd,
                                                  'http://www.xxxx.com/setup.exe',
                                                   ExpandConstant('{tmp}/setup.exe')
                                ) <> 0 then begin
                bRet := Exec(    ExpandConstant('{tmp}/setup.exe'),
                                             '',
                                             '',
                                             SW_SHOW,
                                            ewWaitUntilTerminated,
                                            nRet );
                               
                if not bRet or (nRet <> 0) then begin
                    MsgBox( '安装xxx失败', mbInformation, MB_OK );
                end;
            end
            else begin
                MsgBox( '下载xxx失败', mbInformation, MB_OK );
            end;
        end;
    end;
end;

最后,注意要在安装脚本的[Files]段中添加isxdl.dll(这个文件在ISSI的子目录Include/isxdl中)
Source: isxdl.dll; DestDir: {src}; Flags: ignoreversion dontcopy noencryption
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值