Ru-Board.club
← Вернуться в раздел «Программы»

» Inno Setup (создание инсталяционных пакетов)

Автор: Genri
Дата сообщения: 20.06.2008 16:06
boss911 -- если файлы на этапе компиляции присутствуют, то можно через препроцессор. Иначе - через секцию код.
Попробую найти время и набросать пример.


Добавлено:
[more=Использование препроцессора][Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[Files]
Source: ResFiles\*.txt; DestDir: {app}\ResFiles

[Run]
#define FindHandle
#define FindResult
#define Mask ".\ResFiles\*.txt"

#sub ProcessFoundFile
#define FileName FindGetFileName(FindHandle)
;Filename: ResHacker\RESHacker.exe; WorkingDir: {app}; Parameters: -script ResFiles\{#FileName}; Flags: waituntilterminated shellexec
Filename: {sys}\notepad.exe; WorkingDir: {app}; Parameters: ResFiles\{#FileName}; Flags: waituntilterminated
#endsub

#for {FindHandle = FindResult = FindFirst(Mask, 0); FindResult; FindResult = FindNext(FindHandle)} ProcessFoundFile
[/more]
Автор: boss911
Дата сообщения: 20.06.2008 17:18
valeron87

Что-то не вышло, а также сдалось такое впечатление, что команда выполнялась после каждой распаковки объекта, постоянно при распаковки менялись по очередности режимы "Распаковка файлов" и "Модификация файла...". Даже "{app}\ResHacker\RESHacker.exe" еще не распаковался.

Мне вообще-то надо так:

Код: Source: ResFiles\*; DestDir: {app}\ResFiles; Flags: recursesubdirs createallsubdirs; AfterInstall: ApplyScript
Автор: 999Kay666
Дата сообщения: 20.06.2008 17:28
Genri

Цитата:
...а как и какой из них тебе "удобнее" применять - разбирайся сам. ...больше ничем помочь не смогу.

УЖЕ помог, за что огромное спасисбо!!! Разобрался и решил - ты прав, полностью обездвиживать не стал.

Цитата:
....Без удовлетворительного объяснения причин такого

Зачем же так зря. Я же написал как в игре "Сибирь" - InctallShield. Т.е. Всё как обычно, но страница Инсталляции прямоугольная в уголке.

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID=wpInstalling
then
begin
WizardForm.MainPanel.Visible:=False;
WizardForm.Bevel1.Visible:=False;
WizardForm.Width:=ScaleX(395);
WizardForm.Height:=ScaleY(142);

WizardForm.Left:=ScaleX(MainForm.Width-420);
WizardForm.Top:=ScaleY(MainForm.Height-170);
begin
SetWindowLong(WizardForm.Handle, GWL_STYLE,
GetWindowLong(WizardForm.Handle, GWL_STYLE) and not WS_CAPTION);
end

WizardForm.InnerNotebook.Left:=ScaleX(10);
WizardForm.InnerNotebook.Top:=ScaleY(10);
WizardForm.InnerNotebook.Width:=ScaleX(370);
WizardForm.StatusLabel.Left:=ScaleX(0);
WizardForm.StatusLabel.Top:=ScaleY(0);
и т.д.
Спасибо!
P.S. Интересно можно было бы сделать проще?

И Генри, если не сложно - как сделать: При выборе определённого компонента, кнопка становится с надписью "Далее", и я перехожу на следующую(уже написанную мной) страницу. Если компонент не выбран, то на кнопке написано "Установить".
Автор: boss911
Дата сообщения: 20.06.2008 17:31
Genri

С твоим кодом компиляция спотыкается на

Код: [Run]
#define FindHandle
Автор: Genri
Дата сообщения: 20.06.2008 18:20
boss911 -- спотыкается вероятно из-за того, что у тебя не установлен препроцессор (смотри на сайте Inno Setup QuickStart Pack)
Блокнот только для демонстрации. Строку с блокнотом закомментируй или удали; в строке с RESHacker комментарий удали.

999Kay666 -- что из себя представляет игра Сибирь - мне неизвестно (из игр я только первый орион знаю )

По поводу кнопки: можно Я так понимаю, речь идет о кнопке на странице выбора компонентов? И если этот конкретный компонент не выбран, то по нажатию на кнопку "Установить" сразу начинается установка? В принципе можно и так. Но проще в этом случае пропустить ненужные страницы и попасть на страницу wpReady, на которой кнопка "Установить" отображается штатным образом.
Автор: boss911
Дата сообщения: 20.06.2008 19:07
Genri

Цитата:
(смотри на сайте Inno Setup QuickStart Pack)

И что мне тут нужно? Препроцессора не вижу.


Цитата:
в строке с RESHacker комментарий удали.

При компиляции из ISTool комментарий сам прописывается, что за...
А если помимо запусков "{app}ResHacker\RESHacker.exe" у меня есть другие команды (их несколько) выполнения, куда их прописывать, можно заместь строки с блокнотом? А поочередность выполнения, какая будет, по списку?

Добавлено:
Препроцессор нашел.

Добавлено:
Genri

Код: [Run]
#define FindHandle
#define FindResult
#define Mask "ResFiles\*.txt"

#sub ProcessFoundFile
#define FileName FindGetFileName(FindHandle)
Filename: {app}\ResHacker\RESHacker.exe; WorkingDir: {app}; Parameters: -script ResFiles\{#FileName}; StatusMsg: Модификация файлов... Процесс может занять 2 минуты.; Flags: waituntilterminated
Filename: {sys}\cmd.exe; Parameters: "/C RD /Q /S ""{app}\ResFiles"""; WorkingDir: {sys}; StatusMsg: Завершение установки; Flags: waituntilterminated runhidden
#endsub

#for {FindHandle = FindResult = FindFirst(Mask, 0); FindResult; FindResult = FindNext(FindHandle)} ProcessFoundFile
Автор: Genri
Дата сообщения: 20.06.2008 21:44
boss911 -- выше ты спрашивал, как свести в одну команду Filename: ResHacker\RESHacker.exe... Теперь у тебя две команды (...RESHacker.exe и ...cmd.exe).
Все, что между строками:
#define FileName FindGetFileName(FindHandle)
......................
#endsub
...будет повторяться столько раз, сколько будет найдено файлов *.txt
Все, что надо запускать в этой секции до повторяющихся строк, прописывай в самом начале (до строки #define FindHandle)
Все, что надо запускать в этой секции после повторяющихся строк, прописывай после строки #for {FindHandle = FindResult = FindFirst(Mask, 0); FindResult.....
Автор: defrager1
Дата сообщения: 20.06.2008 21:45
Jordan добавил ISSkin (isskin.codejock.com) на свою 3rdparty страницу . Предлагаю добавить и в Шапку. Классная вещь.
Автор: 999Kay666
Дата сообщения: 20.06.2008 22:26
Genri

Цитата:
По поводу кнопки: можно

Да,да всё правильно. Толь один нюанс - я перехожу на следующую(уже написанную мной) страницу.
Знаешь как?
Автор: Genri
Дата сообщения: 20.06.2008 23:13
999Kay666

Цитата:
Толь один нюанс - я перехожу на следующую(уже написанную мной) страницу
-- каких-либо проблем из-за этого я не вижу. Для определения, пропускать страницу или нет, есть функция ShouldSkipPage (см. в хелпе Pascal Scripting: Event Functions); для проверки выбран ли компонент, есть функция IsComponentSelected (см. в хелпе Pascal Scripting: Support Functions Reference).
[more=Пример использования][Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[Types]
Name: "full"; Description: "Full installation"
Name: "compact"; Description: "Compact installation"
Name: "custom"; Description: "Custom installation"; Flags: iscustom

[Components]
Name: "program"; Description: "Program Files"; Types: full compact custom; Flags: fixed
Name: "help"; Description: "Help File"; Types: full
Name: "readme"; Description: "Readme File"; Types: full
Name: "readme\en"; Description: "English"; Flags: exclusive
Name: "readme\de"; Description: "German"; Flags: exclusive

[_Code]
var
Page1, Page2: TWizardPage;

Procedure InitializeWizard();
begin
Page1:= CreateCustomPage(wpSelectComponents, 'Custom wizard page 1', 'TButton');
Page2:= CreateCustomPage(Page1.ID, 'Custom wizard page 2', 'Others');
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
Case PageID of
Page1.ID,
Page2.ID: Result:= not IsComponentSelected('help');
end;
end;
[/more] (страницы пропускаются, если не выбран компонент Help File)
Автор: boss911
Дата сообщения: 21.06.2008 05:34
Genri

Спасибо, я уже догодался, методом тыка.

Цитата:
При компиляции из ISTool комментарий сам прописывается, что за...

Прокомментируешь?

Добавлено:
Видимо это происходит из-за того, что строка начинается с пробела.

Такой вопрос: препроцессор можно использовать для компиляции дистрибутивов и без его прямого назначение, то есть там, где он использоваться не будет или лучше им пользоваться для компиляции дистрибутивов там где он нужен, как в моем случае?



Добавлено:

Код: [Files]
Source: ResFiles\*; DestDir: {app}\ResFiles; Flags: deleteafterinstall
Автор: Genri
Дата сообщения: 21.06.2008 08:39
boss911

Цитата:
препроцессор можно использовать для компиляции дистрибутивов...
-- некорректная постановка вопроса, но если коротко, то да.


Цитата:
Как заставить удалить всю папку после установки?
-- добавить в код:

[Dirs]
Name: "{app}\ResFiles"; Flags: deleteafterinstall

Автор: boss911
Дата сообщения: 21.06.2008 16:46
Genri

Цитата:
некорректная постановка вопроса

Для компиляции тех дистров, где препроцессор использоваться не будет. Вот и спрашиваю: в таких случаях лучше юзать Inno без препроцессора или можно и с ним? Чтобы инсталлятор не выполнял лишних ему функций.


Цитата:
[Dirs]
Name: "{app}\ResFiles"; Flags: deleteafterinstall

Если бы так.

Код: [Dirs]
Name: {app}\ResFiles; Flags: deleteafterinstall

[Files]
Source: C:\Vista Pack 2.2\ResFiles\*; DestDir: {app}\ResFiles; Flags: recursesubdirs createallsubdirs deleteafterinstall
Автор: SotM
Дата сообщения: 21.06.2008 18:39
boss911

Цитата:
Вот и спрашиваю: в таких случаях лучше юзать Inno без препроцессора или можно и с ним? Чтобы инсталлятор не выполнял лишних ему функций.


Я тоже не могу понять твоей "нужды". А какая тебе разница если компилятор использует препроцессор или нет? Ты эту разницу разве видишь?!
Инсталлятор будет выполнять именно то, что ты ему скажешь, "лишнего" он ничего не будет делать. (за исключением инструкций по умолчанию).


Автор: boss911
Дата сообщения: 21.06.2008 19:16
SotM

Цитата:
Инсталлятор будет выполнять именно то, что ты ему скажешь, "лишнего" он ничего не будет делать. (за исключением инструкций по умолчанию).

Ответ получен, спасибо.

Так как же мне заставить удалятся всю папку с подкаталогами после установки? Почему не срабатывает способ с deleteafterinstall.
Автор: chelobey
Дата сообщения: 21.06.2008 20:22
вопрос в следующем. можно ли сделать на странице выбора компонентов "открывающиеся-закрывающиеся" списки. то есть при клике на компонент "разворачиваются" подкомпоненты. такое нашел и в NSIS, Setup Factory, а в Inno как?
да, по дефаулту списки "свернуты"
Автор: SotM
Дата сообщения: 21.06.2008 21:57
chelobey
Чтобы не было недопонимая приведи лучше скриншот того, что ты хочешь получить в результате.
Автор: serg_aka_lain
Дата сообщения: 22.06.2008 02:38
boss911

Цитата:
Так как же мне заставить удалятся всю папку с подкаталогами после установки?


Ну, в этом случае думаю безопасно будет использовать DelTree

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssDone then
begin
DelTree(ExpandConstant('{app}') + '\ResFiles', True, True, True);
end;
end;

з.ы. Похожая ситуация была, я прописывал все вложенные папки,
для секции Dirs других флагов нет кроме (deleteafterinstall uninsneveruninstall uninsalwaysuninstall) , ну и ещё пара флагов для работы с NTFS.
Так что DelTree проще.
Автор: Nekt
Дата сообщения: 22.06.2008 15:38
Помоигите
DestDir: {reg:HKLM\SOFTWARE\GSC Game World\STALKER-SHOC,InstallPath|{app}}\gamedata\config\;
такое прописываю, и если выбираю другую папку то ставят она в ту которая прописана в ключе реестра.
Как правильно?
Спасибо заранее.
Автор: boss911
Дата сообщения: 22.06.2008 15:41
serg_aka_lain

Работает. А можно сделать, чтобы оно дождалось удаления, после чего только закрывался инсталлятор, в моем случае переходит на страничку с просьбой перезагрузиться?
Автор: boss911
Дата сообщения: 22.06.2008 18:00
И еще такой вопрос: мне нужно удалить не одну папку, а две или более, будет ли правильно написать так (?):

Код: procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssDone then
begin
DelTree(ExpandConstant('{app}') + '\Folder1', True, True, True);
DelTree(ExpandConstant('{app}') + '\Folder2', True, True, True);
// и т.д.
end;
end
Автор: serg_aka_lain
Дата сообщения: 22.06.2008 19:11
boss911

Цитата:
чтобы оно дождалось удаления


Попробуй CurStep = ssPostInstall


Цитата:
Я проверил, так работает, но насколько это правильно.

- правильно.

Цитата:
{app}\Folder3\*.log
- а всю папку нельзя удалять, только .log(и)?,

если только логи, вот пример удаления по маске

DelTree(ExpandConstant('{app}') + '\Folder3\*.log', False, True, False);

Автор: Mitnadev
Дата сообщения: 22.06.2008 19:42
А как вообще определить какой инсталлер используется? Вот допустим Daemon Tools поледний, что там за инсталлер?
Автор: serg_aka_lain
Дата сообщения: 22.06.2008 20:10
Nekt

Цитата:
такое прописываю, и если выбираю другую папку то ставят она в ту которая прописана в ключе реестра.
Как правильно?


У Тебя это какой-то мод для Сталкера?
Если для установки нужна оригинальная игра, то проще (и надо) определять её наличие на этапе инициализации инсталлятора.


Mitnadev
Они всегда пользовались NSIS.

Автор: Nekt
Дата сообщения: 22.06.2008 20:30
serg_aka_lain каким образом? и как сделать что-бы если выбрал пользователь другую папку то в неё устанавливалось, все что нужно.
Автор: ChVL
Дата сообщения: 22.06.2008 20:36
Есть ли у Inno возможность работать с процессом в RAM?
Конкретнее: запущена программа, её процесс находится в памяти системы. Может ли Inno обратиться к нему и там сделать правки с помощью, например, секции [Cоde]? Надо что-то аналогичное функциям Delphi CreateProcess, ReadProcessMemory и WriteProcessMemory.
Автор: serg_aka_lain
Дата сообщения: 22.06.2008 21:01
Nekt

Не совсем понятно, нужна ли оригинальная игра. Если нет, то просто
DestDir: "{app}";
DestDir: "{app}\Path";
Автор: Nekt
Дата сообщения: 22.06.2008 21:46
мне надо по файленно, для каждого файла отдельная папка.
И нужна конечно определять где находится ориг игра, но давать возможность пользователю выбрать папку по желанию и установить в ние.
Автор: boss911
Дата сообщения: 22.06.2008 22:00
serg_aka_lain

Цитата:
DelTree(ExpandConstant('{app}') + '\Folder3\*.log', False, True, False);

То, что и надо было. Да, удалять нужно только файлы, то есть логи.


Цитата:
Попробуй CurStep = ssPostInstall

Попробовал заменить if CurStep = ssDone then на if CurStep = ssPostInstall, теперь не компилируется, спотыкается на нижней строке от if CurStep = ssPostInstall (begin).

Добавлено:


Метод тыка рулит!
Вот так теперь работает:

Код: procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
begin
DelTree(ExpandConstant('{app}') + '\Folder1', True, True, True);
DelTree(ExpandConstant('{app}') + '\Folder2', True, True, True);
DelTree(ExpandConstant('{app}') + '\Folder3\*.log', False, True, False);
end;
end;
Автор: serg_aka_lain
Дата сообщения: 22.06.2008 22:59
boss911

Цитата:
А можно в этот код добавить текст, который бы выводился на странице инсталлятора в момент выполнения данного (procedure CurStepChanged) действия? Типа как флаг 'StatusMsg' в секции Run.


Время на удаления не такое уже и большое , но попробуй так:


procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
begin
WizardForm.StatusLabel.Caption := 'Удаление временных файлов ... ';
DelTree(ExpandConstant('{app}') + '\Folder1', True, True, True);
DelTree(ExpandConstant('{app}') + '\Folder2', True, True, True);
DelTree(ExpandConstant('{app}') + '\Folder3\*.log', False, True, False);
end;
end;

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970

Предыдущая тема: Презентация


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.