Расширение функций событий с помощью директивы #Include - PullRequest
1 голос
/ 30 ноября 2010

У меня есть базовый скрипт inno-setup, который я использую в качестве шаблона для нескольких инсталляторов. В рамках базового сценария у меня есть вызов функции события, NextButtonClick.

Теперь я хотел бы добавить дополнительный код к событию NextButtonClick, который будет выполняться только одним из моих установщиков. Есть ли способ «продлить» событие NextButtonClick? Я думаю о чем-то вроде функции Python super().

Inno-setup использует Pascal в качестве языка сценариев, поэтому, возможно, эксперт по Pascal может предложить некоторую информацию.

Ответы [ 2 ]

2 голосов
/ 02 декабря 2010

Не напрямую

Помните, что директива #include - это просто директива прекомпилятора, которая заставляет включенный файл появляться там, где директива находится в компиляторе сценария inno setup.

но Чтобы не включать отдельный код установщика в скрипт шаблона, вы можете создать соглашение для вызова процедуры в шаблоне.

Единственное правило, которое вы должны соблюдать, это то, что каждый установщик должен объявить процедуру, даже пустую. Таким образом, вы можете настроить индивидуально для каждого установщика, поддерживая нейтральный шаблон.

Ваш шаблон может выглядеть примерно так:

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.

отказ от ответственности весь код, написанный прямо здесь, чтобы показать вам идею, может не скомпилироваться.

0 голосов
/ 01 декабря 2010

Я использую следующий обходной путь, который в конечном итоге может усложнить управление, но с помощью контроля версий я могу пока держать его под контролем:

В моих отдельных установщиках у меня естьсерия #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 ™.

...