![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
kemiisto |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 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). Вот лишь некоторые примеры:
Естественно, что для отладки скриптов доступен интегрированный отладчик времени исполнения. Машина сценариев (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] и напишите там следующее:
Полный код примера находится в файле Examples\example01.iss Что здесь что?
Что ж, как и обещали разработчики действительно Delphi-like! А что же мы получим? Смело жмем на запуск и видим наше окно сообщений (рис. 1): ![]() Если выбрать <Да>, то установка продолжится, а если <Нет> - увидим прощальное сообщение и установка прекратится. Полный список поддерживаемых функций (в нашем примере мы использовали только одну - MsgBox) Вы можете найти в справке Inno Setup на странице Pascal Scripting: Support Functions Reference. Их там великое множество и я не буду их описывать, тем более, что любому знакомому с Delphi и аглийским языком понять назначение каждой из них будет крайне просто. А вот полный список обработчиков событий с краткими пояснениями, пожалуй, приведу. 3.1. Обработчики событий установки (Setup Event Functions)
Вызывается во время инициализации установки. Если функция вернет False, то установка прекратится, а если True – продолжится.
Используйте для внесения изменений в мастере установки при запуске. Коренным отличием от предыдущего метода является то, что здесь можно вносить изменения в вид страничек мастера установки. Функция InitializeSetup для этого не подходит, т.к. к моменту ее вызова форма мастера установки еще не существует.
Вызывается непосредственно пред выходом из мастера установки. Обратите внимание, что эта процедура вызывается даже в том случае, когда пользователь вышел из программы установки до того, как что-либо было установлено.
Эту процедуру Вы можете использовать для выполнения собственных задач до и после установки (pre-install and post-install tasks). Параметр CurStep может принимать следующие значения: ssInstall – тогда код процедуры будет выполнен непосредственно перед началом установки; ssPostInstall – тогда код процедуры будет выполнен после окончания установки; ssDone – тогда код процедуры будет выполнен перед выходом из мастера после успешной установки.
Вызывается, когда пользователь нажимает кнопку <Далее>. Если функция вернет True, то мастер перейдет на следующую страницу, а если False – останется на текущей (заданной параметром CurPageID). Обратите внимание, что эта функция будет вызвана и в режиме «тихой» установки (silent install), хотя и кнопку <Далее> пользователь вряд ли нажмет J. Программа установки просто сымитирует нажатие клавиши. И еще, если при «тихой» установке функция NextButtonClick вернет False, то установка автоматически завершится.
Вызывается, когда пользователь нажимает кнопку <Назад>. Если функция вернет True, то мастер перейдет на предыдущую страницу, а если False – останется на текущей (заданной параметром CurPageID).
А эта процедура вызывается, когда пользователь нажал кнопку <Отмена>. Параметр Cancel определяет, будет ли иметь место стандартный процесс отмены установки, по умолчанию значение параметра равно True. Параметр Confirm определяет, будет ли отображено окно подтверждения отмены установки, по умолчанию – True. Если параметр Cancel установлен False, то значение параметра Confirm игнорируется.
Мастер установки вызывает эту функцию, чтобы определить нужно или нет пропускать страницу, заданную параметром PageID. Если функция вернет True, страница будет пропущена, а если False – страница будет отображена. Обратите внимание, чо эта функция не вызывается ни для страниц wpWelcome, wpPreparing и wpInstalling, ни для страниц, которые как уже определил мастер должны быть пропущены (например, страница wpSelectComponents при установке не содержащей компонентов (components)). Давайте вернемся к нашему примеру. Там в секции [Files] есть такая строчка:
Здесь мы задаем файл, текст которого будет отображен перед выбором папки установки. Давайте напишем такую функцию ShouldSkipPage, которая бы заставляла мастер установки пропускать страницу, отображающую этот файл.
Полный код примера находится в файле Examples\example02.iss Теперь, как Вы можете убедится запустив мастер, соответствующая страничка не отображается. (Конечно, это лишь учебный пример, цель которого – показать реализацию еще одного обработчика событий. Куда более логичным решением было бы просто убрать строчку InfoBeforeFile=Readme.txt из нашего файла).
Вызывается после того, как отображается новая страница (заданная параметром CurPageID).
Если в секции [Сode] будет обнаружен это обработчик, то мастер отобразит страница ввода пароля (Password page) и вызовет этот обработчик для проверки правильности ввода. Верните True, если пароль введен верно и False в ином случае. Введенный пользователем пароль передается через параметр Password. Итак, можно было бы написать что-нибудь типа:
Но тут есть одно НО! Разработчик Inno Setup настоятельно рекомендует не хранить сам пароль, а использовать сравнение по хеш-сумме. Для этого необходимо самому вычислить MD5 хеш-сумму пароля, а затем сравнить значение GetMD5OfString(Password) с этим значением. При таком подходе фактическое значение пароля остается защищенным.
Полный код примера находится в файле Examples\example03.iss Для получения MD5 хеш-суммы Вы можете воспользоваться небольшой программкой, которая находится здесь – MD5.exe.
Верните True и мастер установки выведет запрос на перезагрузку по завершению успешной установки, если вернете False – не запросит.
Если программа установки обнаружит этот обработчик, он будет вызван, когда страничка Все готово к установке (Ready to Install) станет активной. Здесь необходимо вернуть текст, который Вы хотите отобразить в текстовом поле на этой страничке. Возвращаемое значение – одна строка, однако при отображении мастер будет использовать в качестве разделителя строк параметр NewLine. Параметр Space содержит строку, состоящую из пробелов. Мастер использует ее для создания абзацных отступов. А что же выводить? Предназначено это окно для вывода суммарной информации о параметрах установки. Я думаю, Вы часто с таким сталкивались. Собственно оставшиеся параметры и содержат ту информацию, которую программа установки может использовать для отображения каких-либо сведений. Например, параметр MemoDirInfo – строка, содержащая путь к папке установки.
Полный код примера находится в файле Examples\example04.iss Здесь я вывожу информацию о пользователе и папке установки: ![]() Обратите внимание, что я добавил в секцию [Setup] строчку:
которая заставляет программу установку отобразить страничку данных о пользователе: ![]()
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.
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.
Верните значение не равное нулю 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) Аналогичны соответствующим обработчикам событий установки.
Верните False, чтобы прекратить удаление, True – чтобы продолжить.
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
Верните True и мастер удаления выведет запрос на перезагрузку по завершению успешного удаления, если вернете False – не запросит. 3.3. Константы Здесь привен список констант, используемых в вышеупомянутых процедурах и функциях:
4. Скриптовые константы (Scripted Constants) Pascal-скрипт может содержать функции, которые вызываются, когда программе установки необходимо получит значение скриптовой константы (scripted constant). В отличие от обычных констант они обозначаются с использованием слова Сode. Синтаксис объявления такой константы следующий: {Сode:FunctionName|Param} где:
Давайте рассмотрим пример. В секции [Setup] у нас имеется следующая строка, содержащая обычную константу:
Давайте заменим константу {pf} на скриптовую. В секции [Setup] изменим соответствующую строка следующим образом:
А в секции [Сode] опишем функцию MyConst:
Полный код примера находится в файле Examples\example05.iss Если функция, указанная после слова Сode не присутствует в секции [Сode], она должна быть одной из поддерживаемых функций, полный список которых Вы можете найти в справке Inno Setup на странице Pascal Scripting: Support Functions Reference. 5. Check-парметры (Check Parameters) Существует дополнительный параметр, который поддерживают все секции, чьи элементы могут содержать параметры. Это параметр Check. Синтаксис этого параметра разберем на примере. В секции [Files] в строку
добавим сheck-параметр:
А в секции [Сode] опишем функцию MyProgCheck:
Полный код примера находится в файле Examples\example06.iss Итак, нужно соблюдать следующие правила:
Все check-функции должны возвращать результат типа Boolean. Если функция вернет True, то действие соответствующее элементу с данным check-параметром будет выполнено, а если False – действие будет пропущено. Да и вот еще что. Программа установки будет вызывать каждую check-функцию несколько раз, даже если всего один элемент какой-либо секции ее использует. Если Ваша check-функция выполняет большой объем работы, можно оптимизировать код посредством хранения результата вызова в глобальной переменной. Учтите, что check-функция не будет вызвана для тех элементов, для которых программа установки уже определила отсутствие необходимости в исполнении. Что ж, давайте рассмотрим более сложный пример. В секции [Files] несколько изменим все ту же строчку:
Здесь как можно видеть использовано логическое выражение, вызов check-функции с параметрами и функция ExpandConstant. Теперь опишем функцию MyDirCheck в секции [Сode]:
Здесь мы просто проверяем наличие папки, имя которой передано в качестве параметра. Да и еще давайте изменим функцию MyProgCheck:
Переменные MyProgChecked и MyProgCheckResult я объявил в блоке var в самом начале секции [Сode] (т.о. это глобальные переменные).
Полный код примера находится в файле Examples\example07.iss Первая переменная указывает на то, была ли уже совершена проверка или это первый вызов нашей функции. Вторая – хранит результат этого вызова. 6. Параметры BeforeInstall и AfterInstall Существуют еще 2 дополнительных параметра, которые поддерживают все секции, чьи элементы могут содержать параметры, за исключением секций [Types], [Components] и [Tasks]. Синтаксис аналогичен таковому для check-параметров.
Итак:
Пример:
Полный код примера находится в файле Examples\example08.iss Все вышесказанное относится и к параметрам AfterInstall. Вызываются данные процедуры до и после выполнения соответствующего элемента секции. Учтите, что процедуры не будут вызваны для тех элементов, для которых программа установки уже определила отсутствие необходимости в исполнении. ![]() -------------------- |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Poseidon |
|
||||||||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
Отличная статья. Хоть и затрагивает более-менее подробно только секцию code, но это уже что-то. Хотя и в code не все возможности освещены
![]() Возьму на себя ответственность и выложу перевод не переведенных участков:
Для сохранения настроек пользователя при выборочной установке, следует использовать функцию RegisterPreviousData в Pascal-скрипте и в ней вызвать SetPreviousData(PreviousDataKey, ...).
Если инсталлятор обнаружит функцию CheckSerial в Pascal-скрипте, поле серийного номера на странице Информация о пользователе автоматически заполнится (при этом директива UserInfoPage секции [Setup] должна быть равна yes). Возвращает True при вводе правильного серийного номера и False при вводе неправильного. При использовании серийных номеров следует помнить, что исходный код Inno Setup свободно доступен и опытному пользователю не составит труда обойти защиту серийным номером при установке. Используйте функцию только для повторной проверки введенного серийного номера (константы {userinfoserial}) вашего приложения.
Возвращает ненулевое значение для того, чтобы инсталлятор выбал код выхода. Эта функция вызывается только если инсталлятор успешно выполнил всю установку и код выхода 0. Смотрите также Коды выхода инсталлятора. Ну и добавлю эти самые коды:
Еще хотелосm бы добавить, что если что-то не умеет Inno, то можно это сделать в среде разработки (Delphi, C) и создать там dll. А уже эту dll подключать в код Inno и использовать. Зачастую это относится к системным функциям. (Например в Inno нельзя получить сетевое имя компьютера, зато можно на Delphi написать соответствующую функцию, заключить ее в dll и эту dll использовать в коде Inno). Это сообщение отредактировал(а) Poseidon - 19.3.2008, 10:03 -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
||||||||
|
|||||||||
VICTAR |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1108 Регистрация: 6.10.2006 Репутация: 37 Всего: 80 |
Я так понимаю, если появилась данная статья, то существует некоторая нехватка в документации.
У меня есть русский help + faq. При надобности могу выложить. |
|||
|
||||
Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
faq интересно было бы почитать...
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
VICTAR |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1108 Регистрация: 6.10.2006 Репутация: 37 Всего: 80 |
||||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Здесь лежит мой русскоязычный перевод полностью всех сообщений
http://forum.vingrad.ru/forum/topic-175626...inno/index.html |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Приветствую. Нужно запустить установку программы во время текущей установки.
Запустить требуется с двумя параметрами. Например: {tmp}\prog1.exe и два параметра 1. /silent 2. /rfr=kvart_xprs Так вот. В Install Run прописал экзешник, в строке Parameters 2 параметра: /silent /rfr=kvart_xprs Программа устанавливается. Но как бы без параметров. Дело в Inno или в установке которая запускается во время основной установки? |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Подскажите, как добавить форму, где будет расположен чекбокс. Если чекбокс отмечен, то запускается вшитая в основной дистрибутив установка др. программы.
Это сообщение отредактировал(а) Akella - 21.11.2008, 16:50 |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Помогите довести этот код до ума:
|
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
kemiisto, спасибо за помощь.
Выродили такой код:
|
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
При запуске моего инсталлятора выдаётся надпись: издатель: неизвестный издатель
Как вставить другой свой текст, вместо неизвестный издатель? |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |