Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 6]
Aquila, я просто не совсем понял, что подразумевается под использовать несколько ключей установки. Имеется ввиду установка через ком.строку с различными параметрами?
Имеется ввиду установка через ком.строку с различными параметрами? »
Да
Aquila, всё, что могу подсказать по этому вопросу: использовать файл ответов - свой для каждой конфигурации.
/LOADINF="filename"
Указывает инсталлятору загрузить параметры установки из указанного файла после проверки командной строки. Этот файл может быть подготовлен с помощью '/SAVEINF=' command.
Не забудьте ставить кавычки при использовании имен, содержащих пробелы.
/SAVEINF="filename"
Указывает инсталлятору сохранять параметры установки в указанный файл.
Не забудьте ставить кавычки при использовании имен, содержащих пробелы.
Все параметры командной строки Inno (http://jrsoftware.org/ishelp/topic_setupcmdline.htm)
saurn, Об этом я знаю :sorry: Придётся использовать NSIS (там есть то что я хочу).
Aquila, насчет добавления ярлыков в различные дериктории: в секции [Tasks] можно задать опционально для всех ярлыков, а потом через ком. строку выбирать необходимые ярлыки
/TASKS="desktopicon,groupicon" Тот же способ и для компонентов. Пожалуй это и всё.
Crazy Noise
21-05-2013, 16:00
saurn, Благодарю!
Скрипт рабочий, если добавить в него [Dirs].
[Dirs]
Name: {userdocs}\GameEX
[code]
var
SerialPage: TWizardPage;
Block_1, Block_2, Block_3, Block_4: TNewEdit;
sNumber: String;
procedure InitializeWizard();
begin
SerialPage := CreateCustomPage(wpSelectTasks, 'Serial number', 'Please insert serial number');
Block_1 := TNewEdit.Create(nil);
with Block_1 do
begin
Parent := SerialPage.Surface;
SetBounds(ScaleX(96), ScaleY(98), ScaleX(50), ScaleY(21));
Text := '';
MaxLength := 4;
end;
Block_2 := TNewEdit.Create(nil);
with Block_2 do
begin
Parent := SerialPage.Surface;
SetBounds(ScaleX(152), ScaleY(98), ScaleX(50), ScaleY(21));
Text := '';
MaxLength := 4;
end;
Block_3 := TNewEdit.Create(nil);
with Block_3 do
begin
Parent := SerialPage.Surface;
SetBounds(ScaleX(208), ScaleY(98), ScaleX(50), ScaleY(21));
Text := '';
MaxLength := 4;
end;
Block_4 := TNewEdit.Create(nil);
with Block_4 do
begin
Parent := SerialPage.Surface;
SetBounds(ScaleX(265), ScaleY(98), ScaleX(50), ScaleY(21));
Text := '';
MaxLength := 4;
end;
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
sNumber := ExpandConstant(Block_1.Text + '-' + Block_2.Text + '-' + Block_3.Text + '-' + Block_4.Text);
case CurStep of
ssPostInstall: SaveStringToFile(ExpandConstant('{userdocs}\GameEX\keysgame.ini'), sNumber, True);
end;
end;
Но что делать если использовать второй вариант //или вместо шага CurStepChanged записывать серийник в файл при нажатии "Далее" на этой странице.
(*function NextButtonClick(CurPageID:integer): Boolean;
begin
sNumber := ExpandConstant(Block_1.Text + '-' + Block_2.Text + '-' + Block_3.Text + '-' + Block_4.Text);
case CurPageID of
SerialPage.ID: SaveStringToFile(ExpandConstant('{userdocs}\GameEX\keysgame.ini'), sNumber, True);
end;
Result := True;
end;*)
где создание папки GameEX через [Dirs] не прокатит?
Crazy Noise, не подумал, что папки изначально не существует)
function NextButtonClick(CurPageID:integer): Boolean;
begin
sNumber := ExpandConstant(Block_1.Text + '-' + Block_2.Text + '-' + Block_3.Text + '-' + Block_4.Text);
case CurPageID of
SerialPage.ID:
begin
CreateDir(ExpandConstant('{userdocs}\GameEX'));
SaveStringToFile(ExpandConstant('{userdocs}\GameEX\keysgame.ini'), sNumber, True);
end;
end;
Result := True;
end;
Crazy Noise
21-05-2013, 16:50
saurn, Благодарю.
не подумал, что папки изначально не существует) »Да это я ничего про папку не упомянул, не думал что так получится.
Aquila, Попробую привести пример на основе bat+ini, т.е bat-ник подхватывает настройки указанные в файле ini
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
DefaultGroupName=My Application
OutputBaseFilename=setup
OutputDir=.
[Icons]
Name: "{group}\{cm:UninstallProgram,My Application}"; Filename: "{uninstallexe}"
[Components]
Name: a; Description: A; Types: full custom compact; Flags: checkablealone
Name: a\a; Description: A\A; Types: custom compact; Flags: dontinheritcheck
Name: a\b; Description: A\B; Types: custom compact; Flags: dontinheritcheck
Name: a\c; Description: A\C; Types: custom compact; Flags: dontinheritcheck
[Tasks]
Name: a; Description: A; Flags: checkablealone
Name: a\a; Description: A\A; Flags: dontinheritcheck
Name: a\b; Description: A\B; Flags: unchecked dontinheritcheck
Name: a\c; Description: A\C; Flags: unchecked dontinheritcheck
setup.exe /LoadInf=".\unattended.ini"
[Setup]
Components=a,a\b,a\c
Tasks=a,a\b,a\c
таким образом, можно ювелирно всё настроить.
Так же можно подсмотреть в ветке реестра
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Application_is1
Inno Setup: Selected Components
Inno Setup: Selected Tasks
и т.д.
аналогично без использования ini, будет выглядеть примерно так setup.exe /Components="a,a\b,a\c" /Tasks="a,a\b,a\c"
Ниже прикрутил архив.
Crazy Noise, еще можно реализовать проверку на присутствие файла с серийником, и если он есть, не создавать или пропускать страницу ввода(например при переустановке поверх).
Crazy Noise
21-05-2013, 17:08
saurn, И об этом я не подумал. Угадываешь мысли?
Пример можно? Не силён в таких мелочах.
Crazy Noise, вот самодостаточный пример. Единственный его минус, точнее два минуса: будет работать только, если всегда вводится один и тот же серийник, и второй минус - чувствительность к регистру букв в серийнике. Ну а принцип прост: если определенный серийный номер(серийник задается в константе) не найден, страница создается. В противном случае пропускается. Короче, если даже *.ini файл присутствует, но он пустой, или в нем указан другой серийник страница будет создана. Чтение строки из файла воспроизвел по мотивам примера от Johny777)
[Code]
const
SERIAL_NUMBER = '1234-5678-ABCD-EFGH';
var
SerialPage: TWizardPage;
Block_1, Block_2, Block_3, Block_4: TNewEdit;
sNumber, OldNumber: String;
function PreviousData(const SearchNumber: String): Boolean;
begin
if OldNumber = '' then LoadStringFromFile(ExpandConstant('{userdocs}\GameEX\keysgame.ini'), OldNumber);
Result := Pos(SearchNumber, OldNumber) > 0;
end;
procedure InitializeWizard();
begin
SerialPage := CreateCustomPage(wpSelectTasks, 'Serial number', 'Please insert serial number');
Block_1 := TNewEdit.Create(nil);
with Block_1 do
begin
Parent := SerialPage.Surface;
SetBounds(ScaleX(96), ScaleY(98), ScaleX(50), ScaleY(21));
Text := '';
MaxLength := 4;
end;
Block_2 := TNewEdit.Create(nil);
with Block_2 do
begin
Parent := SerialPage.Surface;
SetBounds(ScaleX(152), ScaleY(98), ScaleX(50), ScaleY(21));
Text := '';
MaxLength := 4;
end;
Block_3 := TNewEdit.Create(nil);
with Block_3 do
begin
Parent := SerialPage.Surface;
SetBounds(ScaleX(208), ScaleY(98), ScaleX(50), ScaleY(21));
Text := '';
MaxLength := 4;
end;
Block_4 := TNewEdit.Create(nil);
with Block_4 do
begin
Parent := SerialPage.Surface;
SetBounds(ScaleX(265), ScaleY(98), ScaleX(50), ScaleY(21));
Text := '';
MaxLength := 4;
end;
end;
function NextButtonClick(CurPageID:integer): Boolean;
begin
case CurPageID of
SerialPage.ID:
begin
CreateDir(ExpandConstant('{userdocs}\GameEX'));
sNumber := ExpandConstant(Block_1.Text + '-' + Block_2.Text + '-' + Block_3.Text + '-' + Block_4.Text);
SaveStringToFile(ExpandConstant('{userdocs}\GameEX\keysgame.ini'), sNumber, False);
end;
end;
Result := True;
end;
function ShouldSkipPage(PageID: Integer): Boolean;
begin
case PageID of
SerialPage.ID: Result := PreviousData(SERIAL_NUMBER);
end;
end;
Crazy Noise
21-05-2013, 17:48
Единственный его минус, точнее два минуса: будет работать только, если всегда вводится один и тот же серийник, и второй минус - чувствительность к регистру букв в серийнике. »Ну с этим проблем нет, точнее проверка присутствия ключа в файле *.ini не обязательна, т.к сам файл не может быть пустым в любом случае. Потому что файла либо нет совсем, либо есть но с серийным номером, по другому никак. Тут либо инсталлятор создаст серийный номер, либо при запуске игры/прогаммы запросит ввод ключа.
Тут может быть только одно, это проверка присутствия самого файла ini.
by_gangster
21-05-2013, 18:43
Gnom_aka_Lexander, Пришёл домой и скачал с nanozip.net, но там нету скриптов... Где их взять ?
Crazy Noise, ну если так, то можно ограничится только поиском файла. Изменил условие, плюс немного переделал скрипт. Получился короче. Но, опять таки же, не проверял)
[CustomMessages]
MESSAGES_1=Ввод серийного номера
MESSAGES_2=Серийный номер нужен для активации программного обеспечения.
MESSAGES_3=Для активации необходимо ввести серийный номер поставляемый в комплекте с программным обеспечением.
[code]
var
SerialPage: TWizardPage;
Edits: array [1..4] of TEdit;
I, E: Integer;
SerialPage_Label: TNewStaticText;
sNumber: String;
function EditsNumber(): string;
begin
for I := 1 to 4 do
begin
sNumber := sNumber + Edits[I].Text + '-';
end;
sNumber := Copy(sNumber, 1, Length(sNumber) - 1);
Result := sNumber;
end;
procedure InitializeWizard();
begin
SerialPage := CreateCustomPage(wpSelectTasks, CustomMessage('MESSAGES_1'), CustomMessage('MESSAGES_2'));
SerialPage_Label := TNewStaticText.Create(nil);
with SerialPage_Label do
begin
Parent := SerialPage.Surface;
SetBounds(ScaleX(0), ScaleY(0), ScaleX(417), ScaleY(28));
WordWrap := True;
Caption := CustomMessage('MESSAGES_3');
end;
E := ScaleX(73);
for I := 1 to 4 do
begin
Edits[I]:= TEdit.Create(nil);
with Edits[I] do
begin
Parent:= SerialPage.Surface;
SetBounds(0 + (E*I), ScaleY(47), ScaleX(47), ScaleY(21));
MaxLength:= 4;
end;
end;
end;
function NextButtonClick(CurPageID:integer): Boolean;
begin
case CurPageID of
SerialPage.ID:
begin
CreateDir(ExpandConstant('{userdocs}\GameEX'));
SaveStringToFile(ExpandConstant('{userdocs}\GameEX\keysgame.ini'), EditsNumber, False);
end;
end;
Result := True;
end;
function ShouldSkipPage(PageID: Integer): Boolean;
begin
case PageID of
SerialPage.ID: Result := FileExists(ExpandConstant('{userdocs}\GameEX\keysgame.ini'));
end;
end;
Gnom_aka_Lexander
21-05-2013, 18:57
by_gangster, а кто сказал, что там обязаны быть скрипты под инно? я-ж писал - с функциями exec думаю, разберешься без посторонней помощи? в справке к нанозипу однозначно есть пример распаковки командами.
by_gangster
21-05-2013, 19:57
Gnom_aka_Lexander, Короче просто напросто подскажи как сжать игру размером 8.52 ГБ ? У меня сжимет только до 7.20 Гб
Mailchik
21-05-2013, 20:01
Короче просто напросто подскажи как сжать игру размером 8.52 ГБ ? У меня сжимет только до 7.20 Гб »
Короче никак.
----------------------------------------------------------------------------------------------------
Здравствуйте. Моя трабла такова, хочу сделать установочник в котором хотел бы использовать несколько ключей установки, в частности для добавления в различные директории ярлыки программы, подскажите пожалуйста кто чем может. »
Накидал пример..
Если среди ключей запуска есть 'iGroup' - создаётся ярлык в меню пуск, 'iDesktop' - создаётся ярлык на рабочем столе, если оба ключа - создаются оба ярлыка.. Принцип думаю ясен.
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
[Icons]
Name: {group}\test; Filename: {srcexe}; WorkingDir: {src}; IconFilename: {srcexe}; Check: CheckParam('iGroup');
Name: {commondesktop}\test; Filename: {srcexe}; WorkingDir: {src}; IconFilename: {srcexe}; Check: CheckParam('iDesktop');
[Code]
function CheckParam(s: string): boolean;
var
i: integer;
begin
for i := 0 to ParamCount do begin
Result := ParamStr(i) = s;
if Result then Break;
end;
end;
Mailchik, А можно по подробнее? Например в командной строке какой ключ надо ввести чтобы создался ярлык на рабочем столе? Или это опять же через /LOADINF?
Gnom_aka_Lexander
21-05-2013, 20:14
какой ключ надо ввести чтобы создался ярлык на рабочем столе? »
'iDesktop' - создаётся ярлык на рабочем столе »
Mailchik
21-05-2013, 20:15
Aquila, setup.exe iDesktop - создастся ярлык на рабочем столе..
изучите код, который я выше написал.. в секции Icons идёт проверка на каждый ярлык. Для рабочего стола идёт Check: DesktopIcon;, для меню "Пуск" - Check: GroupIcon;
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.