通过#Include指令扩展事件函数

时间:2010-11-30 19:40:46

标签: inno-setup pascal

我有一个基本的inno-setup脚本,我用它作为几个安装程序的模板。作为基本脚本的一部分,我调用了事件函数NextButtonClick

我现在想在NextButtonClick事件中添加一些额外的代码,这些代码只会由我的某个安装程序执行。有没有办法“扩展”NextButtonClick事件?我正在考虑Python的super()函数。

Inno-setup使用Pascal作为脚本语言,因此Pascal专家可能会提供一些见解。

2 个答案:

答案 0 :(得分:2)

不直接

请记住,#include指令只是一个预编译器指令,它使包含的文件出现在指令所在的inno安装脚本编译器中。

<强>但 要避免在模板脚本中包含单个安装程序代码,可以创建一个约定来调用模板中的过程。

您必须遵循的唯一规则是每个安装程序都必须声明该过程,甚至是空白。这样,您可以根据每个安装程序进行自定义,同时保持中性模板。

您的模板可能类似于:

function NextButtonClick(CurPageID: Integer): Boolean;
begin
  Result := BeforeNextButtonClick(CurPageID);
  //if the per-installer code decides not to allow the change, 
  //this code prevents further execution, but you may want it to run anyway.
  if not Result then
    Exit;  
  //your template logic here

  Result := Anything and More or Other;

  //same here!
  if not Result then
    Exit;

  //calling the per-installer code
  Result := AfternextButtonClck(CurPageID);
end;

然后,各个安装程序可能如下所示:

function BeforeNextButtonClick(CurPageID: Integer): Boolean;
begin
  //specific logic here
  Result := OtherThing;
end

function AfterNextButtonClick(CurPageID: Integer): Boolean;
begin
  //and here, a blank implementation
  Result := True;
end;

#include MyCodeTemplate.iss

也许有可能实现一个复杂的方法,我只是不记得PascalScript是否支持过程类型,没有时间检查inno。

免责声明这里直接写的所有代码都是为了向您展示这个想法,它可能无法编译。

答案 1 :(得分:0)

我正在使用以下解决方法,这可能会使最终难以管理,但使用版本控制我现在能够处理它:

在我的个人安装程序中,我有一系列#define指令。例如:

#define IncludeSomeFeature
#define IncludeSomeOtherOption

然后在我的基本模板中,我使用#ifdef指令来选择性地在Pascal脚本事件中包含不同的代码片段:

function NextButtonClick(CurPageID: Integer): Boolean;
var
    ResultCode: Integer;
begin
  Result := True;
  if CurPageID = wpReady then begin
    #ifdef IncludeSomeFeature
        ... some code ...
    #endif
    #ifdef IncludeSomeOtherOption
        ... some more code ...
    #endif
    ... code to run for every installer ...
  end;
end;

这种方法的一个缺点是基本模板将慢慢填满真正属于单个安装程序的代码的代码。但是,由于这些是编译时指令,因此生成的安装可执行文件不应该变得臃肿。

但是,真的,这种方法的最大问题在于它感觉不像The Right Way™。