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

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

Автор: 3eJIeHb
Дата сообщения: 10.08.2007 11:14

Цитата:
Подскажите пз как в скрипите задать (схематично или может на готовом примере) последовательность приведенного выше порядка действий (т.е. сначала п1., п2., затем п.3).
И как осуществить п.4 (незнаю как удалять при установке).


Попробуй скачать Inno Setup Scripting v5.1 от Kindly там насколько я помню было что-то подобное написано! [more=Вот код][Setup]
AppName=Timer
AppVerName=Timer
DefaultDirName={pf}\Timer
LicenseFile=license.txt

[Files]
Source: timectrl.dll; Flags: dontcopy

[code]
function starttimer(WizardFormHandle: HWND; ButtonHandle: HWND; ButtonCaption: PChar; RTime: UINT): BOOL;
external 'starttimer@files:timectrl.dll stdcall';

function stoptimer(): BOOL;
external 'stoptimer@files:timectrl.dll stdcall';

procedure InitializeWizard();
begin
WizardForm.LicenseAcceptedRadio.Hide
WizardForm.LicenseNotAcceptedRadio.Hide
WizardForm.LicenseAcceptedRadio.Checked:=True
WizardForm.LicenseMemo.Height:=190
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID=wpLicense then
starttimer(WizardForm.Handle,WizardForm.NEXTBUTTON.Handle,'Далее >',20) //время отсчёта таймера в секундах
else
if (CurPageID=wpWelcome) or (CurPageID=wpSelectDir) then
begin
stoptimer()
WizardForm.NEXTBUTTON.Caption:='Далее >'
end
end;

procedure DeinitializeSetup();
begin
stoptimer()
end;[/more] выполнения задачь по таймеру! А как сделать подругому незнаю.
Автор: SpoinT
Дата сообщения: 10.08.2007 11:19
Что-то в шапке нет еще одной имхо важной утилиты.
Inno Setup Form Designer
Автор: Pacifist
Дата сообщения: 10.08.2007 11:32
3eJIeHb
Сенкс, но увы, по таймеру не пойдет.
Автор: chogo
Дата сообщения: 10.08.2007 14:02
Pacifist
Попробуй новый Inno Setup 5.1.14 вроде как улучшено сжатие LZMA
Цитата:
Updated the LZMA SDK compression code to version 4.49

lzma/ultra64

Но думаю не поможет, сам пробовал паковать Lost Planet с Inno Setup 5.1.12, нормально только 7zip пакует на одну DVD балванку. Ну а так ты правильно расписал методу.
Автор: Genri
Дата сообщения: 10.08.2007 14:53
Pacifist -- я так понимаю, речь идет о самораспаковывающемся архиве? С какими параметрами вызываешь для распаковки в нужную папку?
С чем связано требование распаковки в {app}\temp ? Почему не в {tmp} ? Тогда удалением можно не заморачиваться - удалится само при выходе из сетапа.
Обязательно ли создавать один архив ? Или можно запаковать в разные (первый - общие файлы; второй - нужные только для рус; третий - звук и т.п.) ?
Автор: Pacifist
Дата сообщения: 10.08.2007 16:29
chogo
64 мб словарь это не 256 - эффект не тот.
Побывал Inno Setup 5.1.13 с lzma/ultra64 както медлено работает, камень грузит плохо, на половину, седня с радость про невую версию узнал видать авторы подзаинтиресовались LZMA компрессией, в двух последних версиях основной акцент на LZMA.


Genri
Да с обычными (щас на работе не могу точно сказать), подсмотрел в Руководстве по расширенным возможностям Inno Setup 5 [не для чайников] от Kindly.

Внимательней читай пз, обязательно в оди. Почему не в темп потому что темп может быть на другом диске (я написал про желательное перемещение, а не копирование т.е. вырезал-вставил). Да и плюс в независимости от вариантов установки есть общие (большая часть файлов которые будут распаковываться сразу в {app}.
Если в темп кидать сразу 7 гигов это както напряжно по месту и геморн по времени, лишние движения. А так 6 гигов уже будут там где им положено быть как в моем щас случае с ФИФР.
Конечно можно сделать кучу архивов и задать таск или компонент в зависимости от сценария, но тогда будут однородные данные в разных архивах и степень сжатия будет меньше, смысл теряется.

К слову "о непрерывно компрессии" два перепакованных драйвера нвидиа по отдельности в архивах 7зип весят 50 метров каждый, оба в одном архиве 60!

Автор: Genri
Дата сообщения: 10.08.2007 16:59
Pacifist -- ок. тогда могу предложить использовать "пустышки" (в Руководстве от Kindly есть описание) и скрипт примерно такого вида :
Код:
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[Files]
Source: Files\*; DestDir: "{app}"; Flags: recursesubdirs; BeforeInstall: Unpack; AfterInstall: MoveFiles

[Code]
var
IsUnpacked: Boolean;

procedure Unpack();
var
ResultCode: Integer;
paramstr: string;
begin
if Not IsUnpacked then
begin
paramstr:= '-y -o"' + ExpandConstant('{app}\TMP') + '"';
Exec(ExpandConstant('{src}\archive.exe'), paramstr, '', SW_HIDE,
ewWaitUntilTerminated, ResultCode);
IsUnpacked:= True;
end;
end;

procedure MoveFiles();
var
src, dest: string;
begin
src := ExpandConstant(CurrentFileName);
Delete(src, 1, Length(ExpandConstant('{app}')));
dest:= src;
src := ExpandConstant('{app}\TMP') + src;
dest:= ExpandConstant('{app}') + dest;
RenameFile(src, dest);
end;

procedure DeinitializeSetup();
begin
DelTree(ExpandConstant('{app}\TMP'), True, True, True);
end;
Автор: 3eJIeHb
Дата сообщения: 10.08.2007 17:06
Кстати, MD5 это прога или что-то другое?
Автор: Dioman
Дата сообщения: 10.08.2007 17:26
Вопрос

Как вытащить версию файла из архива без распаковки?

мне нунжо узнать версию длл в sources.
Можно сделать ExtractTemporaryFile, a потом посмотреть его GetVersionNumbers. Есть ли способ сделать это без таких манипуляций?
Автор: Victor_Dobrov
Дата сообщения: 10.08.2007 17:41
Corona Skin & Check System Requirements - Исправлено: Неверная кодировка сообщений в англоязычных Windows. Ошибки в определении памяти более 2Гб. Исключена библиотека get_hw_caps.dll. Скрипт тестировался на ХР, ХР64 eng, Vista32.
Автор: Genri
Дата сообщения: 10.08.2007 17:49
Dioman -- нет. даже используя какие-либо утилиты, они будут временно распаковывать файл. ты ничего не выиграешь.

3eJIeHb -- если ты смотрел объяснение, которое дал SpoinT, то там сказано, что MD5 - это алгоритм хэширования. Другими словами - алгоритм одностороннего шифрования. Т.е. данные можно зашифровать, но из зашифрованной строки нельзя получить исходные данные. Сильно упрощая, можно привести такой пример: подсчитав кол-во символов в слове "Test", мы получим 4. Но зная цифру 4, мы не можем узнать, что начальное слово именно "Test". Это и есть хеширование.

В приведенном примере, можно подобрать огромное кол-во слов, в которых кол-во символов будет равно 4. В отличии от этого, хеш, получаемый по алгоритму MD5, практически уникален. Т.е. если для слова "Test" MD5 хеш будет равен '0cbc6611f5540bd0809a388dc95a615b', то найти другое слово, которое даст такой-же хеш, практически нереально. Это св-во и применяется для хранения паролей. Например:
Твоя программа имеет пароль "Test". Но сам пароль в программе ты не хранишь. В программе есть только хеш ('0cbc6611f5540bd0809a388dc95a615b'). Ты просишь пользователя ввести пароль. Из введенного слова ты получаешь хеш и сравниваешь его с хешем правильного пароля ('0cbc6611f5540bd0809a388dc95a615b'). Если они не совпадают, значит пользователь ввел неправильный пароль. Фишка в том, что программа не знает, что правильный пароль именно "Test". Но по хешу она может определить, когда будет введен правильный.

В инно для получения MD5-хеша используется функция GetMD5OfString.
Kindly -- я как про хеш увидел, так аж ностальгией повеяло


Добавлено:
Pacifist -- кстати, в примере, который я привел есть неточность. Перед перемещением надо удалить файл-пустышку. Иначе RenameFile не сработает. Но общий принцип думаю понятен.
Автор: 3eJIeHb
Дата сообщения: 10.08.2007 19:20
А можно поподробнее описать чё куда, да как вставлять и где я напимер узнаю какой хеш у слова например "Бублик" или какого другого слова?
Автор: NightW0lf
Дата сообщения: 10.08.2007 20:19
3eJIeHb

Цитата:
А можно поподробнее описать чё куда, да как вставлять и где я напимер узнаю какой хеш у слова например "Бублик" или какого другого слова?

Посматри внимательно шапку там в примечание есть калькулятор MD5.
Автор: 3eJIeHb
Дата сообщения: 10.08.2007 20:28

Цитата:
Посматри внимательно шапку там в примечание есть калькулятор MD5.

Хех, спасибо я в начале даже и неувидел!
Автор: Kindly
Дата сообщения: 11.08.2007 11:03
Pacifist, Genri привел пример, но зачем тебе копировать архивы на жесткий диск, "отнимать" место и время, когда можно запустить их на выполнение сразу с диска?

Автор: Chanka
Дата сообщения: 11.08.2007 11:22
Привет всем!
Нужна ваша помощь!
Как можно реализовать следующие.
Возможность создание ярлыка на рабочий стол не через Tasks а через сообщение которое должно появится когда все файлы программы скопируются на компьютер
http://img245.imageshack.us/my.php?image=35273091dz5.jpg
Потом после этого создать новую страницу для установки DirectX
http://img245.imageshack.us/my.php?image=21767283dy4.jpg
Если пользователь отметит не устанавливать DirectX и нажмет Далее должно появится такое сообщение
http://img245.imageshack.us/my.php?image=53587830kn2.jpg
Ну а после обычное окно об окончание установки
http://img245.imageshack.us/my.php?image=30949735qb6.jpg
Автор: chogo
Дата сообщения: 11.08.2007 11:27
Kindly
Выложи готовый скрипт, многим токой уже нужен (игры в последнее время здоровые, на один DVD не влазят если inno паковать, только 7-zip спасает).
Автор: NightW0lf
Дата сообщения: 11.08.2007 11:48
chogo

Цитата:
Выложи готовый скрипт, многим токой уже нужен (игры в последнее время здоровые, на один DVD не влазят если inno паковать, только 7-zip спасает).

Этот скрипт как и многие другие описаны в Руководство по расширенным возможностям Inno Setup 5 [не для чайников] от Kindly.

Если покаким либо причинам невозможно скачать руководство то [more=вот скрипт]
Код: [Setup]
AppName=Need for Speed - Carbon
AppVerName=Need for Speed - Carbon v1.3
DefaultDirName={sd}\Games\NFSCarbon

[Components]
Name: "eng"; Description: "Английская версия"; Flags: exclusive
Name: "rus"; Description: "Русская версия"; Flags: exclusive

[Types]
Name: "custom"; Description: "Выборочная установка"; Flags: iscustom

[Files]
Source: "D:\NFSCarbon\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

[Run]
Filename: "{src}\Rus\NFSC_RUS.exe"; Components: rus; WorkingDir: "{src}\Rus"; Parameters: "-y -o""{app}"""; StatusMsg: "Установка русификации..."; Flags: waituntilterminated
Автор: 3eJIeHb
Дата сообщения: 11.08.2007 12:42
А есть ли прога чтобы загнать MD5 hesh в файл? Например я сделал MD5 код, но теперь мне нужно чтобы этот код был записан в файл в соответсвующей форме. Если есть такая прога, то дайте плз ссылку на скачаивание.
Автор: Sero
Дата сообщения: 11.08.2007 16:44

Цитата:
Как можно реализовать следующие.
Возможность создание ярлыка на рабочий стол не через Tasks а через сообщение которое должно появится когда все файлы программы скопируются на компьютер



Код:
[Code]
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssPostInstall then
begin
if MsgBox('Do you wish to create a shortcut on the Windows Desktop?', mbConfirmation, MB_YESNO)=IDYES then
CreateShellLink(
ExpandConstant('{userdesktop}\Game.lnk'),'',ExpandConstant('{app}\Game.exe'),'','','',
0,SW_SHOWNORMAL);
end
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep=usPostUninstall then
DeleteFile(ExpandConstant('{userdesktop}\Game.lnk'))
end;
Автор: Chanka
Дата сообщения: 11.08.2007 16:58
Sero,
Большое спасибо. А с остальным сможешь помочь?
Автор: Sero
Дата сообщения: 11.08.2007 17:07

Цитата:
Потом после этого создать новую страницу для установки DirectX



Цитата:
Если пользователь отметит не устанавливать DirectX и нажмет Далее должно появится такое сообщение

[more=Код]

Код:
[CustomMessages]
Text1=Vampire: The Masquerade Bloodlines requires Microsoft DriectX 9.0c drivers to run properly. These drivers may not be compatible 'with some video cards and certain display modes.
Text2=DirectX 9.0c will be installed over any previous versions of Dir'ectX, after which you may be instructed to restart your computer'.
YesRadio=Yes, I want to install DirectX now.
NoRadio=No, I do not want to install DirectX at this time.
Text3=Do you want to install DirectX 9.0c?

[Code]
var
Bevel: TBevel;
Text1: TNewStaticText;
Text2: TNewStaticText;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
Text3: TNewStaticText;

function Form_NextButtonClick(Page: TWizardPage): Boolean;
var ResultCode: Integer;
begin
Result:=True
if RadioButton1.Checked then
Exec(ExpandConstant('{src}\DirectX\DXSETUP.EXE'), '/silent', '', SW_SHOW,
ewWaitUntilTerminated, ResultCode)
if RadioButton2.Checked then
begin
if MsgBox('If you do not have DirectX 9.0c or highter, the game will not run properly.'#13+
+'Are you sure you do not want to install DirectX 9.0c at this time?', mbConfirmation,MB_YESNO)=IDNO then
Result:=False
end
end;

function DirectxPage(PreviousPageId: Integer): Integer;
var
Page: TWizardPage;
begin
Page := CreateCustomPage(PreviousPageId,'DirectX','');

Bevel := TBevel.Create(Page);
with Bevel do
begin
Parent := Page.Surface;
Left := ScaleX(8);
Top := ScaleY(136);
Width := ScaleX(385);
Height := ScaleY(73);
Shape := bsFrame;
end;

Text1 := TNewStaticText.Create(Page);
with Text1 do
begin
Parent := Page.Surface;
Caption := ExpandConstant('{cm:Text1}');
Left := ScaleX(8);
Top := ScaleY(8);
Width := ScaleX(389);
Height := ScaleY(38);
AutoSize := False;
TabOrder := 0;
WordWrap := True;
end;

Text2 := TNewStaticText.Create(Page);
with Text2 do
begin
Parent := Page.Surface;
Caption := ExpandConstant('{cm:Text2}');
Left := ScaleX(8);
Top := ScaleY(64);
Width := ScaleX(389);
Height := ScaleY(30);
AutoSize := False;
TabOrder := 1;
WordWrap := True;
end;

RadioButton1 := TRadioButton.Create(Page);
with RadioButton1 do
begin
Parent := Page.Surface;
Caption := ExpandConstant('{cm:YesRadio}');
Left := ScaleX(24);
Top := ScaleY(152);
Width := ScaleX(345);
Height := ScaleY(17);
TabOrder := 2;
Checked := True;
end;

RadioButton2 := TRadioButton.Create(Page);
with RadioButton2 do
begin
Parent := Page.Surface;
Caption := ExpandConstant('{cm:NoRadio}');
Left := ScaleX(24);
Top := ScaleY(176);
Width := ScaleX(337);
Height := ScaleY(17);
TabOrder := 3;
end;

Text3 := TNewStaticText.Create(Page);
with Text3 do
begin
Parent := Page.Surface;
Caption :=
ExpandConstant('{cm:Text3}');
Left := ScaleX(8);
Top := ScaleY(104);
Width := ScaleX(381);
Height := ScaleY(14);
AutoSize := False;
TabOrder := 4;
WordWrap := True;
end;

with Page do
begin
OnNextButtonClick := @Form_NextButtonClick;
end;

Result := Page.ID;
end;


procedure InitializeWizard();
begin
DirectxPage(wpLicense);
end;
Автор: Chanka
Дата сообщения: 11.08.2007 17:36
Sero,
МЕГА РЕСПЕКТ! А как сделать чтобы радио баттон Yes сразу был отмечен. И если поставить нет не устанавливать Direct X и нажать Далее чтобы было такое сообщение http://img245.imageshack.us/my.php?image=53587830kn2.jpg
Автор: Sero
Дата сообщения: 11.08.2007 17:41

Цитата:
А как сделать чтобы радио баттон Yes сразу был отмечен. И если поставить нет не устанавливать Direct X и нажать


Посмотри еще раз Код в моем сообщении, я там переделал!
Автор: Chanka
Дата сообщения: 11.08.2007 18:02
Sero,
Спасибо спасибо спасибо! Еще кое-что
Как при создании ярлыка задать рабочую группу тоесть WorkingDir: {app}
И как в сообщении которое ты добавил если нажать не устанавливать directX сделать чтобы была активна кнопка Нет вместо Да
Автор: Sero
Дата сообщения: 11.08.2007 18:07
Chanka

Цитата:
Как при создании ярлыка задать рабочую группу тоесть WorkingDir: {app}


Код:
CreateShellLink(
ExpandConstant('{userdesktop}\Game.lnk'),'',ExpandConstant('{app}\Game.exe'),'',ExpandConstant('{app}'),'',
0,SW_SHOWNORMAL);
Автор: Chanka
Дата сообщения: 11.08.2007 18:14
Sero,
Еще раз хочу сказать спасибо!
Автор: ANDROID
Дата сообщения: 12.08.2007 11:36
Всем привет.
Вопрос по внешним курсорам, а именно [more=вот сам код]
[Files]
;Курсоры
Source: G:\Program Files\EA GAMES\Battlefield 2\mods\bf2\menu\External\FlashMenu\Cursor\cursor_arrow.ani; DestDir: {tmp}; Flags: dontcopy
Source: G:\Program Files\EA GAMES\Battlefield 2\mods\bf2\menu\External\FlashMenu\Cursor\cursor_wait.ani; DestDir: {tmp}; Flags: dontcopy

[Code]
Const
GCL_HCURSOR = (-12);
OCR_NORMAL = 32512;

var
OriginalWindowsCursor, CursorMain, CursorComponent: Longint;

function LoadCursorFromFile(FileName: String): Longint;
external 'LoadCursorFromFileA@user32 stdcall';

function SetClassLong(hWnd: HWND; Index, NewLong: Longint): Longint;
external 'SetClassLongA@user32 stdcall';

function SetCursor(Cursor: Longint): Longint;
external 'SetCursor@user32 stdcall';

function SetSystemCursor(Cursor, CurType: Longint): Longint;
external 'SetSystemCursor@user32 stdcall';

function GetCursor(): Longint;
external 'GetCursor@user32 stdcall';


procedure InitializeWizard;
begin
OriginalWindowsCursor:= GetCursor;
ExtractTemporaryFile('cursor_arrow.ani');
ExtractTemporaryFile('cursor_wait.ani');
CursorMain:= LoadCursorFromFile(ExpandConstant('{tmp}') + '\cursor_arrow.ani');
CursorComponent:= LoadCursorFromFile(ExpandConstant('{tmp}') + '\cursor_wait.ani');
SetSystemCursor(CursorMain, OCR_NORMAL);
SetClassLong(WizardForm.BackButton.Handle, GCL_HCURSOR, CursorComponent);
SetClassLong(WizardForm.NextButton.Handle, GCL_HCURSOR, CursorComponent);
SetClassLong(WizardForm.CancelButton.Handle, GCL_HCURSOR, CursorComponent);
SetClassLong(WizardForm.DirBrowseButton.Handle, GCL_HCURSOR, CursorComponent);
SetClassLong(WizardForm.GroupBrowseButton.Handle, GCL_HCURSOR, CursorComponent);
end;

procedure DeinitializeSetup();
begin
SetSystemCursor(OriginalWindowsCursor, OCR_NORMAL);
end;
[/more]. Проблема заключается в получение системного курсора, суть в том что при запуск е инсталлятора винда делает курсор ожидания (песочные часы по дефолту) и функция GetCursor получает его в качестве текущего курсора и по завершению работы инсталлера он становится основным системным, а нужно чтобы был тот что по-умолчанию в системе основной... Подскажите, как это обойти.
Автор: GloThin
Дата сообщения: 12.08.2007 12:29
Chanka

Цитата:
И как в сообщении которое ты добавил если нажать не устанавливать directX сделать чтобы была активна кнопка Нет вместо Да

Замени функцию Form_NextButtonClick из кода Sero на следующую:

Код:
function Form_NextButtonClick(Page: TWizardPage): Boolean;
var ResultCode: Integer;
begin
Result:=True
if RadioButton1.Checked then
Exec(ExpandConstant('{src}\DirectX\DXSETUP.EXE'), '/silent', '', SW_SHOW,
ewWaitUntilTerminated, ResultCode)
if RadioButton2.Checked then
begin
if MsgBox('If you do not have DirectX 9.0c or highter, the game will not run properly.'#13+
+'Are you sure you do not want to install DirectX 9.0c at this time?', mbConfirmation,MB_YESNO or MB_DEFBUTTON2)=IDNO then
Result:=False
end
end;
Автор: Chanka
Дата сообщения: 12.08.2007 12:42
GloThin,
СПАСИБО! Теперь всё как надо


Добавлено:
Еще один вопросик. Как сделать чтобы при выходе из установки запускался авторан.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Mail.ru агент - вход не выполнен


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