Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Inno Setup Pascal Scripting, Вдруг кому пригодится... 
:(
    Опции темы
kemiisto
Дата 19.3.2008, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 16
Всего: 160



The limits of my language mean the limits of my world
LUDWIG WITTGENSTEIN


1. О чем это?

    Я думаю, что многие программисты (да и не только) знакомы с замечательной программой для создания собственных инсталляторов. Имя ей – Inno Setup. Однако не многие знают (а если и знают, то не используют) возможности встроенного скриптового языка Pascal. И очень даже зря…
    Итак, в инструментарий Inno Setup входит современный, совместимый с Delphi (Delphi-like) cкриптовый язык Pascal (Pascal scripting), предоставляющий множество новых возможностей для настройки программы установки/удаления во время исполнения (at run-time). Вот лишь некоторые примеры:
  • преждевременное прекращение (aborting) установки/удаления программы при соблюдении определенных условий; 
  • добавление собственных страничек мастера установки во время исполнения (at run-time); 
  • вызов функций из DLL или других файлов до начала, во время или после окончания установки. 
  • скриптовые константы (scripted constants), которые способны на нечто большее, чем «нормальные» (read-from-registry, read-from-ini и read-from-commandline) константы;
  • возможность условного (т.е. зависящего от некоторого условия) выполнения элементов секций [Files], [Registry], [Run] и т.д.
 
    Естественно, что для отладки скриптов доступен интегрированный отладчик времени исполнения. 
    Машина сценариев (scripting engine), используемая в Inno Setup – это RemObjects Pascal Script by Carlo Kok. Она, так же как и Inno Setup, свободно доступна и поставляется с исходными кодами. Более подробно – см. http://www.remobjects.com/?ps
    Приведенные здесь сведения базируются на оригинальной английский справке к Inno Setup. Я лишь постарался максимально корректно перевести ее и детально рассмотреть приведенные примеры. Там где в значении английского термина я неуверен (или таковых несколько), за русским термином в скобках курсивом указан оригинал. Код набран таким же образом, каким он отображается в окне Inno Setup (т.е. шрифт Courier New + синтаксическая подсветка) и выделен серым цветом. 
    Приведенные примеры берем тут: Examples.zip

2. Секция [Сode]

    Секция [Сode] – это необязательная секция, где и располагается Pascal-скрипт, который может быть использован для тонкой настройки программы установки/удаления. Разработчик Inno Setup обращает наше внимание на то, что создание Pascal-скрипта – это не так просто и требует определенного опыта работы с Inno Setup, а также знания языка Pascal или, по крайней мере, языка, похожего на Pascal. Что верно, то верно!1
    Файлы "Сode*.iss" и "UninstallСode*.iss" в подпапке "Examples" папки Inno Setup содержат различные примеры секции [Сode]. Разработчик Inno Setup настаивает на их тщательном изучении, прежде чем Вы попытаетесь создать свой собственный Pascal-скрипт. Собственно этим (точнее, почти этим) мы и займемся. 

3. Обработчики событий (Event Functions)

    Это очень мощный инструмент! Суть в том, что Pascal-скрипт может содержать процедуры и функции, которые будут вызваны в определенное время. 
    Начнем, пожалуй, с примера.Откройте в Inno Setup любой Ваш ранее созданный установочный скрипт (*.iss), добавьте в конце секцию [Сode] и напишите там следующее:
Код

function InitializeSetup(): Boolean;
begin
  Result := MsgBox('Вызов функции InitializeSetup().' #13#13 'Установка инициализируется. Вы действительно хотите начать установку?', mbConfirmation, MB_YESNO) = idYes;
  if Result = False then
    MsgBox('Пока.', mbInformation, MB_OK);
end;
 
Полный код примера находится в файле Examples\example01.iss
Что здесь что? 
  • function InitializeSetup(): Boolean – функция-обработчик события инициализации установки (код этой функции выполнится во время инициализации установки);
  • возвращаемое значение (переменная Result) – если функция InitializeSetup вернет False, то установка прекратится, а если True – продолжится;
  • ну и собственно код – здесь мы вызываем, как нетрудно догадаться, окно сообщений (message box), где спрашиваем у пользователя, хочет ли он начать установку. Если пользователь ответил <Да>, то результат вызова функции MsgBox будет idYes. Сравниваем результат вызова с idYes, и присваиваем результат сравнения переменной Result. В общем, всё. Теперь функция InitializeSetup вернет соответствующее значение, и установка начнется (или прервется) в зависимости от выбора пользователя;
  • заметьте, что если пользователь не захотел начать установку (Result = False), то будет выведено еще одно окно сообщений (на это раз прощальное  smile ).
    
    Что ж, как и обещали разработчики действительно Delphi-like! А что же мы получим? Смело жмем на запуск и видим наше окно сообщений (рис. 1):
user posted image

Если выбрать <Да>, то установка продолжится, а если <Нет> - увидим прощальное сообщение и установка прекратится. 
    Полный список поддерживаемых функций (в нашем примере мы использовали только одну - MsgBox) Вы можете найти в справке Inno Setup на странице Pascal Scripting: Support Functions Reference. Их там великое множество и я не буду их описывать, тем более, что любому знакомому с Delphi и аглийским языком понять назначение каждой из них будет крайне просто. А вот полный список обработчиков событий с краткими пояснениями, пожалуй, приведу.

3.1. Обработчики событий установки (Setup Event Functions)

Код

function InitializeSetup(): Boolean;

Вызывается во время инициализации установки. Если функция вернет False, то установка прекратится, а если True – продолжится.

Код

procedure InitializeWizard(); 

Используйте для внесения изменений в мастере установки при запуске. Коренным отличием от предыдущего метода является то, что здесь можно вносить изменения в вид страничек мастера установки. Функция InitializeSetup для этого не подходит, т.к. к моменту ее вызова форма мастера установки еще не существует.

Код

procedure DeinitializeSetup();

Вызывается непосредственно пред выходом из мастера установки. Обратите внимание, что эта процедура вызывается даже в том случае, когда пользователь вышел из программы установки до того, как что-либо было установлено. 

Код

procedure CurStepChanged(CurStep: TSetupStep);
 
Эту процедуру Вы можете использовать для выполнения собственных задач до и после установки (pre-install and post-install tasks). Параметр CurStep может принимать следующие значения:
ssInstall – тогда код процедуры будет выполнен непосредственно перед началом установки;
ssPostInstall – тогда код процедуры будет выполнен после окончания установки;
ssDone – тогда код процедуры будет выполнен перед выходом из мастера после успешной установки.

Код

function NextButtonClick(CurPageID: Integer): Boolean;
 
Вызывается, когда пользователь нажимает кнопку <Далее>. Если функция вернет True, то мастер перейдет на следующую страницу, а если False – останется на текущей (заданной параметром CurPageID). Обратите внимание, что эта функция будет вызвана и в режиме «тихой» установки (silent install), хотя и кнопку <Далее> пользователь вряд ли нажмет J. Программа установки просто сымитирует нажатие клавиши. И еще, если при «тихой» установке функция NextButtonClick вернет False, то установка автоматически завершится.

Код

function BackButtonClick(CurPageID: Integer): Boolean;
 
Вызывается, когда пользователь нажимает кнопку <Назад>. Если функция вернет True, то мастер перейдет на предыдущую страницу, а если False – останется на текущей (заданной параметром CurPageID).

Код

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
 
А эта процедура вызывается, когда пользователь нажал кнопку <Отмена>. Параметр Cancel определяет, будет ли иметь место стандартный процесс отмены установки, по умолчанию значение параметра равно True. Параметр Confirm определяет, будет ли отображено окно подтверждения отмены установки, по умолчанию – True. Если параметр Cancel установлен False, то значение параметра Confirm игнорируется.

Код

function ShouldSkipPage(PageID: Integer): Boolean;
 
Мастер установки вызывает эту функцию, чтобы определить нужно или нет пропускать страницу, заданную параметром PageID. Если функция вернет True, страница будет пропущена, а если False – страница будет отображена. Обратите внимание, чо эта функция не вызывается ни для страниц wpWelcome, wpPreparing и wpInstalling, ни для страниц, которые как уже определил мастер должны быть пропущены (например, страница wpSelectComponents при установке не содержащей компонентов (components)).

Давайте вернемся к нашему примеру. Там в секции [Files] есть такая строчка:
Код

InfoBeforeFile=Readme.txt

Здесь мы задаем файл, текст которого будет отображен перед выбором папки установки. Давайте напишем такую функцию ShouldSkipPage, которая бы заставляла мастер установки пропускать страницу, отображающую этот файл. 
Код

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  case PageID of
    wpInfoBefore:
      Result := True;
    else
      Result := False;
  end;
end; 

Полный код примера находится в файле Examples\example02.iss

Теперь, как Вы можете убедится запустив мастер, соответствующая страничка не отображается. (Конечно, это лишь учебный пример, цель которого – показать реализацию еще одного обработчика событий. Куда более логичным решением было бы просто убрать строчку InfoBeforeFile=Readme.txt из нашего файла).

Код

procedure CurPageChanged(CurPageID: Integer);
 
Вызывается после того, как отображается новая страница (заданная параметром CurPageID).

Код

function CheckPassword(Password: String): Boolean;
 
Если в секции [Сode] будет обнаружен это обработчик, то мастер отобразит страница ввода пароля (Password page) и вызовет этот обработчик для проверки правильности ввода. Верните True, если пароль введен верно и False в ином случае. Введенный пользователем пароль передается через параметр Password. 
    Итак, можно было бы написать что-нибудь типа:
Код

function CheckPassword(Password: String): Boolean;
begin
  if Password = '120885' then
    Result := True;
end;

    Но тут есть одно НО! Разработчик Inno Setup настоятельно рекомендует не хранить сам пароль, а использовать сравнение по хеш-сумме. Для этого необходимо самому вычислить MD5 хеш-сумму пароля, а затем сравнить значение GetMD5OfString(Password) с этим значением. При таком подходе фактическое значение пароля остается защищенным.
Код

function CheckPassword(Password: String): Boolean;
begin
  if GetMD5OfString(Password) = '057667becf2d6f53a5cb71f24fdd11b4' then
    Result := True;
end;

Полный код примера находится в файле Examples\example03.iss

Для получения MD5 хеш-суммы Вы можете воспользоваться небольшой программкой, которая находится здесь – MD5.exe.

Код

function NeedRestart(): Boolean;
 
Верните True и мастер установки выведет запрос на перезагрузку по завершению успешной установки, если вернете False – не запросит.

Код

function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo,  MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String):String; 

Если программа установки обнаружит этот обработчик, он будет вызван, когда страничка Все готово к установке (Ready to Install) станет активной. Здесь необходимо вернуть текст, который Вы хотите отобразить в текстовом поле на этой страничке. Возвращаемое значение – одна строка, однако при отображении мастер будет использовать в качестве разделителя строк параметр NewLine. Параметр Space содержит строку, состоящую из пробелов. Мастер использует ее для создания абзацных отступов. А что же выводить? Предназначено это окно для вывода суммарной информации о параметрах установки. Я думаю, Вы часто с таким сталкивались. Собственно оставшиеся параметры и содержат ту информацию, которую программа установки может использовать для отображения каких-либо сведений. Например, параметр MemoDirInfo – строка, содержащая путь к папке установки.
Код

function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, 
MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String):String;
begin
  Result := MemoUserInfoInfo + NewLine + NewLine;
  Result := Result + MemoDirInfo;
end;

Полный код примера находится в файле Examples\example04.iss

Здесь я вывожу информацию о пользователе и папке установки:
user posted image


Обратите внимание, что я добавил в секцию [Setup] строчку:
Код

UserInfoPage=yes

которая заставляет программу установку отобразить страничку данных о пользователе:
user posted image


Код

procedure RegisterPreviousData(PreviousDataKey: Integer); 

To store user settings entered on custom wizard pages, place a RegisterPreviousData event function in the Pascal script and call SetPreviousData(PreviousDataKey, ...) inside it, once per setting.

Код

function CheckSerial(Serial: String): Boolean; 

If Setup finds the CheckSerial event function in the Pascal script, a serial number field will automatically appear on the User Info wizard page (which must be enabled using UserInfoPage=yes in your [Setup] section!). Return True to accept the serial number and False to reject it. When using serial numbers, it's important to keep in mind that since no encryption is used and the source Сode to Inno Setup is freely available, it would not be too difficult for an experienced individual to remove the serial number protection from an installation. Use this only as a convienience to the end user and double check the entered serial number (stored in the {userinfoserial} constant) in your application.

Код

function GetCustomSetupExitСode: Integer; 

Верните значение не равное нулю Return a non zero number to instruct Setup to return a custom exit Сode. This function is only called if Setup was successfully run to completion and the exit Сode would have been 0. Also see Setup Exit Сodes. 

3.2. Обработчики событий удаления (Uninstall Event Functions)

Аналогичны соответствующим обработчикам событий установки.

Код

function InitializeUninstall(): Boolean;
 
Верните False, чтобы прекратить удаление, True – чтобы продолжить.

Код

procedure DeinitializeUninstall(); 

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);

Код

function UninstallNeedRestart(): Boolean; 

Верните True и мастер удаления выведет запрос на перезагрузку по завершению успешного удаления, если вернете False – не запросит.

3.3. Константы

Здесь привен список констант, используемых в вышеупомянутых процедурах и функциях:
  • CurStep: ssInstall, ssPostInstall, ssDone
  • CurUninstallStep: usAppMutexCheck, usUninstall, usPostUninstall, usDone
  • CurPageID: wpWelcome, wpLicense, wpPassword, wpInfoBefore, wpUserInfo, wpSelectDir, wpSelectComponents, wpSelectProgramGroup, wpSelectTasks, wpReady, wpPreparing, wpInstalling, wpInfoAfter, wpFinished

4. Скриптовые константы (Scripted Constants)

Pascal-скрипт может содержать функции, которые вызываются, когда программе установки необходимо получит значение скриптовой константы (scripted constant). В отличие от обычных констант они обозначаются с использованием слова Сode. Синтаксис объявления такой константы следующий: 

{Сode:FunctionName|Param}

где:
  • FunctionName – имя вызываемой функции;
  • Param – строковый параметр, который передается вызываемой функции. Если он будет опущен, вызываемой функции будет передана пустая строка;
  • если Вам необходимо передать строку, содержащую запятую, символ "|" или "}", то необходимо использовать формат "%-encoding". Т.е. нужно заменить указанные символы на знак процента ("%") с указанием хеш-кода символа из двух цифр. Запятая при такой записи – "%2c", символ "|" – "%7c", а символ "}" – "%7d";
  • параметр Param может содержать обычные константы, которые заключаются в {}. Обратите внимание, что в данном случае символ "}" заменять на "%7d" не следует!

Давайте рассмотрим пример. В секции [Setup] у нас имеется следующая строка, содержащая обычную константу:
Код

DefaultDirName={pf}\My Program

Давайте заменим константу {pf} на скриптовую. В секции [Setup] изменим соответствующую строка следующим образом:
Код

DefaultDirName= {Сode:MyConst}\My Program

А в секции [Сode] опишем функцию MyConst:
Код

function MyConst(Param: String): String;
begin
  Result := ExpandConstant('{pf}');
end;

Полный код примера находится в файле Examples\example05.iss

Если функция, указанная после слова  Сode не присутствует в секции [Сode], она должна быть одной из поддерживаемых функций, полный список которых Вы можете найти в справке Inno Setup на странице Pascal Scripting: Support Functions Reference.

5. Check-парметры (Check Parameters)

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

В секции [Files] в строку 
Код

Source: "MyProg.exe"; DestDir: "{app}";

добавим сheck-параметр:
Код

Source: "MyProg.exe"; DestDir: "{app}"; Check: MyProgCheck;

А в секции [Сode] опишем функцию MyProgCheck:
Код

function MyProgCheck(): Boolean;
begin
  Result := MsgBox('Хотите установить MyProg.exe в ' + ExtractFilePath(CurrentFileName) + '?', mbConfirmation, MB_YESNO) = idYes;
end;

Полный код примера находится в файле Examples\example06.iss

Итак, нужно соблюдать следующие правила:
  • после ключевого слова Check нужно указать имя функции, возвращающей значение типа Boolean. В качестве функции можно использовать свою собственную или одну из поддерживаемых.
  • вместо одного имени функции можно использовать логическое выражение, содержащее несколько имен функций. Поддерживаются следующие логические операторы: and, not и or.
  • check-функция (check function) может содержать список параметров, разделенных запятыми. Разрешены параметры следующих типов String, Integer и Boolean. Строковые параметры могут включать константы.
  • кроме того есть одна функция, которая может быть помешена в список параметров: ExpandConstant.

    Все check-функции должны возвращать результат типа Boolean. Если функция вернет True, то действие соответствующее элементу с данным check-параметром будет выполнено, а если False – действие будет пропущено. 
    Да и вот еще что. Программа установки будет вызывать каждую check-функцию несколько раз, даже если всего один элемент какой-либо секции ее использует. Если Ваша check-функция выполняет большой объем работы, можно оптимизировать код посредством хранения результата вызова в глобальной переменной.
    Учтите, что check-функция не будет вызвана для тех элементов, для которых программа установки уже определила отсутствие необходимости в исполнении.
    Что ж, давайте рассмотрим более сложный пример. В секции [Files] несколько изменим все ту же строчку:

Код

Source: "MyProg.exe"; DestDir: "{app}"; Check: MyProgCheck or MyDirCheck(ExpandConstant('{app}'));


Здесь как можно видеть использовано логическое выражение, вызов check-функции с параметрами и функция ExpandConstant.

Теперь опишем функцию MyDirCheck в секции [Сode]:
Код

function MyDirCheck(DirName: String): Boolean;
begin
  Result := DirExists(DirName);
end;

Здесь мы просто проверяем наличие папки, имя которой передано в качестве параметра. Да и еще давайте изменим функцию MyProgCheck:
Код

function MyProgCheck(): Boolean;
begin
  if not MyProgChecked then
    begin
      MyProgCheckResult := MsgBox('Хотите установить MyProg.exe в ' +    >
      ExtractFilePath(CurrentFileName) + '?', mbConfirmation, MB_YESNO)= > 
      idYes;
      MyProgChecked := True;
    end;
  Result := MyProgCheckResult;
end;

Переменные MyProgChecked и MyProgCheckResult я объявил в блоке var в самом начале секции [Сode] (т.о. это глобальные переменные).
Код

var
  MyProgChecked: Boolean;
  MyProgCheckResult: Boolean;

Полный код примера находится в файле Examples\example07.iss

Первая переменная указывает на то, была ли уже совершена проверка или это первый вызов нашей функции. Вторая – хранит результат этого вызова.

6. Параметры BeforeInstall и AfterInstall

Существуют еще 2 дополнительных параметра, которые поддерживают все секции, чьи элементы могут содержать параметры, за исключением секций [Types][Components] и [Tasks]. Синтаксис аналогичен таковому для check-параметров.

Код

[Files]
Source: "MyProg.exe"; DestDir: "{app}"; BeforeInstall: MyBeforeInstall;


Итак:
  • после ключевого слова BeforeInstall нужно указать имя процедуры. В этом коренное отличие от параметров check. Здесь вызываемая подпрограмма не может возвращать значения. В качестве процедуры можно использовать свою собственную или одну из поддерживаемых.
  • очевидно, что нельзя использовать логические операторы, т.к. вызываются процедуры, а не функции;
  • процедура может содержать список параметров, разделенных запятыми. Разрешены параметры следующих типов String, Integer и Boolean. Строковые параметры могут включать константы.
  • кроме того есть одна функция, которая может быть помешена в список параметров: ExpandConstant.

Пример:
Код

procedure MyBeforeInstall();
begin
  MsgBox('MyProg.exe будет установлен в ' + ExtractFilePath(CurrentFileName) + '?', mbConfirmation, MB_OK);
end;

Полный код примера находится в файле Examples\example08.iss

Все вышесказанное относится и к параметрам AfterInstall. 

Вызываются данные процедуры до и после выполнения соответствующего элемента секции.

Учтите, что процедуры не будут вызваны для тех элементов, для которых программа установки уже определила отсутствие необходимости в исполнении.

 smile все пока. Не могу. Глаза слипаются....


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Poseidon
Дата 19.3.2008, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Отличная статья. Хоть и затрагивает более-менее подробно только секцию code, но это уже что-то. Хотя и в code не все возможности освещены smile Да и перевод не совсем "литературны". Так же не освещено создание своей собственной страницы в инсталяторе. Как кнопку поместить, как надпись. Хотя это есть и в стандартных примерах. Но в общем не плохо ;-)

Возьму на себя ответственность и выложу перевод не переведенных участков:

Код

procedure RegisterPreviousData(PreviousDataKey: Integer); 

Для сохранения настроек пользователя при выборочной установке, следует использовать функцию RegisterPreviousData в Pascal-скрипте и в ней вызвать SetPreviousData(PreviousDataKey, ...).

Код

function CheckSerial(Serial: String): Boolean; 

Если инсталлятор обнаружит функцию CheckSerial в Pascal-скрипте, поле серийного номера на странице Информация о пользователе автоматически заполнится (при этом директива UserInfoPage секции [Setup] должна быть равна yes). Возвращает True при вводе правильного серийного номера и False при вводе неправильного. При использовании серийных номеров следует помнить, что исходный код Inno Setup свободно доступен и опытному пользователю не составит труда обойти защиту серийным номером при установке. Используйте функцию только для повторной проверки введенного серийного номера (константы {userinfoserial}) вашего приложения.

Код

function GetCustomSetupExitСode: Integer; 

Возвращает ненулевое значение для того, чтобы инсталлятор выбал код выхода. Эта функция вызывается только если инсталлятор успешно выполнил всю установку и код выхода 0. Смотрите также Коды выхода инсталлятора. 
Ну и добавлю эти самые коды:
Цитата
Коды выхода инсталлятора

Начиная с Inno Setup 3.0.3 программа-инсталлятор может возвращать следующие коды выхода:

0 Установка успешно завершена.

1 Установка не инициализировалась.

2 Пользователь нажал Отмена до начала установки или выбрал Нет в окне "Эта программа установит...!.

3 Фатальная ошибка при подготовке перехода к следующей фазе установки (например, из-за отображения предустановочных страниц мастера во время самой установки). Такое случается редко, в основном из-за нехватки памяти или ресурсов системы.

4 Фатальная ошибка в процессе установки.

Обратите внимание: к этим ошибкам не относится диалог Прервать-Повторить-Пропустить. В случае, если пользователь при этом выберет Прервать, будет возвращен код выхода 5.

5 Пользователь нажал Отменить во время установки или выбрал Прервать в диалоге Прервать-Повторить-Пропустить.

6 Установка внезапно прервалась отладчиком (в IDE было использовано Run | Terminate). 

Перед кодами выхода 1, 3 или 4 обычно появляется сообщение об ошибке, описывающее ее. 

Новые версии Inno Setup могут выдавать дополнительные коды выхода, поэтому приложения, проверяющие их, могут вести себя по-разному в зависимости от полученного кода выхода. Все ненулевые коды выхода значат, что инсталлятор не завершил установку успешно.


Еще хотелосm бы добавить, что если что-то не умеет Inno, то можно это сделать в среде разработки (Delphi, C) и создать там dll. А уже эту dll подключать в код Inno и использовать. Зачастую это относится к системным функциям. (Например в Inno нельзя получить сетевое имя компьютера, зато можно на Delphi написать соответствующую функцию, заключить ее в dll и эту dll использовать в коде Inno).

Это сообщение отредактировал(а) Poseidon - 19.3.2008, 10:03


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
VICTAR
Дата 19.3.2008, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



Я так понимаю, если появилась данная статья, то существует некоторая нехватка в документации.
У меня есть русский help + faq. При надобности могу выложить.
PM MAIL   Вверх
Poseidon
Дата 19.3.2008, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



faq интересно было бы почитать...


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
VICTAR
Дата 19.3.2008, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



Вот, пользуйтесь)


Присоединённый файл ( Кол-во скачиваний: 155 )
Присоединённый файл  IS5HLP.7z 114,37 Kb
PM MAIL   Вверх
Akella
Дата 22.3.2008, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Здесь лежит мой русскоязычный перевод полностью всех сообщений
http://forum.vingrad.ru/forum/topic-175626...inno/index.html
PM MAIL   Вверх
Akella
Дата 4.11.2008, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Приветствую. Нужно запустить установку программы во время текущей установки.
Запустить требуется с двумя параметрами. Например:
{tmp}\prog1.exe
и два параметра
1. /silent
2. /rfr=kvart_xprs

Так вот. В Install Run прописал экзешник, в строке Parameters 2 параметра: /silent /rfr=kvart_xprs
Программа устанавливается. Но как бы без параметров.
Дело в Inno или в установке которая запускается во время основной установки?
PM MAIL   Вверх
Akella
  Дата 21.11.2008, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Подскажите, как добавить форму, где будет расположен чекбокс. Если чекбокс отмечен, то запускается вшитая в основной дистрибутив установка др. программы.

Это сообщение отредактировал(а) Akella - 21.11.2008, 16:50
PM MAIL   Вверх
Akella
Дата 25.11.2008, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Помогите довести этот код до ума:
Код

procedure CreateTheWizardPages;
var
  Page: TWizardPage;
  CheckBox: TNewCheckBox;
begin
  Page := CreateCustomPage(wpWelcome, 'Установка дополнительных компонент', 'Нажмите Далее для продолжения');

  CheckBox := TNewCheckBox.Create(Page);
  //CheckBox.Top := Button.Top + Button.Height + ScaleY(8);
  CheckBox.Width := Page.SurfaceWidth;
  CheckBox.Height := ScaleY(17);
  CheckBox.Caption := 'Установить дополнительную программу';
  CheckBox.Checked := True;
  CheckBox.Parent := Page.Surface;

  Page.NextButtonClick := @NextButtonClick;
end;

function NextButtonClick(Page: TWizardPage): Boolean;
begin
  if Page.CheckBox.Checked then begin
    exec(Uninstall,{tmp}\install2.exe /silence /rfr=kvart_xprs, SW_HIDE, ewWaitUntilTerminated, ResultCode)

  end;
end;


procedure InitializeWizard();
begin
  { Custom wizard pages }

  CreateTheWizardPages;

end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpWelcome then
  WizardForm.NextButton.OnClick(WizardForm.NextButton);
end;


PM MAIL   Вверх
Akella
Дата 26.11.2008, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



kemiisto, спасибо за помощь.
Выродили такой код:

Код

var
  CheckPage: TInputOptionWizardPage;

procedure InitializeWizard;
begin
  CheckPage := CreateInputOptionPage(wpInstalling, 'Название программы', 'Доп. надпись', 'доп. надпись', False, False);
  CheckPage.Add('текст чекбокса');
end;

function NextButtonClick(CurPageID: Integer): Boolean;
var
  I: Integer;
begin
  if CurPageID = CheckPage.ID then
    if CheckPage.Values[0] then begin

      Exec(ExpandConstant('{tmp}\MyProg.exe'),
           '/param1 /param2',
           ExpandConstant('{tmp}'),
           SW_HIDE,
           ewWaitUntilIdle,
           i);
    end;
  Result := True;
end;

PM MAIL   Вверх
Akella
Дата 4.3.2010, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



При запуске моего инсталлятора выдаётся надпись: издатель: неизвестный издатель
Как вставить другой свой текст, вместо неизвестный издатель?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1527 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.