Написание скрипта для инсталлятора

  • Автор темы Kindly
  • Дата начала
Статус
Закрыто для дальнейших ответов.
Z

zubr

Похоже, неправильно дал пояснение... Имеется в виду, что функция, которая должна выполнятся через CheckBox, должна выполняться непосредственно при установке - не сразу, на подобии выбора компонентов. Такое можно проделать?
Вот код:
Код:
var
  b_cb:boolean;

function InitializeSetup(): Boolean;
begin
b_cb:=False;
Result:=True;
end;

procedure cdClick(Sender: TObject);
begin
b_cb:=cb.CHECKED;
end;


procedure CurPageChanged(CurPageID: Integer);
var
 i:Integer;
begin
If CurPageID=wpSelectDir then
begin
 If cb=nil then
 begin
  cb:=TCheckBox.Create(WizardForm);
  cb.Parent:=WizardForm;
  cb.Left:=WizardForm.SELECTDIRLABEL.Left;
  cb.Top:=ScaleY(180);
  cb.CAPTION:='MyCheckBox';
  cb.ONCLICK:=@cdClick;
 end;
end
else
begin
 If cb<>nil then
 begin
  cb.Free;
  cb:=nil;
 end;
end;
If CurPageID=wpInstalling then
begin
 If b_cb then
 MsgBox('cb.CHECKED', mbInformation, MB_OK)
 else
 MsgBox('not cb.CHECKED', mbInformation, MB_OK)
end;
end;
Из FAQ для Inno Setup:
Вопрос: Что именно происходит, если пользователь нажмет Cancel в процессе установки?
Ответ: При нажатии Cancel инсталятор отменяет изменения, сделанные им в ходе установки, почти как деинсталятор при удалении программы. Поэтому частично установленное приложение не останется в системе пользователя.

В этом-то мой вопрос и состоит, как избежать того, о чём говорится в ответе FAQ...
Пришлите код скрипта, у меня почему то при переустановке ничего не удаляется.
Может, следующий вопрос из-за моей невнимательности, но тем не менее.
Ярлыки, создаваемые в меню "Пуск" зачастую (особенно если их много) могут быть расформированы как угодно. Вопрос: можно ли конкретно задать размещение ярлыков в панели "Пуск" в определенном порядке?
Создавайте свою группу, в которую помещайте устанавливаемые программы.
очень захотелось "убить" MessageBox, предупреждающий об удалении файлов перед деинсталляцией, а именно "Are you sure you want to completely remove %1 and all of its components?"... Как сделать так, чтобы подтвержения на удаление не требовалось (соответственно и окно требования подтвержения не появлялось)?
Не получится, можно только текст изменить.
 
G

Guest_

To Zubr:

Код:
[Setup]
AppName=My Program
AppVerName=My Program 1.5
AppPublisher=My Company, Inc.
AppPublisherURL=http://www.mycompany.com
AppSupportURL=http://www.mycompany.com
AppUpdatesURL=http://www.mycompany.com
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

[Types]
Name: custom; Description: Custom installation; Flags: iscustom

[Components]
Name: group; Description: Header; Types: custom; Flags: disablenouninstallwarning
Name: group\file1; Description: Sub-Header 1; Types: custom; Flags: disablenouninstallwarning;
Name: group\file2; Description: Sub-Header 2; Types: custom; Flags: disablenouninstallwarning;
Name: group\file3; Description: Sub-Header 3; Types: custom; Flags: disablenouninstallwarning;
Name: group\file4; Description: Sub-Header 4; Types: custom; Flags: disablenouninstallwarning;

[Files]
Source: C:\Works\CreateInstall\a.exe; Components: group\file1; DestDir: {app}; Attribs: readonly; Flags: onlyifdoesntexist uninsremovereadonly
Source: C:\Works\CreateInstall\b.exe; Components: group\file2; DestDir: {app}; Attribs: readonly; Flags: onlyifdoesntexist uninsremovereadonly
Source: C:\Works\CreateInstall\c.exe; Components: group\file3; DestDir: {app}; Attribs: readonly; Flags: onlyifdoesntexist uninsremovereadonly
Source: C:\Works\CreateInstall\d.exe; Components: group\file4; DestDir: {app}; Attribs: readonly; Flags: onlyifdoesntexist uninsremovereadonly

[InstallDelete]
Name: {app}\a.exe; Type: files; Components:
Name: {app}\b.exe; Type: files; Components:
Name: {app}\c.exe; Type: files; Components:
Name: {app}\d.exe; Type: files; Components:

примерно такой вот упрощённый код даёт удаление заранее установленных компонентов...

Последовательность:
1. Установить какой-то один компонент
2. Закончить работу с инсталлятором
3. Запустить инсталлятор вновь
4. Выбрать какой-то ещё не установленный компонент и начать процесс его установки
5. До того момента, как этот компонент установился, нажать Отмена
6. Пойдёт откат
7. Смотрим в папку с установленной программой, компонентов нет (ни заранее установленных, ни того, процесс установки которого прервали)
 
K

Kindly

zubr
Создавайте свою группу, в которую помещайте устанавливаемые программы.
В смысле? Так группа с ярлыками и создается, а после установки ярлыки могут быть в разнобой :) , например: "Удалить" может быть в середине программной группы (особенно если ярлыков много). Хотелось бы знать, имеется ли возможность назначения последовательности размещения ярлыков в программной группе с ярлыками.
 
G

Guest_

To Kindly:

В смысле? Так группа с ярлыками и создается, а после установки ярлыки могут быть в разнобой , например: "Удалить" может быть в середине программной группы (особенно если ярлыков много). Хотелось бы знать, имеется ли возможность назначения последовательности размещения ярлыков в программной группе с ярлыками.

по-моему, размещение ярлыков определяется сортировкой, заданной Вами же для меню Пуск...
 
G

Guest_

Код был представлен с ошибкой... Конечно же в секции [InstallDelete]
должны быть следующие продолжения строк:
Код:
Components: group\file1;
Components: group\file2;
Components: group\file3;
Components: group\file4;

В данном случае, это не суть важно, т.к. проблема с удалением предустановленных файлов всё равно есть...
 
K

Kindly

zubr CheckBox
Спасибо! Все просто замечательно! Немного доработки - и у меня оказалось то, чего я давно хотел. Но вопросы "по-мелочи" у меня все же есть:
1. Можно ли как-нибудь отключить страницу Приветствия?
2. Существует ли вообще в Inno Setup функции отключения видимости или задействования кнопок (например, как на странице принятия лицензионного соглащения)?
 
G

Guest_

To Kindly:

1. Можно ли как-нибудь отключить страницу Приветствия?
2. Существует ли вообще в Inno Setup функции отключения видимости или задействования кнопок (например, как на странице принятия лицензионного соглащения)?

1. страница приветствия отключается при помощи
Код:
[Setup]
DisableStartupPrompt=yes

2. на примере для кнопки "Назад" Мастера можно задисэйблить при помощи следующего кода в секции
Код:
:
[CODE]procedure InitializeWizard();
begin
 WizardForm.BackButton.Enabled := False;
end;

для кнопки "Далее" надо устанавливать конкретные страницы Мастера, где произойдёт изменение её состояния (т.к. принимая Лицензионное соглашение кнопа автоматом становится доступной)...
 
K

Kindly

Guest_Юрий_*,
[Setup]
DisableStartupPrompt=yes
отключает только сообщение при инициализации, а не страницу приветствия.
Насчет кнопок, спасибо за намек :) - надо потренироваться.
 
Z

zubr

Guest_Юрий_*
Из FAQ для Inno Setup:
Вопрос: Что именно происходит, если пользователь нажмет Cancel в процессе установки?
Ответ: При нажатии Cancel инсталятор отменяет изменения, сделанные им в ходе установки, почти как деинсталятор при удалении программы. Поэтому частично установленное приложение не останется в системе пользователя.

В этом-то мой вопрос и состоит, как избежать того, о чём говорится в ответе FAQ...
Удалите в своем коде секцию
Код:
[InstallDelete]
Name: {app}\a.exe; Type: files; Components:
Name: {app}\b.exe; Type: files; Components:
Name: {app}\c.exe; Type: files; Components:
Name: {app}\d.exe; Type: files; Components:
и все заработает как вы хотите.
Kindly
В смысле? Так группа с ярлыками и создается, а после установки ярлыки могут быть в разнобой , например: "Удалить" может быть в середине программной группы (особенно если ярлыков много). Хотелось бы знать, имеется ли возможность назначения последовательности размещения ярлыков в программной группе с ярлыками.
Ярлыки сортируются по алфавиту.
Можно ли как-нибудь отключить страницу Приветствия?
В InnoSetup напрямую способа я не нашел, но обмануть можно все что угодно... или почти все :)
Вот код:
Код:
procedure CurPageChanged(CurPageID: Integer);
begin
If CurPageID=wpWelcome then
begin
SendMessage(WizardForm.NEXTBUTTON.Handle, 513, 0, 0);
SendMessage(WizardForm.NEXTBUTTON.Handle, 514, 0, 0);
end;
end;
 
K

Kindly

Интересно-то как :D ! Thanks!
У меня вот на днях поинтересовались, но пока не особо силен в Inno, но самому тоже интересно. Вопросы следующего содержания:
Как сделать еще один progress-bar? То есть чтобы во время установки отображался не только общий прогресс, но и прогресс для каждого файла в отдельности. А в идеале - еще и отдельный прогресс для backup'a, если он был выбран?
 
G

Guest_

Появился такой вопрос:
На примере для Microsoft Office постараюсь пояснить его. После установки Office на компьютер в диалоге "Установка/Удаление программ" появляется запись об этом. После установки обновления добавляется дочерняя запись "Обновление".
Формулировка вопроса: как сделать так, чтобы после обновления появлялась дочерняя запись об обновлении, а старая никуда бы не исчезала и становилась родительской?
 
Z

zubr

Kindly
Как сделать еще один progress-bar? То есть чтобы во время установки отображался не только общий прогресс, но и прогресс для каждого файла в отдельности. А в идеале - еще и отдельный прогресс для backup'a, если он был выбран?
Сделать еще один progress-bar не проблема, можно юзать функцию CreateOutputProgressPage, но чтобы этот progress-bar правильно работал надо иметь программный контроль над процессом копирования файлов, InnoSetup такую возможность не дает, тут надо использовать более профессиональные инсталляторы.
Guest_Юрий_*
На примере для Microsoft Office постараюсь пояснить его. После установки Office на компьютер в диалоге "Установка/Удаление программ" появляется запись об этом. После установки обновления добавляется дочерняя запись "Обновление".
Формулировка вопроса: как сделать так, чтобы после обновления появлялась дочерняя запись об обновлении, а старая никуда бы не исчезала и становилась родительской?
Чтобы в диалоге "Установка/Удаление программ" появилась запись, достаточно в реестре создать ключ : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\NameOurProgram, в котором надо создать 2 обязательных параметра: DisplayName значение которого отображается в диалоге, UninstallString в значении которого должен быть путь к программе удаления.
 
G

Guest_

To Zubr:
Чтобы в диалоге "Установка/Удаление программ" появилась запись, достаточно в реестре создать ключ : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\NameOurProgram, в котором надо создать 2 обязательных параметра: DisplayName значение которого отображается в диалоге, UninstallString в значении которого должен быть путь к программе удаления.

То, что Вы сказали, не вызывает никакого сомнения. Это действительно так. Но я спрашиваю о том, как сделать дочернюю запись, чтобы одновременно была запись об оригинале, а информация об обновлении была записана как дерево под оригиналом.
 
Z

zubr

Guest_Юрий_*
Но я спрашиваю о том, как сделать дочернюю запись, чтобы одновременно была запись об оригинале, а информация об обновлении была записана как дерево под оригиналом.
Так в чем проблема, посмотрите в реестре, как это реализовано для офиса (у меня офис стоит без обновлений) и реализуйте в своем инсталляторе для своей программы.
 
G

Guest

To Zubr:
Так в чем проблема, посмотрите в реестре, как это реализовано для офиса (у меня офис стоит без обновлений) и реализуйте в своем инсталляторе для своей программы.
В реестре всё прописано стандартно. Есть какая-то хитрость, и её реализация не на поверхности, как могло показаться на первый взгляд. Так что вопрос отстаётся открытым, к сожалению...
 
K

Kindly

Что Вы можете сказать насчет этого (450 kb):

Это обновление русификатора для игры, но не он нужен, а чтобы посмотреть как инсталлятор Inno Setup забомбили - я не узнал вначале. Inno Setup Form Disainer и рядом не валялся. Авторы инсталлятора молчат. Знает кто-нибудь как так возможно?
link removed
 
Z

zubr

Так а что здесь невозможного? Меняете в окне Image, ложите 2 TNewProgressBar, причем здесь движение ProgressBar явно не связано с процессом копирования файлов - чистая иммитация, меняете шрифты в Label и т. п.
 
K

Kindly

Так а что здесь невозможного? Меняете в окне Image, ложите 2 TNewProgressBar, причем здесь движение ProgressBar явно не связано с процессом копирования файлов - чистая иммитация, меняете шрифты в Label и т. п.
Надо подумать :unsure: .
Вопрос: возможно ли сделать резервирование или переименование уже существующих файлов, т.е. например, устанавливается 100 обновленных файлов, по умолчанию старые файлы переписываются новыми, так вот возможно ли вместо перезаписи существующих файлов сделать их резервирование или переименование, причем без указания каждого файла в отдельности?
 
Z

zubr

Вопрос: возможно ли сделать резервирование или переименование уже существующих файлов, т.е. например, устанавливается 100 обновленных файлов, по умолчанию старые файлы переписываются новыми, так вот возможно ли вместо перезаписи существующих файлов сделать их резервирование или переименование, причем без указания каждого файла в отдельности?
Резервирование или переименование сделать можно, это уже обсуждалось в этой теме здесь. А вот без указания каждого файла в отдельности пожалуй в InnoSetup не получится.
 
G

Guest_

Задача: установить 2 разные программы в один каталог.

Проблема: размеры этих двух установленных программ, отображаемые в диалоге "Установка и удаление программ" одинаковы в случае, если открыть этот диалог уже после установки и первой и второй.

Попытки решения: DWORD-значение EstimatedSize, устанавливаемое в реестре по пути HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\NameMyProgram не даёт ожидаемого результата, а именно корректного отображения размеров.

Вопрос: как привязать заранее известные размеры устанавливаемых в один каталог программ к описанию в диалоге "Установка и удаление программ"?
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!