Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 5]
Johny777
09-11-2012, 20:38
Nightwishh, модифицировал показ слайдов (рандомный), много удалил и заменил InnoCallback.dll на CallbackAddr
библиотека не нужна. Только картинки
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
[Files]
Source: Image_1.bmp; Flags: dontcopy solidbreak sortfilesbyextension nocompression
Source: Image_2.bmp; Flags: dontcopy solidbreak sortfilesbyextension nocompression
Source: Image_3.bmp; Flags: dontcopy solidbreak sortfilesbyextension nocompression
Source: {fonts}\*; DestDir: {app}; Flags: external
[code]
const
SlidesNumber=3; //количество слайдов
SlideRenewTine=2; // задержка показа слаидов в секундах
var
SplashImage: TBitmapImage;
SlidesTimer: LongWord;
Pic: Byte;
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';
procedure ShowRandomPics;
begin
Pic := Random(SlidesNumber);
SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_' + IntToStr(Pic+1) + '.bmp'));
end;
procedure CurStepChanged(CurStep: TSetupStep);
var
z: Byte;
begin
case CurStep of
ssInstall:
begin
{ SplashImage }
SplashImage := TBitmapImage.Create(nil);
with SplashImage do
begin
SetBounds(ScaleX(0), ScaleY(0), WizardForm.MainPanel.Width, WizardForm.Bevel.Top)
Parent := WizardForm.InstallingPage;
Stretch := True;
Pic := Random(SlidesNumber);
ExtractTemporaryFile('Image_' + IntToStr(Pic+1) + '.bmp');
Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_' + IntToStr(Pic+1) + '.bmp'));
end;
WizardForm.StatusLabel.Caption := 'Распаковка слайдов ...';
for z := 1 to SlidesNumber do if not FileExists(ExpandConstant('{tmp}\Image_' + IntToStr(z) + '.bmp')) then ExtractTemporaryFile('Image_'+inttostr(z)+'.bmp');
SlidesTimer := SetTimer(WizardForm.Handle, 7, SlideRenewTine*1000, CallbackAddr('ShowRandomPics'));
end;
ssPostInstall:
begin
KillTimer(WizardForm.Handle, SlidesTimer);
SplashImage.Free;
end;
end;
end;
procedure DeInitializeSetup();
begin
KillTimer(WizardForm.Handle, SlidesTimer);
end;
а именно меня волнуют 2 одинаковые функции »
и правильно волнуют. Достаточно записать по одному экземпляру заголовка
теперь тебе будет легче объединить 2 кода в ручную :)
El Sanchez
09-11-2012, 21:23
При выборе определённого компонента:
1. запустить (до копирования файлов) сторонний (дополнительный) инсталлятор из {tmp} с заданными ключами установки.
2. удалить в {app} определённые папки ("мусорные", которые установит инсталлятор из пункта 1).
3. выполнить копирование (установку) файлов уже посредством основного inno-инсталлятора »
elChoopacabra, первые 2 пункта нужно делать на этапе ssInstall, как раз перед отработкой секции Run (3 пункт):
[Files]
Source: setup.exe; Flags: dontcopy nocompression; Components: mycomponent
[Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
ResCode: Integer;
begin
case CurStep of
ssInstall: begin
if IsComponentSelected('mycomponent') then
begin
ExtractTemporaryFile('setup.exe');
if FileExists(ExpandConstant('{tmp}\setup.exe') then
begin
Exec(ExpandConstant('{tmp}\setup.exe'), '', '', SW_SHOW, ewWaitUntilTerminated, ResCode);
DelTree(ExpandConstant('{app}\MyFolder'), True, True, True);
end;
end;
end;
end;
end;
P.S. Дополнительный установщик может состоять из оболочки и основного установщика, например, связка InstallShield - Windows Installer. В таком случае возможен вариант, когда команда Exec вернет управление, дождавшись кода возврата от оболочки, а основной установщик еще только начал свою работу. Тогда и команде DelTree нечего будет удалять - мусор появится позже, когда отработает основной установщик. Поэтому рекомендую разобрать дополнительный установщик до его составляющих.
UPD
ой, опередили
Nightwishh
09-11-2012, 22:22
Johny777,
Спасибо, всё работает, но есть одна пакость! Дело в том что у меня архивы фриарк, которые распаковываются перед inno (ssInstall), а
здесь слайды начинают работать после распаковки. Пробывал в скрипте исправлять в процедуре: procedure CurStepChanged(CurStep: TSetupStep); непомогает! :cry:
Johny777
09-11-2012, 22:42
Nightwishh, ну помести код распаковки архивов после извлечения картинок и запуска таймера. Убиение таймера оставь где стоит. Те до этапа(ssPostInstall) где таймер убивается не дойдёт пока не выполнится код распаковки. А значит до тех пор он, таймер, будет с частотой 2сек. выполнять процедуру ShowRandomPics; Расценивай таймер не иначе как параллельный поток(процесс)
короче:
procedure CurStepChanged(CurStep: TSetupStep);
var
z: Byte;
begin
case CurStep of
ssInstall:
begin
{ SplashImage }
SplashImage := TBitmapImage.Create(nil);
with SplashImage do
begin
SetBounds(ScaleX(0), ScaleY(0), WizardForm.MainPanel.Width, WizardForm.Bevel.Top)
Parent := WizardForm.InstallingPage;
Stretch := True;
Pic := Random(SlidesNumber);
ExtractTemporaryFile('Image_' + IntToStr(Pic+1) + '.bmp');
Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_' + IntToStr(Pic+1) + '.bmp'));
end;
WizardForm.StatusLabel.Caption := 'Распаковка слайдов ...';
for z := 1 to SlidesNumber do if not FileExists(ExpandConstant('{tmp}\Image_' + IntToStr(z) + '.bmp')) then ExtractTemporaryFile('Image_'+inttostr(z)+'.bmp');
SlidesTimer := SetTimer(WizardForm.Handle, 7, SlideRenewTine*1000, CallbackAddr('ShowRandomPics'));
/// здесь код распаковки архивов
end;
ssPostInstall:
begin
KillTimer(WizardForm.Handle, SlidesTimer);
SplashImage.Free;
end;
end;
end;
===========================
ой, опередили »
уже нет! :) У меня не хватало "if IsComponentSelected('mycomponent') then..."
Nightwishh
10-11-2012, 00:22
Не... для меня сложно, накуралесю что-нить, тем более там скрипт ISDone 0.6, придётся убирать таймер из музыки и всё по старому делать, зря только вопросами грузил!
Johny777
10-11-2012, 00:56
Nightwishh, вот скажи мне. Нафига тебе этот исдан. Почти все реапки какие вижу с ним. может дело и не в нём, но они по большей части глючные. Кто тебе по ушам настучал его использовать. Забей и всё будет нормално. я б не променял коды ваше на возможность сильнее сжать(и эта возможность под вопросом)
Nightwishh
10-11-2012, 01:57
Johny777, да всё пока нормально, взял для слайдов другой скрипт, насчёт глюков ISDone- вроде норм с ним, спасибо за таймер для музыки и за скрипт слайшоу! :yes:
Mailchik
10-11-2012, 12:48
Нафига тебе этот исдан. Почти все реапки какие вижу с ним. может дело и не в нём, но они по большей части глючные. Кто тебе по ушам настучал его использовать.Хм. Странно. Встречный вопрос, а кто настучал его не использовать? Баги присутствуют, куда же без них, хотя я ни одного не замечал за этой библиотекой. Очень удобная библиотека, я бы даже сказал нужная для репакера. Очень много нужных функций. Дак если есть такая библиотека, зачем придумывать велосипед, и собирать заново. Лично моё мнение.это какие нужные в ней функции?Распаковка архивов созданных разными алгоритмами (precomp, srep, zip, xdelta + подключение конфиг файла, для распаковки внешними компрессорами), запуск сторонних exe, с плавным отображением прогрессбара.
R.i.m.s.k.y.
10-11-2012, 12:55
Очень много нужных функций »
это какие нужные в ней функции?
Johny777
10-11-2012, 15:28
Mailchik, использовать или не использовать исдан - личное решение каждого. Здесь на форуме видел людей, которые не зная возможностей инно, обходя их начинают пользоваться исданом. Оттого и мнение, что кто-то (форум, человек, репакер) прошелся по ушам и доверчивости новичка. Меня это печалит. Поэтому я не выдержав заявил Nightwishh-у чтоб он не зацикливался на методах этой библиотеки. Базара нет "Распаковка архивов созданных разными алгоритмами (precomp, srep, zip, xdelta + подключение конфиг файла, для распаковки внешними компрессорами), запуск сторонних exe, с плавным отображением прогрессбара." - несомненный плюс, но у медали две стороны
давай взвесим стороны:
начнём с того что времена, когда выгодно и удобно купить/скачать однослойную болванку с пятью играми на ней давно прошли(не для всех, но меньшинством я позволю себе пренебречь). Ожидания от современного репака(перепаковки):
- удобство проистекающее из ненадобности в ручную ставить патч, копировать правленные файлы, файлы локализации, настраивать ини файлы эмулятора для стим-игр и прочее
- качество. Те правильный и грамотный код, в котором:
1. Описаны все необходимые действия для правильной установки и удаления продукта
2. Сам инсатлл должен быть удобен по отношению к пользователю.
3. Время установки должно быть приемлемым
4. И самое главное - нужно уметь ценить ресурсы чужого компа!
Что мы получаем (говорю как бывший пользователь репаков):
1. Не все, но это ввиду того что "готовый" продукт можно получить обходя возможности инно через исдан сделало из будущего, без будущего, репакера обезьяну
2. Многое уделяется не удобству, а оформлению, хотя иногда оно из него и проистекает. Я сам фанат крутого оформления, но уважая чужое мнение не меньше своего, отдаю полуготовый продукт на тест и (внимание) на "общее впечатление" (там же и удобство) от продукта с будущим учётом пожеланий будущих пользователей. Не спрашивай примера. У меня пока один такой инсталл и он не доступен широкой общественности
3. Время установки не приемлемо, а без прекомпа возможности библиотеки аннулируются (+-500-300мб после фри арка можно пренебречь) кодом несколькими страницами назад и родным ужимателем инно
4. Дополнительное место на харде для распаковки и уйма оперативки - наглое отношение к пользователю, тк он не ценит ресурсы сколько бы их не было
Теперь о возможностях исдана- разнообразная распаковка. Вот и всё. О фагах секции файлов можно забыть. Ровно как и о функциях AfterInstall, BeforeInstall
запуск сторонних exe - может и инно.
Короче. Кто хочет пусть юзает исдан. Мне с этого момента пофиг. Я лишь буду указывать на альтернативные возможности или возможноти(которых в исдане нен) в инно :)
PS:
если есть такая библиотека, зачем придумывать велосипед, и собирать заново »
инно была раньше, так что ей и быть великом
а целесообразность исдана без прекомпа и сильного сжатия из которого проистекают некоторые из вышеописанных проблем(3, 4) я ставлю под большой вопрос
PSS:
ничего личного по отношению к автору библиотеки. Если он её придумал, значит было зачем
R.i.m.s.k.y.
10-11-2012, 15:56
Распаковка архивов созданных разными алгоритмами (precomp, srep, zip, xdelta + подключение конфиг файла, для распаковки внешними компрессорами), запуск сторонних exe, с плавным отображением прогрессбара »
Очень "полезные" фишки для правильной установки софта и работоспособности установщика.
И вообще отвечать на пост ниже постом выше - моветон
Mailchik
10-11-2012, 17:54
Johny777, Вы всё красиво расписали. Споры бессмысленны, так как я указал: Лично моё мнение Очень "полезные" фишки для правильной установки софта и работоспособности установщика. ваши мысли не могут являться единственно верными, я считаю по другому и высказал свою мысль. И вообще отвечать на пост ниже постом выше - моветон не хочется засорять форум.
Gnom_aka_Lexander
10-11-2012, 18:24
к слову об установке приложений с помощью IsDone;
#define NeedMem 512
#define records
[Setup]
AppName=SisMin
AppVerName=SisMin
OutputBaseFilename=SisMin
VersionInfoCopyright=ProFrager
SolidCompression=true
CreateAppDir=false
Compression=none
ShowLanguageDialog=no
LanguageDetectionMethod=locale
ShowComponentSizes=false
FlatComponentsList=false
UsePreviousTasks=false
ShowTasksTreeLines=true
ShowUndisplayableLanguages=true
Uninstallable=false
DisableProgramGroupPage=yes
UsePreviousGroup=false
AppendDefaultGroupName=false
AlwaysRestart=true
[CustomMessages]
otherGroup=Прочее:
pointDesc=Создать системную контрольную точку (рекомендуется)
pointMsg=Создание контрольной точки...
[Tasks]
Name: restorepoint; Description: {cm:pointDesc}; GroupDescription: {cm:otherGroup}; MinVersion: 0,5.1
[Types]
Name: full; Description: "Полная установка"; Flags: IsCustom;
Name: compact; Description: "Компактная установка";
Name: custom; Description: "Выборочная установка";
[Components]
Name: dllsfox; Description: Набор библиотек Visual Fox Pro 3, 5, 6, 7, 8 и 9 версий;Types: full;
Name: dllsfull; Description: Набор Runtime библиотек, необходимых для работы различных программ.;Types: full;
Name: DirectX; Description: Набор библиотек DirectX;Types: full;
Name: Java; Description: Расширенный набор Oracle Java.;Types: full;
Name: stdu; Description: Программа для просмотра, файлов DjVu, TIFF, PDF.; Types: full;
Name: msxml4; Description: MSXML 4 SP3 - обновленная версия XML-парсера; Types: full;
Name: Flash; Description: Adobe Flash Player ActiveX и Adobe Flash Player Plugin; Types: full;
Name: RuntimePack; Description: Расширенный набор библиотек Microsoft Visual C++; Types: full;
Name: dotNet; Description: Microsoft .NET Framework 3.5.1- 4.0 Full; Types: full;
Name: PhysX; Description: NVIDIA® PhysX®; Types: full;
Name: R262; Description: Аудиодрайвер Realtek.;Types: full;
Name: Lan; Description: Сетевой драйвер Realtek;Types: full;
[Files]
Source: Include\*; Flags: dontcopy
Source: exe\*; DestDir: {tmp}
#ifdef records
Source: records.inf; Flags: dontcopy
#endif
[CustomMessages]
russian.ExtractedFile=Устанавливается:
russian.Extracted=Установка системных компонентов...
russian.Error=Ошибка!
russian.ElapsedTime=Прошло:
russian.RemainingTime=Осталось времени:
russian.EstimatedTime=Всего:
russian.AllElapsedTime=Время установки:
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[UninstallDelete]
Type: filesandordirs; Name: {app}
[*Code]
const
APPLICATION_INSTALL = 0;
APPLICATION_UNINSTALL = 1;
DEVICE_DRIVER_INSTALL = 10;
MODIFY_SETTINGS = 12;
CANCELLED_OPERATION = 13;
BEGIN_SYSTEM_CHANGE = 100;
END_SYSTEM_CHANGE = 101;
BEGIN_NESTED_SYSTEM_CHANGE = 102;
END_NESTED_SYSTEM_CHANGE = 103;
var
LblPct, LblTime : array[0..1]of TLabel;
ISDonePB : array[0..1]of TNewProgressBar;
ISDoneCancel:integer;
ISDoneError:boolean;
type
TCallback = function (OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;
function SetRestorePoint(const PointName: string): Boolean;
var
vObj, SR: Variant;
begin
vObj := CreateOleObject('ScriptControl');
vObj.Language := 'VBScript';
SR := vObj.eval('GetObject("winmgmts:\\.\root\default:SystemRestore")');
Result := SR.CreateRestorePoint(PointName, APPLICATION_INSTALL, BEGIN_SYSTEM_CHANGE) = 0;
end;
function WrapCallback(callback:TCallback; paramcount:integer):longword;external 'wrapcallback@files:ISDone.dll stdcall delayload';
function Exec2 (FileName, Param: PAnsiChar;Show:boolean):boolean; external 'Exec2@files:ISDone.dll stdcall delayload';
function ISExec(CurComponent:Cardinal; PctOfTotal,SpecifiedProcessTime:double; ExeName,Parameters,TargetDir,OutputStr:AnsiString;Show:boolean):boolean; external 'ISExec@files:ISDone.dll stdcall delayload';
function ISDoneInit(RecordFileName:AnsiString; TimeType,Comp1,Comp2,Comp3:Cardinal; WinHandle, NeededMem:longint; callback:TCallback):boolean; external 'ISDoneInit@files:ISDone.dll stdcall';
function ISDoneStop:boolean; external 'ISDoneStop@files:ISDone.dll stdcall';
function ChangeLanguage(Language:string):boolean; external 'ChangeLanguage@files:ISDone.dll stdcall';
function SuspendProc:boolean; external 'SuspendProc@files:ISDone.dll stdcall';
function ResumeProc:boolean; external 'ResumeProc@files:ISDone.dll stdcall';
function GetModuleHandle(ModuleName:PAnsiChar):Cardinal; external 'GetModuleHandleA@kernel32.dll stdcall';
function FreeLibrary(Handle:cardinal):bool; external 'FreeLibrary@kernel32.dll stdcall';
function ProgressCallback(OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;
begin
if OveralPct<=1000 then ISDonePB[0].Position := OveralPct;
if CurrentPct<=1000 then ISDonePB[1].Position := CurrentPct;
LblPct[0].Caption := IntToStr(OveralPct div 10)+'.'+chr(48 + OveralPct mod 10)+'%';
LblPct[1].Caption := IntToStr(CurrentPct div 10)+'.'+chr(48 + CurrentPct mod 10)+'%';
LblTime[0].Caption:=ExpandConstant('{cm:ElapsedTime} ')+TimeStr2;
LblTime[1].Caption:=ExpandConstant('{cm:RemainingTime} ')+TimeStr1;
WizardForm.FilenameLabel.Caption:=ExpandConstant('{cm:ExtractedFile} ')+MinimizePathName(CurrentFile, WizardForm.FilenameLabel.Font, WizardForm.FilenameLabel.Width-ScaleX(100));
Result := ISDoneCancel;
end;
procedure CreateControls;
var
i : integer;
begin
for i := 0 to 1 do
begin
ISDonePB[i] := TNewProgressBar.Create(WizardForm);
with ISDonePB[i] do begin
Parent := WizardForm.InstallingPage;
SetBounds(ScaleX(0), ScaleY(80+i*40), ScaleX(417), ScaleY(21));
Max := 1000;
end;
LblTime[i] := TLabel.Create(WizardForm);
with LblTime[i] do begin
Parent := ISDonePB[i];
Transparent := True;
AutoSize := False;
SetBounds(ScaleX(5), ScaleY(3), ScaleX(412), ScaleY(14));
end;
LblPct[i] := TLabel.Create(WizardForm);
with LblPct[i] do begin
Parent := ISDonePB[i];
Transparent := True;
Alignment := taRightJustify;
AutoSize := False;
SetBounds(ScaleX(0), ScaleY(3), ScaleX(412), ScaleY(14));
end;
end;
with WizardForm do
begin
StatusLabel.SetBounds(ScaleX(0), ScaleY(63), ScaleX(417), ScaleY(21));
FilenameLabel.SetBounds(ScaleX(0), ScaleY(103), ScaleX(417), ScaleY(21));
FilenameLabel.Show;
end;
end;
Procedure CurPageChanged(CurPageID: Integer);
Begin
if (CurPageID = wpFinished) and ISDoneError then
begin
with WizardForm do
begin
Caption:= ExpandConstant('{cm:Error}');
FinishedLabel.Font.Color:= clRed;
FinishedLabel.Caption:= SetupMessage(msgSetupAborted) ;
end;
end;
end;
function CheckError:boolean;
begin
result:= not ISDoneError;
end;
procedure CurStepChanged(CurStep: TSetupStep);
var
msg: string;
Comps1, Comps2, Comps3, TmpValue :cardinal;
begin
if CurStep = ssInstall then
begin
WizardForm.StatusLabel.SetBounds(ScaleX(0), ScaleY(27), ScaleX(417), ScaleY(21));
WizardForm.FilenameLabel.Hide;
if IsTaskSelected('restorepoint') then
begin
try
msg := WizardForm.StatusLabel.Caption;
WizardForm.StatusLabel.Caption := ExpandConstant('{cm:pointMsg}');
WizardForm.Repaint;
// создаём контрольную точку
SetRestorePoint('Установка {#SetupSetting("AppName")}');
WizardForm.StatusLabel.Caption := msg;
finally
SetLength(msg, 0);
end;
end;
end;
if CurStep = ssPostInstall then
begin
#ifdef records
ExtractTemporaryFile('records.inf');
#endif
Comps1:=0; Comps2:=0; Comps3:=0;
TmpValue:=1;
if IsComponentSelected('msxml4') then Comps1:=Comps1+TmpValue; //компонент 1
TmpValue:=TmpValue*2;
if IsComponentSelected('dllsfox') then Comps1:=Comps1+TmpValue; //компонент 2
TmpValue:=TmpValue*2;
if IsComponentSelected('dllsfull') then Comps1:=Comps1+TmpValue; //компонент 3
TmpValue:=TmpValue*2;
if IsComponentSelected('Flash') then Comps1:=Comps1+TmpValue; //компонент 4
TmpValue:=TmpValue*2;
if IsComponentSelected('Java') then Comps1:=Comps1+TmpValue; //компонент 5
TmpValue:=TmpValue*2;
if IsComponentSelected('DirectX') then Comps1:=Comps1+TmpValue; //компонент 6
TmpValue:=TmpValue*2;
if IsComponentSelected('RuntimePack') then Comps1:=Comps1+TmpValue; //компонент 7
TmpValue:=TmpValue*2;
if IsComponentSelected('stdu') then Comps1:=Comps1+TmpValue; //компонент 8
TmpValue:=TmpValue*2;
if IsComponentSelected('dotNet') then Comps1:=Comps1+TmpValue; //компонент 9
TmpValue:=TmpValue*2;
if IsComponentSelected('PhysX') then Comps1:=Comps1+TmpValue; //компонент 10
TmpValue:=TmpValue*2;
if IsComponentSelected('R262') then Comps1:=Comps1+TmpValue; //компонент 11
TmpValue:=TmpValue*2;
if IsComponentSelected('Lan') then Comps1:=Comps1+TmpValue; //компонент 12
CreateControls;
WizardForm.StatusLabel.Caption:=ExpandConstant('{cm:Extracted}');
ISDoneCancel:=0;
ISDoneError:=true;
if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, Comps1,Comps2,Comps3, MainForm.Handle, {#NeedMem}, @ProgressCallback) then
begin
repeat
if not ISExec ( 1, 0, 0, ExpandConstant('{tmp}\dllsfox.exe'), ' -y -gm2 -fm0', ExpandConstant('{tmp}'), 'Набор DLL Visual Fox Pro',false) then break;
if not ISExec ( 2, 0, 0, ExpandConstant('{tmp}\dllsfull.exe'), ' -y -gm2 -fm0', ExpandConstant('{tmp}'), 'Набор Runtime DLL',false) then break;
if not ISExec ( 3, 0, 0, ExpandConstant('{tmp}\DirectX.exe'), ' /S', ExpandConstant('{tmp}'), 'Набор библиотек DirectX',false) then break;
if not ISExec ( 4, 0, 0, ExpandConstant('{tmp}\Java.exe'), ' /S', ExpandConstant('{tmp}'), 'Расширенный набор Oracle Java',false) then break;
if not ISExec ( 5, 0, 0, ExpandConstant('{tmp}\stdu.exe'), ' /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-', ExpandConstant('{tmp}'), 'Программа для просмотра, файлов DjVu, TIFF, PDF',false) then break;
if not ISExec ( 6, 0, 0, ExpandConstant('{tmp}\msxml4.exe'),' /passive', ExpandConstant('{tmp}'), 'MSXML 4 SP3',false) then break;
if not ISExec ( 7, 0, 0, ExpandConstant('{tmp}\Flash.exe'),'', ExpandConstant('{tmp}'), 'Adobe Flash Player ActiveX и Adobe Flash Player Plugin',false) then break;
if not ISExec ( 8, 0, 0, ExpandConstant('{tmp}\VCRedist.exe'), ' /S', ExpandConstant('{tmp}'), 'Расширенный набор библиотек Microsoft Visual C++',false) then break;
if not ISExec ( 9, 0, 0, ExpandConstant('{tmp}\dotNet.exe'), ' -aiqlku', ExpandConstant('{tmp}'), 'Microsoft .NET Framework 3.5.1- 4.0 Full',false) then break;
if not ISExec ( 10, 0, 0, ExpandConstant('{tmp}\PhysX.exe'), ' /Q', ExpandConstant('{tmp}'), 'NVIDIA® PhysX®',false) then break;
if not ISExec ( 11, 0, 0, ExpandConstant('{tmp}\R262.exe'), '', ExpandConstant('{tmp}'), 'Аудиодрайвер Realtek',false) then break;
if not ISExec ( 12, 0, 0, ExpandConstant('{tmp}\Lan.exe'), '', ExpandConstant('{tmp}'), 'Сетевой драйвер Realtek',false) then break;
ISDoneError:=false;
until true;
ISDoneStop;
end;
end;
end;
R.i.m.s.k.y., Johny777, а сколько кода (приплюсуем сюда тормоза, которые внесет виртуальная машина Inno) займет у Вас установка десятка приложений, с отображением установки каждого на отдельном прогрессбаре, и всех выбранных на общем?
Limonica
10-11-2012, 18:29
Можно ли запустить готовый инсталлятор, в тихом режиме без параметра /VERYSILENT ?
Gnom_aka_Lexander
10-11-2012, 18:33
Limonica, нельзя. но можно скрыть окно инсталла насовсем, без вариантов, в шапке видел пример.
R.i.m.s.k.y.
10-11-2012, 18:35
Gnom_aka_Lexander, какая виртуальная машина Inno? первый раз про такую слышу
У меня есть подобие твоего примера, называется InstallAll, ставит в систему все от граблей до кораблей без участия человека (системные компоненты vcredistы, дирексы, фреймворки, тоталы/ворды и т.д), всего 20 компонентов для джентльменского набора.
Я вообще на заморачиваюсь на прогрессбар, все запускается оригинальными установщиками через AfterInstall или Run, в зависимости от порядка установки.
Ибо заморачиваться на прогрессбар в ущерб стабильности установщика считаю нецелесообразным.
Gnom_aka_Lexander
10-11-2012, 18:47
в ущерб стабильности установщика »
нестабильным его делают косорукие кулрепацкеры, совмещая несовместимое. в чистом дефолте библиотека полностью стабильна. С брызгами изо рта доказывать ничего не буду, смысла нет, и убедиться не проверив невозможно в принципе.
А насчет инно - уж тебе-ли не знать, в чем разница между средами(или как это правильно обозвать?) компилируемым и интерпретируемыми?
Johny777
10-11-2012, 18:50
Споры бессмысленны »
я и не спорю. Лишь ответил на твой вопрос :)
Встречный вопрос, а кто настучал его не использовать? »
==========================================================================
а сколько кода (приплюсуем сюда тормоза, которые внесет виртуальная машина Inno) займет у Вас установка десятка приложений »
12 строк = 12 вызовов функции Exec под каждый компонент (говорю на основе твоего кода-примера)
Ибо заморачиваться на прогрессбар »
с отображением установки каждого на отдельном прогрессбаре »
пардон уважаемые. О чём речь? Какой прогрессбар без циклов или таймеров может отобразить установку например Директ Икса?
Gnom_aka_Lexander
10-11-2012, 18:58
Какой прогрессбар без циклов или таймеров может отобразить установку например Директ Икса? »
функция, вызываемая из библиотеки, довольно точно воспроизводит прогресс на прогрессбаре инсталла. И там не таймеры с циклами, там потоки.
оффтоп завершил.
Nightwishh
10-11-2012, 21:38
А можно что-бы при извлечении временных файлов в папку Temp показывался прогрессбар, т.е запускается инсталл, извлекаются файлы и в это время была полоска прогрессбара?
P.S. Файлы извлекаются через InitializeWizard, а у временных файлов убрано в секции [Files] кат. назначения: DestDir: {tmp}.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.