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

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

Автор: nik1967
Дата сообщения: 27.08.2010 01:20
r1977
Значит используешь ISDone. Правильно прописывай пути в дополнительном модуле ISDone.iss
[more=Справка по ISDone]ISDone.dll v 0.4.2


Библиотека, включающая в себя все необходимое для распаковки и подготовки файлов с помощью
прекомпрессоров посредством инсталлятора InnoSetup, с равномерным отображением всех идущих
операций на одном прогрессбаре. Поддерживаются arc, 7zip, rar, pcf, srep архивы. На будущее
планируется добавить некоторые необходимые функции, а так же возможность параллелизации операций
на многоядерных системах.

Для осуществения работоспособности библиотеки есть 2 вида определения приоритета для каждой
операции на всем прогрессбаре

1) Ручная расстановка процентного отношения времни выполения каждой операции относительно общего.
Заполняется третий параметр каждой функции процентным значением.
Некоторые правила:
-в данном режиме необходимо удалить или закомментировать команды
StartRecord(ExpandConstant('{src}\records.inf'),ChComp); и StopRecord;
-сумма процентов учитывая ветвления (использование компонентов, условий) в скрипте должна
составлять 100, иначе отображение будет неверным;
-у компонентов, для которых возможен выбор только одного из нескольких, должны быть одинаковые
значения процентов;
-компоненты, которые можно выбирать одновременно с другими в одной группе (например несколько
рядом стоящих компонент без флага exclusive) НЕ БУДУТ КОРРЕКТНО ОТОБРАЖАТЬСЯ НА ПРОГРЕССБАРЕ!
Потому что сумма процентов может отличаться от 100.


2) Автоматическая расстановка процентных соотношений в операциях.

правила:
-все третьи параметры функций выставляются нулями;
-до команды "repeat" должна быть StartRecord(ExpandConstant('{src}\records.inf'),ChComp);
имя файла можно менять по своему вкусу;
-после "until true" должна быть команда StopRecord;
-в начале скрипта необходимо закомментировать или удалить строку #define records

инструкция:
-компилится проект и запускается на установку. Все операции должны дойти до конца и завершиться удачно
(прогрессбар будет зашкаливать, так и должно быть);
-после тестового прогона создастся файл records.inf (или какой указали) в указанной папке, его
необходимо добавить в проект, раскомметировав или добавив в начале скрипта #define records
-не удаляйте и не редактируйте команды StartRecord и StopRecord! Без них ничего работать не будет!
-скомпилировать проект

Примечание: при тестовом прогоне вне зависимости от выбранных компонентов, они все будут установлены.
Это сделано для определения времени распаковки каждого из них.

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


Для справки: Закомментировать строку - значит добавить в ее начало ";" или "//" без кавычек. Если в
компиляторе строка зеленая - значит она закомментирована, и не будет выполняться.
#ifdef и #endif - это условные операторы. Если до них было например задано #define records, то все
команды в промежутке #ifdef records ..... #endif будут скомпилированы, если же закомментировать
#define records, то эти команды компилятор просто пропустит.


В данном архиве также Вы можете найти папку Modules, содержащую различные комбинации включеных в библиотеку
модулей. Это сделано для уменьшения размера инсталляций, если какие-то модули не требуются в проекте. Чтобы
использовать какой-либо из этих вариантов, необходимо переименовать его в isdone.dll и заменить полученным
файлом исходную isdone.dll.



Описание функций библиотеки:

описание значений, которые используются в большинсте функций:

CurComponent - порядковый номер компонента, при отметке которого выполнится данная функция. Если этот компонент
будет не активен, dll пропустит данную фунцию и приступит к следующей. Ноль указывает на то, что выполнение
текущей функции не будет зависеть от компонентов;
OveralPct - переменная, которая передается от функции в функции, содержит текущее значение выполненного процента
распаковки, умноженное на 10;
PctOfTotal - используется при ручном задании процентов, иначе ставится ноль. Указывает какую часть прогрессбара
займет текущая операция;
DeleteInFile - определяет удалять ли входной файл после завершения операции. Если true - удалять, false - нет;
callback - функция куда dll передает управление раз в определенный промежуток времени. Служит для обновления
информации на прогрессбаре;
Password - пароль для распаковки arc, 7zip, rar архивов. На данный момент для .arc не поддерживается;

все возращаемые функциями значения имеют тип BOOL, т.е. если функция вернула false, значит что-то прошло не так
и надо отменять распаковку. Если вернула true - все ок.


function ISArcExtract(CurComponent:longword; var OveralPct:integer; PctOfTotal:double; InName, OutPath: string;
DeleteInFile:boolean; callback: longword; Password, CfgFile, WorkPath: String):BOOL;
Распаковывает .arc архив, заданный именем файла и каталогом в InName, в каталог, указанный в OutPath.
CfgFile - путь и имя конфигурационного файла (arc.ini). Обычно не требуется;
WorkPath - рабочий путь для распаковки временных файлов freearc'ом. Обычно не требуется;



function IS7ZipExtract(CurComponent:longword; var OveralPct:integer; PctOfTotal:double; InName, OutPath: string;
DeleteInFile:boolean; callback: longword; Password: String):BOOL;

Распаковывает 7-zip архив, заданный именем файла и каталогом в InName, в каталог, указанный в OutPath.


function ISRarExtract(CurComponent:longword; var OveralPct:integer; PctOfTotal:double; InName, OutPath: string;
DeleteInFile:boolean; callback: longword; Password: String):BOOL;
Распаковывает .rar архив, заданный именем файла и каталогом в InName, в каталог, указанный в OutPath.
Поддерживаются multi-volume архивы. Все тома должны находится рядом с первым.
Для работы требуется библиотека unrar.dll. Чтобы ее включить в проект в начале скрипта необходимо
раскомментировать или дописать строку: #define unrar


function ISPrecompExtract(CurComponent:longword; var OveralPct:integer; PctOfTotal:double; InName,
OutFile: string;DeleteInFile:boolean; callback: longword):BOOL;
Распаковывает pcf архив, заданный именем файла и каталогом в InName, в файл, указанный в OutFile.
Поддерживаются версии pcf файлов, созданные precomp v0.38 и precomp v0.4. Для работы требуются дополнительные
файлы. Если пользуетесь первым варинтом в начале скрипта необходимо прописать #define precomp038 и
закомментировать или удалить #define precomp04. Если же пользщуетесь precomp v0.4, в начале скрипта
прописываете #define precomp04 и комментируете или удаляете #define precomp038


function ISSRepExtract(CurComponent:longword; var OveralPct:integer; PctOfTotal:double; InName, OutFile,
IdxFile: string; DeleteInFile:boolean; callback: longword):BOOL;
Распаковывает srep архив версии 1.5, заданный именем файла и каталогом в InName, в файл, указанный в OutFile.
IdxFile - указывается индексный файл для srep. Если еще в момент упаковки был активирован этот параметр, кроме
srep файла будет создан отдельно индексный файлб вот его то здесь и указываем. Если же такая опция не была
использована, подставляем пустую строку


function ShowChangeDiskWindow(Text, DefaultPath, SearchFile:string):BOOL;

Показывает диалог с запросом Следующего диска и ожиданием появления в DefaultPath файла, указанного SearchFile.
Свой текст можно указать значением Text;
DefaultPath - должен обязательно указывать {src}, иначе работоспособность не гарантируется;
SearchFile - файл, который каждые 0,2 секунды ищется по указанному пути;
Существует возможность в запросе сменить путь на другой, и если там будет найден SearchFile, то все последующие
{src} в функциях будут идентифицироваться как указанный в данном диалоге путь.


function StartRecord(RecordFileName:string; AllComponents:longword):BOOL;

Необходим для автоматического определения приоритета в расположении на прогрессбаре для каждой операции.
В тестовом прогоне RecordFileName задает путь и файл куда будут сохранены приоритеты. Просле тестового прогона
и подключеном в проект файле RecordFileName данная команда указывает какой файл искать рядом с dll, пути
игнорируются.
AllComponents - данные для dll о выбранных компонентах, зашифрованные в двоичную систему. В тестовом прогоне
не используются, т.к. там в любом случае распаковываются все компоненты. После тестового прогона совместно с
recods.inf (или любым заданным в RecordFileName) служит для определения какие операции пропустятся и сколько %
будет распределено на все операции, которые будут точно выполнены в процессе установки.


function CheckPoint(CurComponent:Integer):BOOL;

На текущий момент не требуется. Все контрольные точки при автоматическом распределении процентов делаются
внутри выполняемых операций. Оставил на всякий случай


function StopRecord:BOOL;
При тестовом проходе рассчитывает все данные по чекпоинтам и записывает в файл, заданный в StartRecord.



История версий:

ISDone.dll v 0.4.2.5

Unarc модуль (ISArcExtract):
- обновлен unarc.dll до версии 0,67a;
- в соответствии с предыдущим пунктом стало возможным выводить более подробный отчет о возникшей
проблеме в случае возникновения ошибки при распаковке .arc архивов.



ISDone.dll v 0.4.2

ОБЩЕЕ:
- исправлено отображение запроса следующего диска со скинами цветами отличным от стандартных
(На черных скинах не видно было текста окна запроса);
- снова вставил свои переделанные системные библиотеки для уменьшения размера. Вроде на этот раз должно
обойтись без происшествий
Unarc модуль (ISArcExtract):
- добавлен вывод основных сообщений об ошибках, при некорректном завершении операции в unarc.dll.
7ZIP модуль (IS7ZipExtract):
- добавлено корректное отображение распаковываемых в текущий момент файлов при извлечении 7z-архивов
(спасибо Expeditor'у за подсказку (пинок), а то так руки (ноги) до этого и не дошли бы)
Скрипт:
- все строковые параметры заменены на AnsiString. Без этого библиотека отказывалась работать на unicode
версии InnoSetup (за совет спасибо K9000);
- сделал хоть какую-то финишную страницу при ошибке, а то некоторые прям и используют этот тестовый
скрипт в своих репаках).



ISDone.dll v 0.4.1

7ZIP модуль (IS7ZipExtract):
- обновил 7z.dll до версии 9.15b

ОБЩЕЕ:
- исправлен баг с нежеланием dll'ки выводить окно запроса следующего диска при более чем 2х дисках
в проекте (за баг-репорт спасибо TechneS);
- увеличена в 1000 раз точность внутренней переменной, содержащей общее текущее количество процентов
и передаваемой от операции к операции (OveralPct). Позволяет избежать погрешность в расчетах
процентов (за баг-репорт спасибо TechneS);
- увеличена в 100 раз точность записей в records.inf в автоматическом распределении процентов.
Сделано для подгонки точности с предыдущим пунктом. Осторожней при смене на новую dll в готовых
проектах со старым records.inf. Тестовый прогон придется делать заново!
- в архив добавлена папка Modules, содержащая различные комбинации включеных в библиотеку модулей;
Сделано для уменьшения размера инсталляций, если какие-то модули не требуются в проекте.
Чтобы использовать какой-либо из этих вариантов, необходимо переименовать его в isdone.dll и
заменить полученным файлом стандартную isdone.dll.


ISDone.dll v 0.4

RAR модуль (ISRarExtract):
- добавлена поддержка .rar архивов, включая multi-volume. Все тома должны находиться рядом с
первым на одном диске;

Unarc модуль (ISArcExtract):
- добавлена возможность задавать рабочий каталог для распаковки freearc;
- изменено название функции с ISUnarcExtract на ISArcExtract. Осторожней со старыми скриптами!

Скрипт:
- процесс установки перенесен в момент ssInstall, в связи с чем возникла необходимость в следующем
пункте;
- с помощью TechneS (спасибо ему за это) был упрощен скрипт добавлением условных операторов
#define, #ifdef, #endif и некоторых других мелких деталей. Теперь нет необходимости менять
в нескольких местах компилить ли в проект файлы records.inf, precomp04.exe и т.д. или нет;
- практически все комментарии перенесены в файл readme.txt, так же туда добавлено более подробное
описание каждой функции;

ОБЩЕЕ:
- добалена поддержка компонентов. Отключить использование компонентов можно просто закомментировав
в начале скрипта строку: #define Components;
- добавлена функция на запрос следующего диска с автоматическим слежением за входным путем на
предмет появления там заданного файла;
- полностью пеработан блок создания автоматического распределения процентов на прогрессбар, в
связи с чем исправлены небольшие баги;


ISDone.dll v 0.3.2

7ZIP модуль (IS7ZipExtract):
- исправлен баг с невозможностью распаковать архивы более определенной длнины.
Это было связано с криво переписанными системными библиотеками, чтобы не возиться
вернул все системные библиотеки на место, что снова увеличило dll на 20кб


ISDone.dll v 0.3.1

Unarc модуль (ISUnarcExtract):
- исправил баг с возникающими ошибками при распаковке некоторых архивов
7ZIP модуль (IS7ZipExtract):
- исправил баг с ошибкой при распаковке нескольких 7z архивов в одном скрипте

ОБЩЕЕ:
- мелкие корректировки в коде, удаляющие некоторые дефекты (все ДОЛЖНО работать стабильнее,
но не факт, что будет )


ISDone.dll v 0.3

Unarc модуль (ISUnarcExtract):
- собственно он и добавлен, и включен в состав библиотеки ISDone.dll, соответвенно никаких
дополнительных файлов не требуется

ОБЩЕЕ:
- по просьбам трудящихся реализовно 2 типа подготовки процентных соотношений всех операций:
1)ручная и 2)автоматическая с тестовым прогоном. Подробности внизу скрипта;
- исправлен баг с путями файла records.inf;
- исправлен баг с иногда возникающей ошибкой при нажатии отмены в процессе распаковки 7zip;
- увеличил обновление окна инсталера до 40 раз в секунду.


ISDone.dll v 0.2

ZIP модуль (ISZipExtract):
-удален из-за большого числа багов и из-за сомнительной нужности, вместо него пакуйте 7zip'ом

7ZIP модуль (IS7ZipExtract):
- 7z.dll включен в состав моей библиотеки, так что теперь не требуется добавлять его в проект

SRep модуль (ISSrepExtract):
- srep v 1.5 включен в состав моей библиотеки, теперь не требуется добавлять srep.exe в проект

ОБЩЕЕ:
- практически полностью автоматизирована система процентного распределения прогрессбара на
каждую операцию относительно общего времени выполнения всех опрераций
- исправлены баги с вылетающими ошибками в конце установки (По крайней мере при моих испытаниях
больше ошибок не было. Оказывается при выходе из процедур все динамические переменные
типа string и др. или хэндлы,с которыми работала dll, должны быть очищены (в смысле
освобождена используемая ими память)
- переписал некоторые системные библиотеки в исходниках, что дало выигрыш в размере кода 20Кб
- сделал постоянное обновление окна инсталера 20раз в секунду во всех модулях независимо от
действий распаковщика


ISDone.dll v 0.1

ZIP модуль (ISZipExtract):
-не поддерживаются архивы более 4Гб
-не обрабатываются архивы с паролями
-не обрабатываются multi volume архивы
7ZIP модуль (IS7ZipExtract):
-не поддерживаются multi volume архивы

Скрипт:
-при запуске скрипта прямо из компилятора InnoSetup после всех операций распаковки и нажатия
кнопки "Finish" иногда вылетает ошибка о невозможности чтения какого-то адреса.[/more]
Автор: r1977
Дата сообщения: 27.08.2010 01:23
nik1967
Куда прописывать пути в этом дополнительном модуле ISDone.iss?
[more][UninstallDelete]
Type: filesandordirs; Name: {app}

[Code]
var
LabelPct, LabelCurrFileName, LabelStatusRollback, LabelStatus: TLabel;
ISDoneProgressBar: TNewProgressBar;
CancelUnpackingBtn: HWND;
OveralPct,Cancel, n:integer;
CallBack:longword;
MyError:boolean;
pr:Extended;
msgError: string;
ISDonePB: TImgPB;

type
TCallback = function (Pct: integer;CurrentFile:string): longword;

TMessage = record hWnd: HWND; msg, wParam: Word; lParam: LongWord; Time: TFileTime; pt: TPoint; end;

function PeekMessage(var lpMsg: TMessage; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
function TranslateMessage(const lpMsg: TMessage): BOOL; external 'TranslateMessage@user32.dll stdcall';
function DispatchMessage(const lpMsg: TMessage): Longint; external 'DispatchMessageA@user32.dll stdcall';
function WrapMyCallback(callback:TCallback; paramcount:integer):longword;external 'wrapcallback@files:innocallback.dll stdcall';
function ISArcExtract(CurComponent:longword; var OveralPct:integer; PctOfTotal:double; InName, OutPath: string; DeleteInFile:boolean; callback: longword; Password, CfgFile, WorkPath: String):BOOL; external 'ISArcExtract@files:ISDone.dll stdcall';
function IS7ZipExtract(CurComponent:longword; var OveralPct:integer; PctOfTotal:double; InName, OutPath: string; DeleteInFile:boolean; callback: longword; Password: String):BOOL; external 'IS7zipExtract@files:ISDone.dll stdcall';
function ISRarExtract(CurComponent:longword; var OveralPct:integer; PctOfTotal:double; InName, OutPath: string; DeleteInFile:boolean; callback: longword; Password: String):BOOL; external 'ISRarExtract@files:ISDone.dll stdcall';
function ISPrecompExtract(CurComponent:longword; var OveralPct:integer; PctOfTotal:double; InName, OutFile: string; DeleteInFile:boolean; callback: longword):BOOL; external 'ISPrecompExtract@files:ISDone.dll stdcall';
function ISSRepExtract(CurComponent:longword; var OveralPct:integer; PctOfTotal:double; InName, OutFile, IdxFile: string; DeleteInFile:boolean; callback: longword):BOOL; external 'ISSrepExtract@files:ISDone.dll stdcall';
function ShowChangeDiskWindow(Text, DefaultPath, SearchFile:string):BOOL; external 'ShowChangeDiskWindow@files:ISDone.dll stdcall';
function StartRecord(RecordFileName:string; AllComponents:longword):BOOL; external 'StartRecord@files:ISDone.dll stdcall';
function CheckPoint(CurComponent:Integer):BOOL; external 'CheckPoint@files:ISDone.dll stdcall';
function StopRecord:BOOL; external 'StopRecord@files:ISDone.dll stdcall';
function GetWindowLong(hWnd, nIndex: Integer): Longint; external 'GetWindowLongA@user32 stdcall delayload';
function SetWindowText(hWnd: Longint; lpString: AnsiString): Longint; external 'SetWindowTextA@user32 stdcall delayload';
function cm(Message: String): String; Begin Result:= ExpandConstant('{cm:'+ Message +'}') End;

Procedure SetTaskBarTitle(Title: AnsiString); var h: Integer;
begin
h:= GetWindowLong(MainForm.Handle, -8); if h <> 0 then SetWindowText(h, Title);
end;

procedure AppProcessMessage;
var
Msg: TMessage;
begin
while PeekMessage(Msg, 0, 0, 0, 1) do begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;

function ProgressCallback(Pct: integer; CurrentFile:string): longword;
begin
ImgPBSetPosition(ISDonePB,Pct/10);
LabelPct.Caption :=ExpandConstant('{cm:AllProgress} ')+IntToStr(Pct div 10)+'.'+IntToStr(Pct mod 10)+'%';
LabelCurrFileName.Caption :=ExpandConstant('{app}\')+CurrentFile;
AppProcessMessage;
Result := Cancel;
ImgApplyChanges(WizardForm.Handle);
if GetTickCount-LastTimerEvent>5000{5 &#241;&#229;&#234;&#243;&#237;&#228;} then begin
LastTimerEvent:= GetTickCount;
ImgSetVisibility(AImg[CurrentImage],False);
CurrentImage:=CurrentImage+1;
if CurrentImage=GetArrayLength(AImg) then CurrentImage:=0;
ImgSetVisibility(AImg[CurrentImage],True);
end;
end;

procedure Error;
var n:integer;
begin
Cancel:= -1;
Exec(ExpandConstant('{uninstallexe}'), '/SILENT','', sw_Hide, ewWaitUntilTerminated, n);
end;

procedure CreateISDoneComponents;
begin
LabelPct := TLabel.Create(WizardForm);
with LabelPct do begin
AutoSize:=False;
SetBounds(ScaleX(120), ScaleY(355), ScaleX(560), ScaleY(17));
Alignment := taCenter;
Transparent:=True;
Font.Name:= 'Georgia'
Font.Size:= 10;
Font.Color:=$FFFFFF;
Font.Style:=[fsBold,fsItalic];
Parent := WizardForm;
end;
LabelCurrFileName := TLabel.Create(WizardForm);
with LabelCurrFileName do begin
AutoSize:=False;
SetBounds(ScaleX(119), ScaleY(270), ScaleX(560), ScaleY(17));
Transparent:=True;
Font.Name:= 'Georgia'
Font.Size:= 10;
Font.Color:=$FFFFFF;
Font.Style:=[fsBold,fsItalic];
Caption:= '';
Parent := WizardForm;
Hide;
end;
LabelStatusRollback := TLabel.Create(WizardForm);
with LabelStatusRollback do begin
Parent := WizardForm;
AutoSize := False;
SetBounds(ScaleX(120), ScaleY(245), ScaleX(400), ScaleY(17));
Transparent:=True;
Font.Name:= 'Georgia';
Font.Size:= 11;
Font.Color:=$FFFFFF;
Font.Style:=[fsBold,fsItalic];
Caption := cm('TitleBack');
end;
LabelStatus := TLabel.Create(WizardForm);
with LabelStatus do begin
Parent := WizardForm;
AutoSize := False;
SetBounds(ScaleX(120), ScaleY(245), ScaleX(400), ScaleY(17));
Transparent:=True;
Font.Name:= 'Georgia';
Font.Size:= 10;
Font.Color:=$FFFFFF;
Font.Style:=[fsBold,fsItalic];
Caption := cm('ArcTitle');
end;
end;

procedure CancelUnpackingOnEnter(hBtn:HWND);
begin
sndPlaySound(ExpandConstant('{tmp}\WFEnter.wav'),$0001);
end;

procedure CancelUnpackingOnClick(hBtn:HWND);
begin
sndPlaySound(ExpandConstant('{tmp}\Click.wav'),$0001);
if MsgBox( SetupMessage( msgExitSetupMessage ), mbConfirmation, MB_YESNO ) = IDYES then Cancel:= 1;
end;

Procedure UnpackingISDoneFinished(CurPageID: Integer);
begin
if (CurPageID = wpFinished) and (Cancel <> 0) then
begin
WizardForm.Caption:= ExpandConstant('{cm:ISDoneError}');
SetTaskBarTitle(SetupMessage(msgErrorTitle));
FinishedHeadingLabel.Caption:=cm('FinishedHeading1');
FinishedHeadingLabel.Font.Color:= $0000C0; // red (&#234;&#240;&#224;&#241;&#237;&#251;&#233;)
FinishedLabel.Caption:= msgError + ExpandConstant(' {cm:Trouble}') + #10#13#10#13+ExpandConstant('{cm:FinishedLabel2}');
FinishedLabel.Font.Color:= $0000C0; // red (&#234;&#240;&#224;&#241;&#237;&#251;&#233;)
end;
CancelUnpackingBtn:=BtnCreate(WizardForm.Handle,ScaleX(652),ScaleY(487),ScaleX(111),ScaleY(39),ExpandConstant('{tmp}\button.png'),18,False);
BtnSetEvent(CancelUnpackingBtn,BtnMouseEnterEventID,WrapBtnCallback(@CancelUnpackingOnEnter,1));
BtnSetEvent(CancelUnpackingBtn,BtnClickEventID,WrapBtnCallback(@CancelUnpackingOnClick,1));
BtnSetFont(CancelUnpackingBtn,WFButtonFont.Handle);
BtnSetFontColor(CancelUnpackingBtn,$DAE369,$DAE369,$DAE369,$B6B6B6);
BtnSetCursor(CancelUnpackingBtn,GetSysCursorHandle(32649));
BtnSetVisibility(CancelUnpackingBtn, False);
end;

procedure UnpackingISDone(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
if MyError then Error;
if CurStep = ssInstall then begin
ISDonePB:=ImgPBCreate(WizardForm.Handle, ExpandConstant('{tmp}\ProgressBackground.png'), ExpandConstant('{tmp}\ProgressImg.png'),ScaleX(119),ScaleY(300),ScaleX(460),ScaleY(25));
NewPB:=ImgPBCreate(WizardForm.Handle, ExpandConstant('{tmp}\ProgressBackground2.png'), ExpandConstant('{tmp}\ProgressImg.png'),ScaleX(581),ScaleY(300),ScaleX(98),ScaleY(25));
ImgApplyChanges(WizardForm.Handle);
PBOldProc:=SetWindowLong(WizardForm.ProgressGauge.Handle,-4,CallBackProc(@PBProc,4));
LabelStatus.Show;
BtnSetText(CancelUnpackingBtn,WizardForm.CancelButton.Caption);
BtnSetVisibility(CancelUnpackingBtn, True);
BtnSetVisibility(hCancelBtn, False);
LabelPct.Show;
LabelCurrFileName.Show;
ProgressInfoLabel.Hide;
CallBack:=WrapMyCallback(@ProgressCallback,2);
Cancel:=0;
OveralPct:=0;

// &#208;&#224;&#241;&#239;&#224;&#234;&#238;&#226;&#234;&#224; &#226;&#241;&#229;&#245; &#237;&#229;&#238;&#225;&#245;&#238;&#228;&#232;&#236;&#251;&#245; &#244;&#224;&#233;&#235;&#238;&#226; &#226; &#239;&#224;&#239;&#234;&#243; {tmp}. &#221;&#242;&#238; &#237;&#229;&#238;&#225;&#245;&#238;&#228;&#232;&#236;&#238; &#228;&#235;&#255; &#242;&#238;&#227;&#238;, &#247;&#242;&#238;&#225;&#251;
//&#226;&#251;&#239;&#238;&#235;&#237;&#255;&#242;&#252; &#243;&#241;&#242;&#224;&#237;&#238;&#226;&#234;&#243; &#226; &#236;&#238;&#236;&#229;&#237;&#242; ssInstall, &#232; &#241;&#229;&#234;&#246;&#232;&#255; [Run] &#226;&#251;&#239;&#238;&#235;&#237;&#255;&#235;&#224;&#241;&#252; &#239;&#238;&#241;&#235;&#229; &#243;&#241;&#242;&#224;&#237;&#238;&#226;&#234;&#232;.
#ifdef records
ExtractTemporaryFile('records.inf');
#endif
#ifdef precomp04
ExtractTemporaryFile('packjpg_dll.dll');
ExtractTemporaryFile('RTconsole.exe');
ExtractTemporaryFile('precomp04.exe');
#endif
#ifdef precomp038
ExtractTemporaryFile('packjpg_dll.dll');
ExtractTemporaryFile('RTconsole.exe');
ExtractTemporaryFile('precomp038.exe');
ExtractTemporaryFile('zlib1.dll');
#endif
#ifdef unrar
ExtractTemporaryFile('Unrar.dll');
#endif

StartRecord(ExpandConstant('{src}\records.inf'),0);
repeat
MyError:=true;
if not ISArcExtract ( 0, OveralPct, 0, ExpandConstant('{src}\Data.bin'), ExpandConstant('{app}\Data.pcf'), false,CallBack, '', '', '') then break;
//if not ISArcExtract ( 0, OveralPct, 0, ExpandConstant('{src}\Data2.bin'), ExpandConstant('{app}'), false,CallBack, '', '', '') then break;
//if not ISSRepExtract ( 0, OveralPct, 0, ExpandConstant('{app}\Data.srp'), ExpandConstant('{app}\Data.pcf'), '', true, CallBack ) then break;
if not ISPrecompExtract( 0, OveralPct, 0, ExpandConstant('{app}\Data.pcf'), ExpandConstant('{app}\Data.7z'), true, CallBack ) then break;
if not IS7ZipExtract ( 0, OveralPct, 0, ExpandConstant('{app}\Data.7z'), ExpandConstant('{app}'), true, CallBack, '' ) then break;
//if not ISArcExtract ( 0, OveralPct, 0, ExpandConstant('{src}\Data1.bin'), ExpandConstant('{app}'), false,CallBack, '', '', '') then break;
// if not ShowChangeDiskWindow('&#207;&#238;&#230;&#224;&#235;&#243;&#233;&#241;&#242;&#224;, &#226;&#241;&#242;&#224;&#226;&#252;&#242;&#229; &#228;&#232;&#241;&#234; 2 &#232; &#228;&#238;&#230;&#228;&#232;&#242;&#229;&#241;&#252; &#229;&#227;&#238; &#232;&#237;&#232;&#246;&#232;&#224;&#235;&#232;&#231;&#224;&#246;&#232;&#232;.', ExpandConstant('{src}'),'CODMW2_Disk2.arc' ) then break;
// if not ISArcExtract ( 1, OveralPct, 0, ExpandConstant('{src}\rustext.arc'), ExpandConstant('{app}'), false,CallBack, '', '', '') then break;
// if not ISArcExtract ( 2, OveralPct, 0, ExpandConstant('{src}\engtext.arc'), ExpandConstant('{app}'), false,CallBack, '', '', '') then break;
// if not ISArcExtract ( 3, OveralPct, 0, ExpandConstant('{src}\rusvoice.arc'),ExpandConstant('{app}'), false,CallBack, '', '', '') then break;
// if not ISArcExtract ( 4, OveralPct, 0, ExpandConstant('{src}\engvoice.arc'),ExpandConstant('{app}'), false,CallBack, '', '', '') then break;
MyError:=false;
until true;
StopRecord;
BtnSetVisibility(CancelUnpackingBtn, False);
BtnSetVisibility(hCancelBtn, True);
BtnSetEnabled(hCancelBtn, False);
LabelStatus.Hide;
LabelPct.Hide;
LabelCurrFileName.Hide;
ProgressInfoLabel.Show;
end;
end;[/more]
Автор: nik1967
Дата сообщения: 27.08.2010 01:46
r1977
Вроде всё правильно. А до того. как физикс прописал, нормально распаковывалось?
Автор: r1977
Дата сообщения: 27.08.2010 02:11
nik1967
Вроде стало нормально, нашел несколько ошибок, только как узнать установился физикс или нет
Автор: demonikSKR
Дата сообщения: 27.08.2010 08:22
пипл, ну подскожите плз, как повесить обработку чекбокса
[Tasks]
....
Name: My; Description: " My файлы (*.my) "; GroupDescription: "Ассоциировать"; Components: "main"; Flags: unchecked;
на последней странице инсталяшника My должен быть чекнут и рид-онли, т.е. пользователь не мог его изменить

Автор: AJIeKc89
Дата сообщения: 27.08.2010 09:47
Подскажите, как убрать рамки вокруг кнопок!

http://ipicture.ru/uploads/100827/d4o67vRXgZ.gif

Что-бы было как здесь.

http://ipicture.ru/uploads/100827/GIERGuIKVt.gif

Автор: miromax911
Дата сообщения: 27.08.2010 10:01
freestyle1309
Я прогой извлёк файл из инсталла, compilecode.bin. Это не оно?)
Автор: Alexander61434
Дата сообщения: 27.08.2010 10:13
miromax911, это он. Но текстом у тебя его не получиться достать.
Автор: vint56
Дата сообщения: 27.08.2010 11:35
boss911 [more=вот]
#define AppRunningFile "{app}\MyProg.exe"
;Путь к файлу, который запускается после установки

[Setup]
AppId={{B4866999-9FF1-4780-A2E9-A952A5E7BBCA}
AppName=Perlink for Magnets Dc Hub
AppVerName=Perlink 5.48
DefaultDirName={pf}\Perlink for Magnets Dc Hub

[Languages]
Name: ru; MessagesFile: compiler:Languages\Russian.isl

[CustomMessages]
ru.RunProgram=Запустить {#SetupSetting("AppName")}

[Files]
Source: C:\Program Files\Inno Setup 5\Examples\MyProg.exe; DestDir: {app}

[Code]
var
PageNameLabel, PageDescriptionLabel: TLabel;
RunProgram: TCheckBox; //Чекбоксы
RunProgramLabel: TLabel;
PageID,ResultCode: Integer; //Запуск программы после установки

function Run: Boolean;
begin
Result:=RunProgram.Checked;
end;

procedure RunProgramOnClick(Sender: TObject);
begin
if RunProgram.Checked = False then
RunProgram.Checked:= True else
RunProgram.Checked:= False;
end;

procedure InitializeWizard();
begin
with WizardForm.WelcomeLabel2 do
begin
Left := ScaleX(85);
Width := ScaleX(400);
end;

with WizardForm.WelcomeLabel1 do
begin
Left := ScaleX(85);
Width := ScaleX(400);
end;

with WizardForm.FinishedLabel do
begin
Left := ScaleX(85);
Width := ScaleX(400);
end;

with WizardForm.FinishedHeadingLabel do
begin
Left := ScaleX(85);
Width := ScaleX(400);
end;

with WizardForm do begin
WizardBitmapImage.SetBounds(ScaleX(0), ScaleY(0), ScaleX(70), ScaleY(314));
WizardBitmapImage2.SetBounds(ScaleX(0), ScaleY(0), ScaleX(70), ScaleY(314));
WizardSmallBitmapImage.SetBounds(ScaleX(0), ScaleY(0), ScaleX(497), ScaleX(58));
end;

WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;

PageNameLabel:= TLabel.Create(WizardForm);
PageNameLabel.SetBounds(ScaleX(10), ScaleY(10), ScaleX(300), ScaleY(20));
PageNameLabel.Parent:= WizardForm.MainPanel;
PageNameLabel.Transparent:= True;
PageNameLabel.Font.Style:= [fsBold]
PageNameLabel.Font.Color:= clWhite;

PageDescriptionLabel:= TLabel.Create(WizardForm);
PageDescriptionLabel.SetBounds(ScaleX(40), ScaleY(25), ScaleX(300), ScaleY(30));
PageDescriptionLabel.Parent:= WizardForm.MainPanel;
PageDescriptionLabel.Transparent:= True;
PageDescriptionLabel.Font.Color:= clWhite;

RunProgram:= TCheckBox.Create(WizardForm);
with RunProgram do
begin
Parent:= WizardForm.FinishedPage;
Left:= ScaleX(176);
Top:= ScaleY(200);
Width:= ScaleX(14);
Height:= ScaleY(14);
TabOrder:= 4;
Checked:= False; //отключен четбокс
// Checked:= False; //включен четбокс
end;
RunProgramLabel:= TLabel.Create(WizardForm);
with RunProgramLabel do
begin
Caption:=ExpandConstant('{cm:RunProgram}');
Left:= ScaleX(196);
Top:= ScaleY(200);
Width:= ScaleX(150);
Height:= ScaleY(13);
Transparent := True;
Parent:= WizardForm.FinishedPage;
OnClick:= @RunProgramOnClick;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
PageNameLabel.Caption:= WizardForm.PageNameLabel.Caption
PageDescriptionLabel.Caption:= WizardForm.PageDescriptionLabel.Caption
PageID:=CurPageID;
begin
if CurPageID=wpFinished
then
if CurPageID=wpFinished
then
end;
end;

procedure DeinitializeSetup();
begin
if (PageID=wpFinished) and (RunProgram.Checked)
then Exec(ExpandConstant('{#AppRunningFile}'), '', '', SW_SHOWNORMAL, ewNoWait, ResultCode); //Запускает файл если на финишной странице выбран чекбокс
end;[/more]
Автор: Stall_JM
Дата сообщения: 27.08.2010 12:48
Народ здраствуйте,научился распаковывать АРК но вот проблема
ЧТо прописать в скрипте чтобы PCF файлы созданные прекомпом(Делал в утиле Pakers show) переходили в нормальное расширение
ПОдробнее Взял игру 747 мб,обработал прекомпом,засунул в арк,при распаковке
PCF не перегоняется в прежний формат.
Автор: Obaldensky
Дата сообщения: 27.08.2010 14:54
Неужто никто не знает, как сделать в окне выбора компонента простую надпись ?
Автор: geroinnn_one
Дата сообщения: 27.08.2010 15:40
Всем доброго дня.

Что надо исправить в скрипте, чтобы на первой и последней странице буквы были белым цветом


Код:
[Files]
Source: "img1.bmp"; Flags: dontcopy
Source: "img2.bmp"; Flags: dontcopy

[Code]
var MainImage : TBitmapImage;
FinishedImage: TBitmapImage;

procedure InitializeWizard();
begin
ExtractTemporaryFile('img1.bmp');
MainImage := TBitmapImage.Create(WizardForm);
with MainImage do
begin
Parent := WizardForm;
Left := 0;
Top := 0;
Width := 500;
Height := 313;
Bitmap.LoadFromFile(ExpandConstant('{tmp}\img1.bmp'));
end;

ExtractTemporaryFile('img2.bmp');
FinishedImage := TBitmapImage.Create(WizardForm);
with FinishedImage do
begin
Parent := WizardForm;
Left := 0;
Top := 0;
Width := 500;
Height := 313;
Bitmap.LoadFromFile(ExpandConstant('{tmp}\img2.bmp'));
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpWelcome then
begin
WizardForm.OuterNotebook.Hide;
FinishedImage.Hide;
end
else if CurPageID = wpFinished then
begin
WizardForm.OuterNotebook.Hide;
MainImage.Hide;
FinishedImage.Show;
end
else WizardForm.OuterNotebook.Show;
end;
Автор: demonikSKR
Дата сообщения: 27.08.2010 16:53
vint56
спасибо больше, немного полегчало
Автор: zxcvvcxz1
Дата сообщения: 27.08.2010 17:11
geroinnn_one
Скрин Жесть
Автор: nik1967
Дата сообщения: 27.08.2010 17:18
Obaldensky
Ну например так: [more]
Код: procedure InitializeWizard();
begin
ComponentsLabel:=TLabel.Create(WizardForm);
with ComponentsLabel do begin
AutoSize:=False;
SetBounds(0, 50, 300, 17);
WordWrap:=True;
Transparent:=True;
Font.Name:='Georgia';
Font.Size:= 10;
Font.Color:=$FFFFFF;
Font.Style := [fsBold, fsItalic];
Caption:= 'Какую игру установить ?';
Parent:=WizardForm.SelectComponentsPage;
end;
end;
Автор: vint56
Дата сообщения: 27.08.2010 17:50
geroinnn_one [more=вот пример]
[Setup]
AppId={{D137A35A-5F61-41A9-A3ED-143C1DB2A121}
AppName=My Program
AppVersion=1.5
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[CustomMessages]
rus.Finished1=Игра {#SetupSetting("AppName")} установлена на Ваш компьютер.
rus.Finished2=Нажмите «Завершить», чтобы выйти из программы установки.

[Files]
Source: img1.bmp; Flags: dontcopy
Source: img2.bmp; Flags: dontcopy

[Code]
var MainImage : TBitmapImage;
FinishedImage: TBitmapImage;
WelcomeLabel1, WelcomeLabel2,FinishedLabel, FinishedHeadingLabel: TLabel; //Надписи на на странице приветствия и на финишной странице

procedure InitializeWizard();
begin
ExtractTemporaryFile('img1.bmp');
MainImage := TBitmapImage.Create(WizardForm);
with MainImage do
begin
Parent := WizardForm;
Left := 0;
Top := 0;
Width := 500;
Height := 313;
Bitmap.LoadFromFile(ExpandConstant('{tmp}\img1.bmp'));
end;

ExtractTemporaryFile('img2.bmp');
FinishedImage := TBitmapImage.Create(WizardForm);
with FinishedImage do
begin
Parent := WizardForm;
Left := 0;
Top := 0;
Width := 500;
Height := 313;
Bitmap.LoadFromFile(ExpandConstant('{tmp}\img2.bmp'));
end;

//WelcomePage, создаем надписи на странице
WelcomeLabel1:= TLabel.Create(WizardForm);
with WelcomeLabel1 do
begin
Left:= ScaleX(176);
Top:= ScaleY(66);
Width:= ScaleX(301);
Height:= ScaleY(71);
AutoSize:= false;
Transparent:= true;
WordWrap:= true;
Font.Size:= 14;
Font.Color:=ClWhite
Font.Style := [fsBold]
Parent:= WizardForm;
Font.Name:= 'Georgia'
Caption:= WizardForm.WelcomeLabel1.Caption;
end;

WelcomeLabel2:=TLabel.Create(WizardForm);
with WelcomeLabel2 do
begin
Top:= ScaleY(136);
Left:= ScaleX(176);
Width:= ScaleX(301);
Height:= ScaleY(300);
AutoSize:= false;
WordWrap:= true;
Font.Color:=ClWhite
Font.Name:= 'Georgia'
Font.Size:= 10;
Transparent:= true;
Parent:= WizardForm;
Caption:= WizardForm.WelcomeLabel2.Caption;
end;

FinishedHeadingLabel:=TLabel.Create(WizardForm);
with FinishedHeadingLabel do
begin
Top:= ScaleY(66);
Left:= ScaleX(176);
Width:= ScaleX(301);
Height:= ScaleY(53);
AutoSize:= false;
WordWrap:= true;
Font.Size:= 14;
Font.Color:=ClWhite
Font.Name:= 'Georgia'
Font.Style := [fsBold]
Transparent:= true;
Parent:= WizardForm;
Caption:= WizardForm.FinishedHeadingLabel.Caption;
end;

FinishedLabel:= TLabel.Create(WizardForm);
with FinishedLabel do
begin
Left:= ScaleX(176);
Top:= ScaleY(136);
Width:= ScaleX(301);
Height:= ScaleY(54);
AutoSize:= false;
WordWrap:= true;
Transparent:= true;
Font.Color:=ClWhite
Font.Size:= 10;
Font.Name:= 'Georgia'
Parent:= WizardForm;
Caption:= ExpandConstant('{cm:Finished1}') + #10#13#10 + ExpandConstant('{cm:Finished2}')
end;
end;


procedure HideComponents;
begin
WelcomeLabel1.Hide;
WelcomeLabel2.Hide;
FinishedHeadingLabel.Hide;
FinishedLabel.Hide;
end;

procedure ShowComponents(CurPageID: Integer);
begin
case CurPageID of
wpWelcome:
begin
WelcomeLabel1.Show
WelcomeLabel2.Show
end;
wpFinished:
begin
FinishedHeadingLabel.Show;
FinishedLabel.Show;
end;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
HideComponents;
ShowComponents(CurPageID);
if CurPageID = wpWelcome then
begin
WizardForm.OuterNotebook.Hide;
FinishedImage.Hide;

end
else if CurPageID = wpFinished then
begin
WizardForm.OuterNotebook.Hide;
MainImage.Hide;
FinishedImage.Show;
end
else WizardForm.OuterNotebook.Show;
end;[/more]
Автор: AJIeKc89
Дата сообщения: 27.08.2010 17:57
никто не знает ?

http://forum.ru-board.com/topic.cgi?forum=5&topic=34344&start=660#8
Автор: geroinnn_one
Дата сообщения: 27.08.2010 18:07
vint56
Спасибо

Добавлено:
У меня ещё один вопрос.

Код:
GetFile:= Filename else //Если имеется полный путь, оставляем так
GetFile:= AddBackslash(DestDir) + Filename; //Если путь неполный, то добавляем необходимые строчки
Автор: Stall_JM
Дата сообщения: 27.08.2010 19:48
Ну помогите))мну
Автор: nik1967
Дата сообщения: 27.08.2010 20:33
Stall_JM
Используй ISDone.
Автор: Stall_JM
Дата сообщения: 27.08.2010 21:24
nik1967
попробую спс
Автор: Tekton_2
Дата сообщения: 27.08.2010 22:00
Так что ? Никто не знает как процесс прибить ?
Проблема изложена здесь, в моём посте
Автор: StalkMent
Дата сообщения: 27.08.2010 23:13
Tekton_2
Поюзай справки и примеры где то это было...
Автор: DeKaNszn
Дата сообщения: 27.08.2010 23:19
Tekton_2
net stop "имя_службы"
taskkill /IM имя_процесса

PS: стоит научиться искать в Документация, FAQ, и различные примеры для Inno Setup
Автор: MihailM
Дата сообщения: 28.08.2010 08:54

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

поправте пожалуйста ссылки в шапке , а то хочется почитать а нечего
Автор: vint56
Дата сообщения: 28.08.2010 09:38
Tekton_2 вот примеры
[more=на этапе установки убить процесс]
[Files]
Source: ISTask.dll; DestDir: {app}; Flags: dontcopy

[Code]
function KillTask(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload';

function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload';

//**************************************************//
function InitializeSetup(): Boolean;
begin
If RunTask('winamp.exe', false) then
begin
if MsgBox('Программа Winamp используется. Закрыть и продолжить установку?', mbInformation, mb_YesNo) = idYes then
begin
KillTask('winamp.exe');
Result:= True;
end else
Exit;
end;
Result:=True;
end;[/more]

[more=на этапе деинсталляции убить процесс]
[Files]
Source: ISTask.dll; DestDir: {app}; Flags: ignoreversion
[Code]
// функции используемые при деинсталляции
// RunTask@{app}\ISTask.dll - название функции (в данном случае, если программа работает)
// и путь dll'ки где она расположена...

function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@{app}\ISTask.dll stdcall delayload uninstallonly';
function KillTask(ExeFileName: string): Integer;
external 'KillTask@{app}\ISTask.dll stdcall delayload uninstallonly';

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usUninstall then
if RunTask('winamp.exe', False) then
begin
// прячем форму
UninstallProgressForm.Visible:= False;
if MsgBox('Программа winamp.exe используется. Закрыть и продолжить удаление?', mbConfirmation, MB_YESNO) = IDYES then
begin
KillTask('winamp.exe');
UnloadDll(ExpandConstant('{app}\ISTask.dll'));
// показываем форму
UninstallProgressForm.Visible:= True;
end
else
begin
MsgBox('Завершите работу winamp.exe, затем снова запустите программу удаления.', mbInformation, MB_OK);
UnloadDll(ExpandConstant('{app}\ISTask.dll'));
Abort;
end;
end;
end;[/more]

[more=Вот сама ISTask.dll]
http://files.gameworld.kz/m1h24tdf2h.html[/more]
Автор: AJIeKc89
Дата сообщения: 28.08.2010 11:25
Разобрался сам!

Страницы: 1234567891011121314151617181920212223

Предыдущая тема: Skype (Часть 3)


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