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

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

Автор: Widok
Дата сообщения: 29.12.2008 11:26
Inno Setup часть 5 (часть 1, часть 2, часть 3, часть 4)

Это мощное средство для создания установочных пакетов (дистрибутивов) программ. Поддерживается шифрование, установка пароля, различные задачи по завершении установки. Можно создавать свои страницы, используя Inno Setup Form Designer.
По сравнению с NSIS (основной конкурент на бесплатной основе) проще в настройке, имеет более понятную структуру скрипта.

Последний бета релиз: 5.3.1-beta [15.05.2009]
Последний стабильный релиз: 5.2.4 [01.04.2009]
Что нового? | Что нового в версии 5.3-beta? | Все сборки

Inno Setup Compiler 5.2.3 090506 - расширенная версия от ResTools | зеркало
Добавляет списку компонентов возможность сворачивать дочерние элементы. Содержит более удобный редактор, кроме того, компилятор имеет множество других возможностей и новых функций. На сайте автора также есть дополнительные библиотеки.

Русификатор версии 5.2.0 от NightW0lf | зеркало

Русская справка к версии 5.0.x, автор перевода BagIra | зеркало || cкачать в .chm формате

Inno Setup Scripting 5.1 - Руководство по расширенным возможностям Inno Setup от Kindly
версия 5 скачать | зеркало || версия 4 скачать | зеркало || версия 3 скачать | зеркало

Inno Setup Extensions Knowledge Base (содержит ответы на многие вопросы) | старая chm-версия

Коллекция скриптов и Сборник вопросов, собранных из этой и предыдущих частей топика.

Corona Skin & Check System Requirements от Victor_Dobrov
Скачать | зеркало | скриншот | описание | старая версия || InnoSetup Upgrade || Слайд-шоу
Обложка для Inno Setup. Сделает инсталлятор более симпатичным и добавляет расширения: Проверка минимальных требований. Расширенный прогрессбар. Расчёт времени до завершения распаковки. Список дисков. Слайдшоу или AVI-файл в фоновом окне. Компактный режим установки. Деинсталляция неучтённых файлов. Экран справки/скриншота. Медиаплеер и многое другое...

InnoTools Downloader 0.3.5 [15.10.2008] от Sherlock Software
Это скрипт и DLL, которые позволяют вам скачивать файлы с HTTP или FTP из вашей инсталяционной программы.
Скачать (400 Kb) | Что нового?

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

Примечание: Если необходимо использовать метод проверки внешнего файла через сумму MD5 (который описан в 5 версии руководства от Kindly) для запуска инсталлятора, то понадобится калькулятор хеша MD5, калькулятор сумм MD5, SHA-256, CRC32. Если требуется узнать, какие ключи реестра меняет та или иная программа, используйте RegShot. Чтобы растянуть фоновый рисунок на весь экран, в версии Inno Setup 5.1.10 и выше используйте этот код.

Дополнительные утилиты для Inno Setup

ISTool

Мощная надстройка для Inno Setup, при помощи которой создавать свои инсталляторы становится очень просто.

Последний релиз: 5.3.0 [07.04.2009]
Скачать | зеркало || Русификатор | зеркало
GameScript Generator

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

Inno Script Generator

Прежнее название ScriptMaker. Удобная оболочка для облегчения написания скриптов установки для Inno Setup. Обладает некоторыми полезными функциями, которых нет ни у самого Inno Setup, ни у ISTool.

Последний релиз: 1.0.3.1 [23.03.2008]
Скачать | обновить (нужен QuickStartPack 5.2.3)
Inno Setup Unpacker

Распаковщик инсталляторов, созданных с помощью Inno Setup, начиная с версии 3.0.0-beta по 5.2.4. Извлекает ресурсы и скрипт установки (без секции Code). К Total Commander или FAR подключается с помощью MultiArc плагинов.

Последний релиз: 0.21 [21.04.2009]
Скачать | Расширенная версия (с поддержкой русского языка)

ISSkin

Программа для создания и добавления в инсталлятор кастомных скинов. Изменить можно практически любой элемент окна.
Инструкция по добавлению нужных кусков кода в скрипт (английский язык).

Последний релиз: 2.0.0.0 [18.09.2008]
Скачать | Зеркало

Примечание для всех участников

Объёмные скрипты или части кода заключайте в тег more, чтобы ваш вопрос в сообщении не затерялся среди множества строк прилагаемого скрипта.
Автор: chelobey
Дата сообщения: 29.12.2008 11:59
Люди, может быть все-таки кто-нибудь поможет?... Уже отчаялся спрашивать "как?". Спрашиваю теперь: возможно ли организовать привязку результата выбора к установочным файлам в этом [more=скрипте...]

Setup
AppName=Program
AppVerName=Program
AlwaysShowComponentsList=true
DefaultDirName={pf}\My Program
UsePreviousTasks=yes
ComponentsListTVStyle=true

Components
Name: prog; Description: program; Types: var1; Flags: exclusive
Name: cfg1; Description: program+config 1; Types: var2; Flags: exclusive

Types
Name: var1; Description: program
Name: var2; Description: program+config; Flags: iscustom

Files
Source: file.txt; DestDir: {app}: Components: prog
;Source: file1.txt; DestDir: {app}... как привязать к checkbox1, radiobutton1_1
;Source: file2.txt; DestDir: {app}... как привязать к checkbox1, radiobutton1_2
;Source: file3.txt; DestDir: {app}... как привязать к group1, radiobutton1_1
;Source: file4.txt; DestDir: {app}... как привязать к group1, radiobutton1_2

Code

var
Page1: TWizardPage;
CheckListBox: TNewCheckListBox;

procedure CreateTheWizardPages;
var
Page: TWizardPage;

begin
Page1:= CreateCustomPage(wpSelectComponents, 'TNewCheckListBox', 'page2')
CheckListBox := TNewCheckListBox.Create(Page1);
CheckListBox.Width := Page1.SurfaceWidth - ScaleX(115);
CheckListBox.Height := Page1.SurfaceHeight - ScaleY(30);
CheckListBox.Flat := True;
CheckListBox.Parent := Page1.Surface;
CheckListBox.AddCheckBox('CheckBox1', '', 0, True, True, True, True, nil, True);
CheckListBox.AddRadioButton('radiobutton1_1', '', 1, True, True, nil, False);
CheckListBox.AddRadioButton('radiobutton1_2', '', 1, True, True, nil, False);
CheckListBox.AddGroup('group1', '', 0, nil, True);
CheckListBox.AddRadioButton('radiobutton_g_1', '', 1, True, True, nil, False);
CheckListBox.AddRadioButton('radiobutton_g_2', '', 1, False, True, nil, False);
end;

Procedure InitializeWizard();
begin
CreateTheWizardPages;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
Case PageID of
Page1.ID,Page1.ID: Result:= not IsComponentSelected('cfg1');
end;
end;

[/more]
Автор: Artem_Butenko
Дата сообщения: 29.12.2008 12:03
С наступающим Новым Годом всех! У меня все тот же вопрос, по поводу озвучивания действий в окнах (в т.ч., диалоговых) Inno Setup. Можно ли определив класс основного и дочернего окна, увязать полученный результат в скрипте? И, на основе этого, назначить кнопке диалогового окна проигрывание *.wav файла?
Автор: LordVeider
Дата сообщения: 29.12.2008 12:48

Цитата:
Inno Setup часть 4
Может всё-таки часть 5 ?
Автор: Widok
Дата сообщения: 29.12.2008 13:16
LordVeider
Принеси полезное - публикуй полезные сообщения. Вот когда их наберётся(?) >200 будешь править такие мелочи сам, а пока это делают другие.
Автор: omals
Дата сообщения: 29.12.2008 13:34
Widok
и в шапке плз. линк на часть 4
Автор: ZONE51
Дата сообщения: 29.12.2008 14:05
Здравствуйте. Всех с Наступающим. Помогите пожалуйста решить проблему. Есть 2 файла и мне нужно в зависимости от версии установленного офиса включить в инсталляционный пакет либо один либо другой файл. Как это сделать? Заранее спасибо
Автор: SotM
Дата сообщения: 29.12.2008 14:12
ZONE51
Не совсем понятен вопрос. Т.е. этот установщик должен установить какой-то файл (или несколько файлов) в зависимости от того, какой офис установлен?
Автор: ZONE51
Дата сообщения: 29.12.2008 14:33
SotM
Ну тут как. Если офис 2003 то в пакет должен войти файл file1.exe и затем также установиться если же офис 2007 то файл file2.exe.
Автор: SotM
Дата сообщения: 29.12.2008 14:39
ZONE51
Т.е. во время сборки самого установщика внутри него должен оказаться один из двух файлов. Правильно я понял?
А как собственно будет происходит сама проверка версии офиса?

Тут надо тогда через препроцессор как-то это делать...

Автор: skeptik_vdm
Дата сообщения: 29.12.2008 14:54
Пожалуйста помогите! Есть фрагмент кода нужно сделать так чтобы при повторном запуске инсталлятора срабатывал этот код, т.е. запускаем появляется окно там надпись и две кнопки если нажимаем "Да" то запускается программа если "Нет" то на этом все прекращается.

[Setup]
AppName=My Program
AppVerName=My Program version 1.4
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
MyProgramm4Run, WorkDir4myProgramm, MyParameters: String;
res: Integer;
begin
if CurStep=ssDone then
begin
if MsgBox('Запустить С.Т.А.Л.К.Е.Р. - Чистое небо?', mbConfirmation, MB_YESNO) = IDYES then
begin MyProgramm4Run:= ExpandConstant('{app}\STALKER.exe'); // полный путь к EXE
WorkDir4myProgramm:= ExpandConstant('{app}'); // полный путь к рабочей папке если нужно, а не нужно, то '' MyParameters:= ''; // пареметры если нужно передать твоей STALKER.exe
Exec(MyProgramm4Run, MyParameters, WorkDir4myProgramm, SW_SHOW, ewWaitUntilTerminated, res);
end;
end;
end;
Автор: SotM
Дата сообщения: 29.12.2008 15:09
skeptik_vdm
Ну ты можешь сделать проверку через реестр. Сохранить в какую нить ветку, а затем при повторных запусках проверять. И если есть такое-то значение, то выводить нужное окно.
Автор: skeptik_vdm
Дата сообщения: 29.12.2008 16:10
SotM

Спасибо что откликнулся но если бы я знал как это реализовать!
Автор: JuNoS
Дата сообщения: 29.12.2008 16:50
Как сделать чтоб папка установки читалать из реестра:
DefaultDirName=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\program_is1\InstallLocation ?
Автор: omals
Дата сообщения: 29.12.2008 17:00
Добавлено:
skeptik_vdm
шото такое
function InitializeSetup(): Boolean;
var
oldPath, oldFolder, MyProgramm4Run, WorkDir4myProgramm, MyParameters :String;
er: boolean;
res:Integer;
begin
er := RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\STALKER.exe', '', oldPath); // если при инсталяции туда записано, или писать кудато еще, а тут читать оттуда
if (er and (oldPath<>'')) then er:=FileExists(oldPath);

if er then
begin
if MsgBox('Запустить С.Т.А.Л.К.Е.Р. - Чистое небо?', mbConfirmation, MB_YESNO) = IDYES then
begin
MyProgramm4Run:= oldPath;
MyParameters:='';
er := RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\STALKER.exe', 'Path', oldFolder);
if (er and (oldFolder<>'')) then
begin
WorkDir4myProgramm:=oldFolder;
end
else
Delete(oldPath,Length(oldPath)-Length('STALKER.exe')+1, Length('STALKER.exe')); // не уверен что Indx, Count для Delete задал на 100% верно
WorkDir4myProgramm:=oldPath;
end;
Exec(MyProgramm4Run, MyParameters, WorkDir4myProgramm, SW_SHOW, ewNoWait, res);
end;
Abort;
end;
end;

если же такого HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\STALKER.exe нет
то создать свой, например
[Registry]
Root: HKCU; Subkey: "Software\STALKER\"; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}"; Flags: uninsdeletevalue;

и тогда

function InitializeSetup(): Boolean;
var
oldPath, MyProgramm4Run, WorkDir4myProgramm, MyParameters :String;
er: boolean;
res:Integer;
begin
er := RegQueryStringValue(HKCU, 'Software\STALKER', 'InstallPath', oldPath);
MyProgramm4Run:=oldPath+'STALKER.exe';
WorkDir4myProgramm:=oldPath
MyParameters:='';

if (er and (oldPath<>'')) then er:=FileExists(MyProgramm4Run);

if er then
begin
if MsgBox('Запустить С.Т.А.Л.К.Е.Р. - Чистое небо?', mbConfirmation, MB_YESNO) = IDYES then
begin
Exec(MyProgramm4Run, MyParameters, WorkDir4myProgramm, SW_SHOW, ewNoWait, res);
end;
Abort;
end;
end;

Добавлено:
JuNoS

Цитата:
Как сделать чтоб папка установки читалать из реестра:
DefaultDirName=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\program_is1\InstallLocation ?


уже подобное рассматривали
http://forum.ru-board.com/topic.cgi?forum=5&topic=27438&start=1920#5

но повторю
[_Setup]
DefaultDirName={code:MyDirName}

[_Code]

function MyDirName(S:String): String;
var
InsPath: String;
er: boolean;
myFile:String;
begin
Result:=ExpandConstant('{pf}\Моя компания\Мой продукт'); //если ключа нет то будем ставить сюда
er := RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\program_is1\', 'InstallLocation', InsPath);
if er and (InsPath<>'') then //если ключ существует и там что-то записано
begin
Result := InsPath;
end;
end;
Автор: JuNoS
Дата сообщения: 29.12.2008 18:18

Цитата:
Result:=ExpandConstant('{pf}\Моя компания\Мой продукт'); //если ключа нет то будем ставить сюда
er := RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\program_is1\', 'InstallLocation', InsPath);
if er and (InsPath<>'') then //если ключ существует и там что-то записано


спасибо!
Автор: serg566
Дата сообщения: 29.12.2008 19:34
Помогите, уже 2 дня ковыряюсь и ниче не выходит...нужно соединить вместе следующие коды, буду очень признателен
[more=код][Files]
Source: "C:\sound.wav"; DestDir: "{tmp}"; Flags: dontcopy

[Code]
function sndPlaySound(lpszSoundName: string; uFlags: cardinal):integer;
external 'sndPlaySoundA@winmm.dll stdcall';

procedure InitializeWizard();
begin
ExtractTemporaryFile(ExpandConstant('sound.wav'));
sndPlaySound(ExpandConstant('{tmp}\sound.wav'), $0001 or $0008);
end;[/more]

[more=код2][Code]
var
NewPage: TWizardPage;
TopText: TLabel;
Edit1,Edit2,Edit3,Edit4,Edit5: TEdit;

const
MB_ICONINFORMATION = $40;
MB_ICONEXCLAMATION = $30;
MB_ICONQUESTION = $20;
MB_ICONSTOP = $10;
MB_ICONNONE = $0;

function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer;
external 'MessageBoxA@user32.dll stdcall';

procedure SerialEdit1OnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Length(Edit1.Text) = 5 then WizardForm.ActiveControl := Edit2
end;

procedure SerialEdit2OnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
// if Length(Edit2.Text) = 0 then WizardForm.ActiveControl := Edit1
if Length(Edit2.Text) = 5 then WizardForm.ActiveControl := Edit3
end;

procedure SerialEdit3OnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
// if Length(Edit3.Text) = 0 then WizardForm.ActiveControl := Edit2
if Length(Edit3.Text) = 5 then WizardForm.ActiveControl := Edit4
end;

procedure SerialEdit4OnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
// if Length(Edit4.Text) = 0 then WizardForm.ActiveControl := Edit3
if Length(Edit4.Text) = 5 then WizardForm.ActiveControl := Edit5
end;

procedure SerialEdit5OnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
// if Length(Edit5.Text) = 0 then WizardForm.ActiveControl := Edit4
end;

procedure SerialPage;
begin
NewPage:=CreateCustomPage(wpWelcome, 'Проверка ключа', 'Пожалуйста, введите ключ')

TopText:=TLabel.Create(NewPage)
TopText.Left:=0
TopText.Top:=0
TopText.Width:=417
TopText.Height:=28
TopText.AutoSize:=False
TopText.WordWrap:=True
TopText.Caption:='Введите код, отпечатанный на последней странице обложки Руководства пользователя или на упаковке диска.'
TopText.Parent:=NewPage.Surface

Edit1:=TEdit.Create(NewPage)
Edit1.Left:=0
Edit1.Top:=60
Edit1.Width:=60
Edit1.Height:=21
Edit1.AutoSize:=False
Edit1.MaxLength:=5
Edit1.Font.Size:=12
Edit1.Font.Style:=[fsBold]
Edit1.Font.Name:='Arial'
Edit1.Parent:=NewPage.Surface
Edit1.OnKeyUp := @SerialEdit1OnKeyUp

Edit2:=TEdit.Create(NewPage)
Edit2.Left:=70
Edit2.Top:=60
Edit2.Width:=60
Edit2.Height:=21
Edit2.AutoSize:=False
Edit2.MaxLength:=5
Edit2.Font.Size:=12
Edit2.Font.Style:=[fsBold]
Edit2.Font.Name:='Arial'
Edit2.Parent:=NewPage.Surface
Edit2.OnKeyUp := @SerialEdit2OnKeyUp

Edit3:=TEdit.Create(NewPage)
Edit3.Left:=140
Edit3.Top:=60
Edit3.Width:=60
Edit3.Height:=21
Edit3.AutoSize:=False
Edit3.MaxLength:=5
Edit3.Font.Size:=12
Edit3.Font.Style:=[fsBold]
Edit3.Font.Name:='Arial'
Edit3.Parent:=NewPage.Surface
Edit3.OnKeyUp := @SerialEdit3OnKeyUp

Edit4:=TEdit.Create(NewPage)
Edit4.Left:=210
Edit4.Top:=60
Edit4.Width:=60
Edit4.Height:=21
Edit4.AutoSize:=False
Edit4.MaxLength:=5
Edit4.Font.Size:=12
Edit4.Font.Style:=[fsBold]
Edit4.Font.Name:='Arial'
Edit4.Parent:=NewPage.Surface
Edit4.OnKeyUp := @SerialEdit4OnKeyUp

Edit5:=TEdit.Create(NewPage)
Edit5.Left:=280
Edit5.Top:=60
Edit5.Width:=60
Edit5.Height:=21
Edit5.AutoSize:=False
Edit5.MaxLength:=5
Edit5.Font.Size:=12
Edit5.Font.Style:=[fsBold]
Edit5.Font.Name:='Arial'
Edit5.Parent:=NewPage.Surface
Edit5.OnKeyUp := @SerialEdit5OnKeyUp
end;

procedure InitializeWizard();
begin
SerialPage
end;

function NextButtonClick(CurPageID: Integer): Boolean;
var
hWnd: Integer;
begin
Result:=True
if CurPageID = NewPage.ID then
begin
Result:=Edit1.Text = '11111'
Result:=Edit2.Text = '22222'
Result:=Edit3.Text = '33333'
Result:=Edit4.Text = '44444'
Result:=Edit5.Text = '55555'
if not Result then
begin
hWnd := StrToInt(ExpandConstant('{wizardhwnd}'));
MessageBox(hwnd, 'Неверный серийный номер.', 'Ошибка!', MB_ICONINFORMATION)
Result:=False
end
end
end;[/more]

[more=код3][Setup]
WizardSmallImageFile=С:\WizardSmallImage.bmp

[Code]
var
PageNameLabel, PageDescriptionLabel: TLabel;

procedure InitializeWizard();
begin
WizardForm.PageNameLabel.Hide
WizardForm.PageDescriptionLabel.Hide;

PageNameLabel := TLabel.Create(WizardForm)
PageNameLabel.Left := WizardForm.PageNameLabel.Left
PageNameLabel.Top := WizardForm.PageNameLabel.Top
PageNameLabel.Transparent := True
PageNameLabel.Font.Style := [fsBold]
PageNameLabel.Font.Color := clBlack
PageNameLabel.Parent := WizardForm.MainPanel

PageDescriptionLabel := TLabel.Create(WizardForm)
PageDescriptionLabel.Left := WizardForm.PageDescriptionLabel.Left
PageDescriptionLabel.Top := WizardForm.PageDescriptionLabel.Top
PageDescriptionLabel.Transparent := True
PageDescriptionLabel.Font.Color := clBlack
PageDescriptionLabel.Parent := WizardForm.MainPanel

with WizardForm do
with MainPanel do
begin
with WizardSmallBitmapImage do
begin
Left := ScaleX(0)
Top := ScaleY(0)
Height := MainPanel.Height
Width := MainPanel.Width
end
end
end;

procedure CurPageChanged(CurPageID: Integer);
begin
PageNameLabel.Caption := WizardForm.PageNameLabel.Caption
PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption
end;[/more]

[more=код4][Code]
procedure CurPageChanged(CurPageID: Integer);
var i:integer;
begin
i:=WizardForm.ProgressGauge.max;
if CurPageID=wpInstalling then
begin
WizardForm.MainPanel.Visible:=False;
WizardForm.Bevel1.Visible:=False;
WizardForm.Width:=ScaleX(400);
WizardForm.Height:=ScaleY(150);
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);
WizardForm.StatusLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.FileNameLabel.Left:=ScaleX(0);
WizardForm.FileNameLabel.Top:=ScaleY(20);
WizardForm.FileNameLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.ProgressGauge.Top:=ScaleY(40);
WizardForm.ProgressGauge.Width:=WizardForm.InnerNotebook.Width;
WizardForm.CancelButton.Left:=ScaleX(154);
WizardForm.CancelButton.Top:=ScaleY(88);
WizardForm.Left:=ScaleX(MainForm.Width-420);
WizardForm.Top:=ScaleY(MainForm.Height-170);
end
if CurPageID=wpFinished then
begin
WizardForm.Width:=502;
WizardForm.Height:=392;
WizardForm.Position:=poScreenCenter;
end
end;[/more]

[more=код5][Setup]
WindowVisible=yes
WindowShowCaption=no
WindowStartMaximized=no

[Files]
Source: "setup.bmp"; Flags: dontcopy

[Code]
procedure InitializeWizard();
var
BackgroundBitmapImage: TBitmapImage;
s:string;
begin
WizardForm.CancelButton.BringToFront;
s:=ExpandConstant('{src}')+'\setup.bmp';
MainForm.borderstyle:=bsnone;
BackgroundBitmapImage := TBitmapImage.Create(MainForm);
BackgroundBitmapImage.Bitmap.LoadFromFile(s);
BackgroundBitmapImage.Left := 0;
BackgroundBitmapImage.Top := 0;
BackgroundBitmapImage.Width:=MainForm.ClientWidth;
BackgroundBitmapImage.Height:=MainForm.ClientHeight;
BackgroundBitmapImage.Parent := MainForm;
BackgroundBitmapImage.Stretch:=True;
end;[/more]
Автор: LordVeider
Дата сообщения: 29.12.2008 22:16

Цитата:
Result:=ExpandConstant('{pf}\Моя компания\Мой продукт'); //если ключа нет то будем ставить сюда
er := RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\program_is1\', 'InstallLocation', InsPath);
if er and (InsPath<>'') then //если ключ существует и там что-то записано
Как же вы всё усложнять любите...

Код: [Setup]
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\program_is1,InstallLocation|{pf}\default_dir_name}
Автор: Diawer
Дата сообщения: 29.12.2008 22:36
SotM
equis


Цитата:
Ну сам код он всё равно не сможет распаковать, лишь только ресурсы можно вытянуть.


Цитата:
Кстати, а в чем тут криминал? Ну вот даже если бы кто-то захотел это сделать?.. Да мало ли по каким причинам: скажем, человек опасается установки непрошенных/вредоносных модулей, антивирусу не доверяет.
В инсталляторе разве есть что-то такое, чего никто кроме тебя не должен видеть?
Просто интересно, почему ты так переживаешь за это...




Добавлено:
Дело не в том, сможет или нет пользователь увидеть/использовать код, а чтобы он прошел все страницы созданного тобой инсталлятора. Надеюсь понятно.
Автор: equis
Дата сообщения: 30.12.2008 01:31

Цитата:
чтобы он прошел все страницы созданного тобой инсталлятора. Надеюсь понятно.

Нет, Diawer, если честно, не до конца понятны мотивы такой просьбы.
Почему он не имеет права отклоняться от задуманного кем-то сценария? В конце концов, следовать инструкциям или нет - полностью на совести самого пользователя.
Тут авторское самолюбие задето или тому есть более веские причины (какие)?
Автор: Victor_Dobrov
Дата сообщения: 30.12.2008 01:44
Обновил коллекцию скриптов (было 75, стало 215 скриптов, 250 кб)

Данный архив дополняет Сборник вопросов и Руководство по Inno Setup. В архив включены библиотеки IssProc, descctrl, winmsgctrl, trayiconctrl, ISHint, FirewallInstallHelper. Остальные dll-файлы (например bass.dll), можно взять из Inno_Setup_Scripting 5.1
Автор: SotM
Дата сообщения: 30.12.2008 08:07
serg566
Я убрал загрузку звука, т.к. под рукой нет ничего с чем можно это проверить. Также я не использовал WizardSmallImageFile
Глянь [more=сюда]
Код: [Setup]
AppName=test
AppVerName=test1
DefaultDirName={pf}\test
WindowVisible=yes
WindowShowCaption=no
WindowStartMaximized=no
;WizardSmallImageFile=WizardSmallImage.bmp

[Files]
;Source: "C:\sound.wav"; DestDir: "{tmp}"; Flags: dontcopy
Source: "setup.bmp"; DestDir: "{tmp}"; Flags: dontcopy

[Code]
function sndPlaySound(lpszSoundName: string; uFlags: cardinal):integer; external 'sndPlaySoundA@winmm.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';

var
NewPage: TWizardPage;
TopText: TLabel;
Edit1,Edit2,Edit3,Edit4,Edit5: TEdit;
PageNameLabel, PageDescriptionLabel: TLabel;

const
MB_ICONINFORMATION = $40;
MB_ICONEXCLAMATION = $30;
MB_ICONQUESTION = $20;
MB_ICONSTOP = $10;
MB_ICONNONE = $0;

procedure SerialEdit1OnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if
Length(Edit1.Text) = 5 then WizardForm.ActiveControl := Edit2
end;

procedure SerialEdit2OnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
// if Length(Edit2.Text) = 0 then WizardForm.ActiveControl := Edit1
if Length(Edit2.Text) = 5 then WizardForm.ActiveControl := Edit3
end;

procedure SerialEdit3OnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
// if Length(Edit3.Text) = 0 then WizardForm.ActiveControl := Edit2
if Length(Edit3.Text) = 5 then WizardForm.ActiveControl := Edit4
end;

procedure SerialEdit4OnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
// if Length(Edit4.Text) = 0 then WizardForm.ActiveControl := Edit3
if Length(Edit4.Text) = 5 then WizardForm.ActiveControl := Edit5
end;

procedure SerialEdit5OnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
// if Length(Edit5.Text) = 0 then WizardForm.ActiveControl := Edit4
end;

procedure SerialPage;
begin
NewPage:=CreateCustomPage(wpWelcome, 'Проверка ключа', 'Пожалуйста, введите ключ')

TopText:=TLabel.Create(NewPage)
TopText.Left:=0
TopText.Top:=0
TopText.Width:=417
TopText.Height:=28
TopText.AutoSize:=False
TopText.WordWrap:=True
TopText.Caption:='Введите код, отпечатанный на последней странице обложки Руководства пользователя или на упаковке диска.'
TopText.Parent:=NewPage.Surface

Edit1:=TEdit.Create(NewPage)
Edit1.Left:=0
Edit1.Top:=60
Edit1.Width:=60
Edit1.Height:=21
Edit1.AutoSize:=False
Edit1.MaxLength:=5
Edit1.Font.Size:=12
Edit1.Font.Style:=[fsBold]
Edit1.Font.Name:='Arial'
Edit1.Parent:=NewPage.Surface
Edit1.OnKeyUp := @SerialEdit1OnKeyUp

Edit2:=TEdit.Create(NewPage)
Edit2.Left:=70
Edit2.Top:=60
Edit2.Width:=60
Edit2.Height:=21
Edit2.AutoSize:=False
Edit2.MaxLength:=5
Edit2.Font.Size:=12
Edit2.Font.Style:=[fsBold]
Edit2.Font.Name:='Arial'
Edit2.Parent:=NewPage.Surface
Edit2.OnKeyUp := @SerialEdit2OnKeyUp

Edit3:=TEdit.Create(NewPage)
Edit3.Left:=140
Edit3.Top:=60
Edit3.Width:=60
Edit3.Height:=21
Edit3.AutoSize:=False
Edit3.MaxLength:=5
Edit3.Font.Size:=12
Edit3.Font.Style:=[fsBold]
Edit3.Font.Name:='Arial'
Edit3.Parent:=NewPage.Surface
Edit3.OnKeyUp := @SerialEdit3OnKeyUp

Edit4:=TEdit.Create(NewPage)
Edit4.Left:=210
Edit4.Top:=60
Edit4.Width:=60
Edit4.Height:=21
Edit4.AutoSize:=False
Edit4.MaxLength:=5
Edit4.Font.Size:=12
Edit4.Font.Style:=[fsBold]
Edit4.Font.Name:='Arial'
Edit4.Parent:=NewPage.Surface
Edit4.OnKeyUp := @SerialEdit4OnKeyUp

Edit5:=TEdit.Create(NewPage)
Edit5.Left:=280
Edit5.Top:=60
Edit5.Width:=60
Edit5.Height:=21
Edit5.AutoSize:=False
Edit5.MaxLength:=5
Edit5.Font.Size:=12
Edit5.Font.Style:=[fsBold]
Edit5.Font.Name:='Arial'
Edit5.Parent:=NewPage.Surface
Edit5.OnKeyUp := @SerialEdit5OnKeyUp
end;

function NextButtonClick(CurPageID: Integer): Boolean;
var
hWnd: Integer;
begin
Result:=True
if CurPageID = NewPage.ID then
begin
Result:=Edit1.Text = '11111'
Result:=Edit2.Text = '22222'
Result:=Edit3.Text = '33333'
Result:=Edit4.Text = '44444'
Result:=Edit5.Text = '55555'
if not Result then
begin
hWnd := StrToInt(ExpandConstant('{wizardhwnd}'));
MessageBox(hwnd, 'Неверный серийный номер.', 'Ошибка!', MB_ICONINFORMATION)
Result:=False
end
end
end;

procedure InitializeWizard();
var
BackgroundBitmapImage: TBitmapImage;
s:string;
begin
// ExtractTemporaryFile(ExpandConstant('sound.wav'));
// sndPlaySound(ExpandConstant('{tmp}\sound.wav'), $0001 or $0008);

SerialPage();

WizardForm.PageNameLabel.Hide
WizardForm.PageDescriptionLabel.Hide;

PageNameLabel := TLabel.Create(WizardForm)
PageNameLabel.Left := WizardForm.PageNameLabel.Left
PageNameLabel.Top := WizardForm.PageNameLabel.Top
PageNameLabel.Transparent := True
PageNameLabel.Font.Style := [fsBold]
PageNameLabel.Font.Color := clBlack
PageNameLabel.Parent := WizardForm.MainPanel

PageDescriptionLabel := TLabel.Create(WizardForm)
PageDescriptionLabel.Left := WizardForm.PageDescriptionLabel.Left
PageDescriptionLabel.Top := WizardForm.PageDescriptionLabel.Top
PageDescriptionLabel.Transparent := True
PageDescriptionLabel.Font.Color := clBlack
PageDescriptionLabel.Parent := WizardForm.MainPanel

with WizardForm do
with MainPanel do
begin
with WizardSmallBitmapImage do
begin
Left := ScaleX(0)
Top := ScaleY(0)
Height := MainPanel.Height
Width := MainPanel.Width
end
end

WizardForm.CancelButton.BringToFront;
ExtractTemporaryFile('setup.bmp');
s:=ExpandConstant('{tmp}')+'\setup.bmp';
MainForm.borderstyle:=bsnone;
BackgroundBitmapImage := TBitmapImage.Create(MainForm);
BackgroundBitmapImage.Bitmap.LoadFromFile(s);
BackgroundBitmapImage.Left := 0;
BackgroundBitmapImage.Top := 0;
BackgroundBitmapImage.Width:=MainForm.ClientWidth;
BackgroundBitmapImage.Height:=MainForm.ClientHeight;
BackgroundBitmapImage.Parent := MainForm;
BackgroundBitmapImage.Stretch:=True;
end;

procedure CurPageChanged(CurPageID: Integer);
var
i:integer;
begin
PageNameLabel.Caption := WizardForm.PageNameLabel.Caption
PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption

i:=WizardForm.ProgressGauge.max;
if CurPageID=wpInstalling then
begin
WizardForm.MainPanel.Visible:=False;
WizardForm.Bevel1.Visible:=False;
WizardForm.Width:=ScaleX(400);
WizardForm.Height:=ScaleY(150);
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);
WizardForm.StatusLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.FileNameLabel.Left:=ScaleX(0);
WizardForm.FileNameLabel.Top:=ScaleY(20);
WizardForm.FileNameLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.ProgressGauge.Top:=ScaleY(40);
WizardForm.ProgressGauge.Width:=WizardForm.InnerNotebook.Width;
WizardForm.CancelButton.Left:=ScaleX(154);
WizardForm.CancelButton.Top:=ScaleY(88);
WizardForm.Left:=ScaleX(MainForm.Width-420);
WizardForm.Top:=ScaleY(MainForm.Height-170);
end
if CurPageID=wpFinished then
begin
WizardForm.Width:=502;
WizardForm.Height:=392;
WizardForm.Position:=poScreenCenter;
end
end;
Автор: Serega0675
Дата сообщения: 30.12.2008 10:47
Victor_Dobrov
Спасибо, впечатляет.
Автор: JuNoS
Дата сообщения: 30.12.2008 11:38
Как убрать это?
Автор: Serega0675
Дата сообщения: 30.12.2008 11:52
JuNoS

Цитата:
Как убрать это?

[Messages]
ComponentsDiskSpaceMBLabel=
Автор: JuNoS
Дата сообщения: 30.12.2008 12:07

Цитата:
[Messages]
ComponentsDiskSpaceMBLabel=


Это не то, ComponentsDiskSpaceMBLabel убирает текст при выборе компонентов, а мне надо убрать ,где выбор папки установки

....
Я нашел, вот

[Messages]
DiskSpaceMBLabel=
Автор: Diawer
Дата сообщения: 30.12.2008 19:55
equis
Так и есть, я создаю инсталлятор для пользователя с ненавязчивыми функциями (т.е. все старания направлены на удобство для пользователя) – самолюбие в данном примере ни причем, повторяю, что пользователь должен (по моему мнению) пройти все страницы созданного ДЛЯ НЕГО инсталлятора.
Автор: serg566
Дата сообщения: 30.12.2008 22:52
SotM
Большое спасибо, все работает
Автор: Victor_Dobrov
Дата сообщения: 31.12.2008 01:43
Обновил шапку. Добавил ссылки на расширенную сборку от ResTools.
Автор: Serega0675
Дата сообщения: 31.12.2008 11:47
С наступающим всех НОВЫМ ГОДОМ!!!

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071

Предыдущая тема: в очередной раз босудим антивиры?


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