Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; --- Generated by InnoSetup Script Joiner version 3.0, Jul 22 2009, (c) Bulat Ziganshin <Bulat.Ziganshin@gmail.com>. More info at http://issjoiner.codeplex.com/
- ; --- Source: FreeArc_Example.iss ------------------------------------------------------------
- ;[English]
- ;Example of using unarc.dll for decompression of FreeArc archives with displaying of progress indicator in Inno Setup window.
- ;All you need to use the script is to compile it and put .arc archives to the same directory as installer.
- ;The script requires Inno Setup QuickStart Pack 5.2.3 and above! (http://files.jrsoftware.org)
- ;[Russian]
- ;Пример распаковки FreeArc архива при помощи unarc.dll, с отображением прогресса распаковки в окне Inno Setup.
- ; Версия 3.2 от Bulat Ziganshin, 31-07-2009
- ; - исправлена unarc.dll - теперь она не вылетает на сбойных архивах
- ; miniFAQ
- ; - Подготовка скрипта: добавьте строки с архивами в секцию [Files], установите флаги external dontcopy, если надо, укажите компоненты/задачи.
- ; - один архив можно слить с инсталятором, если их общий размер не более 2Гб, через "copy /b setup.exe+xxx.arc newsetup.exe", добавив в [Files] "{srcexe}"
- ; Версия 3.1 от Bulat Ziganshin, 29-07-2009
- ; - более плавный индикатор прогресса (данные из LZMA пишутся кусками по 8 мб вместо dictsize)
- ; - больше не грузятся всякие левые facompress.dll из PATH
- ;
- ; Версия 3.0 от Bulat Ziganshin, 29-07-2009
- ; - функция ArchiveOrigSize возвращает объём данных в архиве
- ; - наименования колбэков изменены на read и write (было progress и written)
- ;
- ; Версия 2.1 от Bulat Ziganshin, 10-07-2009
- ; - Кнопка 'Отмена установки' теперь по расположению, размеру и надписи точно дублирует стандартную кнопку Отмена
- ; - В unarc.dll исправлена ошибка, чреватая потенциальными проблемами при распаковке множества архивов
- ;
- ; Версия 2.0 от Bulat Ziganshin, 08-07-2009
- ; - Корректно отображает общий объём установки и сколько данных уже распаковано
- ; - Индикатор прогресса теперь основан на объёме распакованных и записанных на диск данных
- ; - Дополнительно отображается сколько осталось времени
- ; - FreeArcCallback вызывается не менее 100 раз в секунду, что заменяет вызов по таймеру
- ; - Добавлен placeholder для периодически выполняемого кода (в начале процедуры FreeArcCallback)
- ; - Исправлена проблема с удалением последнего распакованного файла при отмене инсталяции
- ; - Исправлена проблема с русскими именами/путями распаковываемых архивов
- ; - Кнопка 'Отменить распаковку' масштабируется в зависимости от размеров формы
- ; - Исправлено вычисление оставшегося времени (теперь отсчёт начинается в момент начала распаковки)
- ; - За пределами процесса распаковки все лишние надписи убираются с экрана
- ;
- ; Изменения от Victor_Dobrov, 02-07-2009
- ; - Кнопка инсталлятора в панели задач отображает время до завершения обработки всех архивов и общий процент распаковки.
- ; - В Unicode-версиях инсталлятора правильно отображаются имена файлов.
- ;
- ; Изменения от CTACKo & SotM'а. 01-07-2009
- ; - Правильно создаются папки, если в пути установки встречаются русские буквы
- ; - При компиляции определяется использование PAnsiChar/PChar. Можно использовать как обычную так и UNICODE версию с установленным препроцессором.
- ;
- ; Изменения от SotM'а. 23-06-2009
- ; - Нижний прогресс бар сместил чуть-чуть вниз, чтобы было видно имя распаковываемого файла.
- ; - Русские имена файлов теперь правильно отображаются.
- ; - При нажатии "отмены" при распаковке теперь появляется запрос на подтверждение отмены.
- ; - Переименовал некоторые переменные, чтобы их имена несли больше информации.
- ; - Немного переформатировал сам исходный код для более удобного и понятного чтения.
- ; - Исправил пару сообщений на английском языке.
- ; Изменения от Victor_Dobrov, 15-06-2009
- ; - Оптимизация и локализация скрипта, более подробная строка статуса, общий прогресс-бар, при неудачной распаковке выполняется откат (деинсталляция) и показывается текст ошибки.
- ; Bulat Ziganshin, 13-06-2009
- ; - Создание библиотеки unarc.dll и скрипта распаковки freearc_example.iss.
- [Setup]
- ; --- Source: GTA SA_4.iss ------------------------------------------------------------
- AppName=GTA:SA
- AppVerName=GTA:SA
- AppVersion=1.0.0
- DefaultDirName={pf}\Grand Theft Auto San Andreas
- OutputDir=D:\Репаки\GTA SA
- DefaultGroupName=Rockstar Games\GTA San Andreas
- UninstallFilesDir={app}\Uninstall
- Compression=lzma/ultra64
- InternalCompressLevel=ultra64
- SolidCompression=true
- DiskSpanning=yes
- SlicesPerDisk=3
- DiskSliceSize=1100000000
- DisableProgramGroupPage=true
- DisableReadyPage=true
- //SetupIconFile=D:\Documents and Settings\Admin\Рабочий стол\Новая папка\GTA.ico
- VersionInfoDescription=Compiled by |AngelDead| R.G.RUSgamers
- VersionInfoCompany=http://www.rustorka.com
- VersionInfoVersion=1.0.0.0
- ;WizardImageFile=D:\Documents and Settings\Admin\Рабочий стол\19_cr4_1.bmp
- ;WizardSmallImageFile=D:\Для InstallShield\Prototype\SmallImage.bmp
- UninstallDisplayIcon={app}\gta_sa.exe, 0
- UninstallDisplayName=Grand Theft Auto: San Andreas
- [Icons]
- Name: {group}\Техническая поддержка\Диагностика DirectX; Filename: {sys}\dxdiag.exe; WorkingDir: {sys}; Check: GroupIcons
- Name: {group}\Техническая поддержка\Сведения о системе; Filename: {pf}\Common Files\Microsoft Shared\MSInfo\msinfo32.exe; Check: GroupIcons
- Name: {group}\Запустить игру; Filename: {app}\gta_sa.exe; WorkingDir: {app}; Check: GroupIcons
- Name: {group}\Удалить игру; Filename: {app}\Uninstall\unins000; WorkingDir: {app}; Check: GroupIcons
- Name: {userdesktop}\GTA San Andreas; Filename: {app}\gta_sa.exe; WorkingDir: {app}; Check: GroupIcons
- Name: {group}\gta_sa.exe; Filename: {app}\gta_sa.exe; WorkingDir: {app}
- Name: {userdesktop}\Мультиплеер; Filename: {app}\samp.exe; WorkingDir: {app}; Check: GroupIcons
- Name: {group}\samp.exe; Filename: {app}\samp.exe; WorkingDir: {app}
- [Registry]
- Root: HKLM; SubKey: SOFTWARE\Rockstar Games\GTA San Andreas\Installation; ValueType: string; ValueName: ExePath; ValueData: "\""\Rockstar Games\GTA San Andreas\gta_sa.exe\"""
- Root: HKLM; SubKey: SOFTWARE\Rockstar Games\GTA San Andreas\Installation; ValueType: string; ValueName: Installed; ValueData: 1
- [Run]
- Filename: {src}\DirectX\dxsetup.exe; Parameters: /silent; StatusMsg: Идет установка дополнительных программ...; Check: InstallDop
- Filename: {src}\Redist\vcredist_x86.exe; Parameters: /Q; StatusMsg: Идет установка дополнительных программ...; Check: InstallDop
- [Languages]
- Name: eng; MessagesFile: compiler:Default.isl
- Name: rus; MessagesFile: compiler:Languages\Russian.isl
- [CustomMessages]
- eng.ArcBreak=Installation cancelled!
- eng.ExtractedInfo=Extracted %1 Mb of %2 Mb
- eng.ArcInfo=Archive: %1 of %2
- eng.ArcTitle=Extracting FreeArc archive
- eng.ArcError=Decompression failed with error code %1
- eng.ArcFail=Decompression failed!
- eng.AllProgress=Overall extraction progress: %1%%
- eng.ArcBroken=Archive %1 is damaged%nor not enough free space.
- eng.Extracting=Extracting: %1
- eng.taskbar=%1%%, %2 remains
- eng.remains=Remaining time: %1
- eng.LongTime=at no time
- eng.ending=ending
- eng.hour=hours
- eng.min=mins
- eng.sec=secs
- rus.ArcBreak=Установка прервана!
- rus.ExtractedInfo=Распаковано %1 Мб из %2 Мб
- rus.ArcInfo=Архив: %1 из %2
- rus.ArcTitle=Распаковка архивов FreeArc
- rus.ArcError=Распаковщик FreeArc вернул код ошибки: %1
- rus.ArcFail=Распаковка не завершена!
- rus.AllProgress=Общий прогресс распаковки: %1%%
- rus.ArcBroken=Возможно, архив %1 повреждён%nили недостаточно места на диске назначения.
- rus.Extracting=Распаковывается: %1
- rus.taskbar=%1%%, жди %2
- rus.remains=Осталось ждать %1
- rus.LongTime=вечно
- rus.ending=завершение
- rus.hour=часов
- rus.min=мин
- rus.sec=сек
- rus.but=Установить
- rus.space=Доступно места на диске:
- rus.space1=Требуется места на диске:
- rus.drt=Обновить DirectX
- rus.up=Идет обновление DirectX...
- [Files]
- ;Source: *.arc; DestDir: {app}; Flags: nocompression
- Source: compiler:Dll Pack\unarc.dll; DestDir: {tmp}; Flags: dontcopy deleteafterinstall
- Source: compiler:Dll Pack\InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy
- Source: compiler:ISSkin\ISSkin.dll; DestDir: {app}; Flags: dontcopy
- Source: compiler:ISSkin\Styles\Vista.cjstyles; DestDir: {tmp}; Flags: dontcopy
- Source: 9.bmp; DestDir: {tmp}; Flags: dontcopy
- ///Source: Rockstar Games\GTA San Andreas\*; DestDir: {app}; BeforeInstall: ProgressExt(); Flags: ignoreversion recursesubdirs createallsubdirs
- Source: logo.png; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
- Source: compiler:Dll Pack\isgsg.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
- Source: compiler:Dll Pack\bass.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
- Source: michael_hunter_-_gta_san_andreas_theme.mp3; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
- ///Source: Rockstar Games\GTA San Andreas\gta_sa.exe; DestDir: {app}; BeforeInstall: ProgressExt(); Flags: ignoreversion
- ///Source: Rockstar Games\GTA San Andreas\samp.exe; DestDir: {app}; BeforeInstall: ProgressExt(); Flags: ignoreversion
- [UninstallDelete]
- Type: filesandordirs; Name: {app}
- Name: {app}\GTA San Andreas\*; Type: filesandordirs
- Name: {app}\*.*; Type: filesandordirs
- [Code]
- const
- Archives = '{src}\*.arc'; // укажите расположение архивов FreeArc; для внешних файлов строку в [Files] добавлять необязательно
- PM_REMOVE = 1;
- CP_ACP = 0; CP_UTF8 = 65001;
- oneMb = 1048576;
- type
- #ifdef UNICODE ; если у вас ошибка на этой строке, то установите препроцессор или исправьте скрипт для вашей версии Inno Setup
- #define A "W"
- #else
- #define A "A" ; точка входа в SetWindowText, {#A} меняется на A или W в зависимости от версии
- // PAnsiChar = PChar; // Required for Inno Setup 5.3.0 and higher. (требуется для Inno Setup версии 5.3.0 и ниже)
- #endif
- #if Ver < 84018176
- AnsiString = String; // There is no need for this line in Inno Setup 5.2.4 and above (для Inno Setup версий 5.2.4 и выше эта строка не нужна)
- #endif
- TMyMsg = record
- hwnd: HWND;
- message: UINT;
- wParam: Longint;
- lParam: Longint;
- time: DWORD;
- pt: TPoint;
- end;
- TFreeArcCallback = function (what: PAnsiChar; int1, int2: Integer; str: PAnsiChar): Integer;
- TArc = record Path: string; OrigSize: Integer; Size: Extended; end;
- var
- ExtractFile: TLabel;
- lblExtractFileName: TLabel;
- btnCancelUnpacking: TButton;
- CancelCode, n, UnPackError, StartInstall: Integer;
- Arcs: array of TArc;
- msgError: string;
- lastMb: Integer;
- baseMb: Integer;
- totalUncompressedSize: Integer; // total uncompressed size of archive data in mb
- LastTimerEvent: DWORD;
- Function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: string; cbMultiByte: integer; lpWideCharStr: string; cchWideChar: integer): longint; external 'MultiByteToWideChar@kernel32.dll stdcall';
- Function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: string; cchWideChar: integer; lpMultiByteStr: string; cbMultiByte: integer; lpDefaultChar: integer; lpUsedDefaultChar: integer): longint; external 'WideCharToMultiByte@kernel32.dll stdcall';
- function PeekMessage(var lpMsg: TMyMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
- function TranslateMessage(const lpMsg: TMyMsg): BOOL; external 'TranslateMessage@user32.dll stdcall';
- function DispatchMessage(const lpMsg: TMyMsg): Longint; external 'DispatchMessageA@user32.dll stdcall';
- Function OemToChar(lpszSrc, lpszDst: AnsiString): longint; external 'OemToCharA@user32.dll stdcall';
- function GetWindowLong(hWnd, nIndex: Integer): Longint; external 'GetWindowLongA@user32 stdcall delayload';
- function SetWindowText(hWnd: Longint; lpString: String): Longint; external 'SetWindowText{#A}@user32 stdcall delayload';
- function GetTickCount: DWord; external 'GetTickCount@kernel32';
- function WrapFreeArcCallback (callback: TFreeArcCallback; paramcount: integer):longword; external 'wrapcallback@files:innocallback.dll stdcall';
- function FreeArcExtract (callback: longword; cmd1,cmd2,cmd3,cmd4,cmd5,cmd6,cmd7,cmd8,cmd9,cmd10: PAnsiChar): integer; external 'FreeArcExtract@files:unarc.dll cdecl';
- procedure AppProcessMessage;
- var
- Msg: TMyMsg;
- begin
- while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do begin
- TranslateMessage(Msg);
- DispatchMessage(Msg);
- end;
- end;
- // Перевод числа в строку с точностью 3 знака (%.3n) с округлением дробной части, если она есть
- Function NumToStr(Float: Extended): String;
- Begin
- Result:= Format('%.3n', [Float]); StringChange(Result, ',', '.');
- while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Length(Result) > 1) do
- SetLength(Result, Length(Result)-1);
- End;
- function cm(Message: String): String; Begin Result:= ExpandConstant('{cm:'+ Message +'}') End;
- Function Size64(Hi, Lo: Integer): Extended;
- Begin
- Result:= Lo;
- if Lo<0 then Result:= Result + $7FFFFFFF + $7FFFFFFF + 2;
- for Hi:= Hi-1 Downto 0 do
- Result:= Result + $7FFFFFFF + $7FFFFFFF + 2;
- End;
- // Converts OEM encoded string into ANSI
- // Преобразует OEM строку в ANSI кодировку
- function OemToAnsiStr( strSource: AnsiString): AnsiString;
- var
- nRet : longint;
- begin
- SetLength( Result, Length( strSource ) );
- nRet:= OemToChar( strSource, Result );
- end;
- // Converts ANSI encoded string into UTF-8
- // Преобразует строку из ANSI в UTF-8 кодировку
- function AnsiToUtf8( strSource: string ): string;
- var
- nRet : integer;
- WideCharBuf: string;
- MultiByteBuf: string;
- begin
- strSource:= strSource + chr(0);
- SetLength( WideCharBuf, Length( strSource ) * 2 );
- SetLength( MultiByteBuf, Length( strSource ) * 2 );
- nRet:= MultiByteToWideChar( CP_ACP, 0, strSource, -1, WideCharBuf, Length(WideCharBuf) );
- nRet:= WideCharToMultiByte( CP_UTF8, 0, WideCharBuf, -1, MultiByteBuf, Length(MultiByteBuf), 0, 0);
- Result:= MultiByteBuf;
- end;
- // OnClick event function for btnCancel
- procedure btnCancelUnpackingOnClick(Sender: TObject);
- begin
- if MsgBox( SetupMessage( msgExitSetupMessage ), mbInformation, MB_YESNO ) = IDYES then
- CancelCode:= -127;
- end;
- var origsize: Integer;
- // The callback function for getting info about FreeArc archive
- function FreeArcInfoCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer;
- begin
- if string(what)='origsize' then origsize := Mb else
- if string(what)='compsize' then else
- if string(what)='total_files' then else
- Result:= CancelCode;
- end;
- // Returns decompressed size of files in archive
- function ArchiveOrigSize(arcname: string): Integer;
- var
- callback: longword;
- Begin
- callback:= WrapFreeArcCallback(@FreeArcInfoCallback,4); //FreeArcInfoCallback has 4 arguments
- CancelCode:= 0;
- AppProcessMessage;
- try
- // Pass the specified arguments to 'unarc.dll'
- Result:= FreeArcExtract (callback, 'l', '--', AnsiToUtf8(arcname), '', '', '', '', '', '', '');
- if CancelCode < 0 then Result:= CancelCode;
- if Result >= 0 then Result:= origsize;
- except
- Result:= -63; // ArcFail
- end;
- end;
- // Scans the specified folders for archives and add them to list
- function FindArcs(dir: string): Extended;
- var
- FSR: TFindRec;
- Begin
- Result:= 0;
- if FindFirst(ExpandConstant(dir), FSR) then begin
- try
- repeat
- // Skip everything but the folders
- if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY > 0 then CONTINUE;
- n:= GetArrayLength(Arcs);
- // Expand the folder list
- SetArrayLength(Arcs, n +1);
- Arcs[n].Path:= ExtractFilePath(ExpandConstant(dir)) + FSR.Name;
- Arcs[n].Size:= Size64(FSR.SizeHigh, FSR.SizeLow);
- Result:= Result + Arcs[n].Size;
- Arcs[n].OrigSize := ArchiveOrigSize(Arcs[n].Path)
- totalUncompressedSize := totalUncompressedSize + Arcs[n].OrigSize
- until not FindNext(FSR);
- finally
- FindClose(FSR);
- end;
- end;
- End;
- // Sets the TaskBar title
- Procedure SetTaskBarTitle(Title: String); var h: Integer;
- Begin
- h:= GetWindowLong(MainForm.Handle, -8); if h <> 0 then SetWindowText(h, Title);
- End;
- // Converts milliseconds to human-readable time
- // Конвертирует милисекунды в человеко-читаемое изображение времени
- Function TicksToTime(Ticks: DWord; h,m,s: String; detail: Boolean): String;
- Begin
- if detail {hh:mm:ss format} then
- Result:= PADZ(IntToStr(Ticks/3600000), 2) +':'+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +':'+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2)
- else if Ticks/3600 >= 1000 {more than hour} then
- Result:= IntToStr(Ticks/3600000) +h+' '+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +m
- else if Ticks/60 >= 1000 {1..60 minutes} then
- Result:= IntToStr(Ticks/60000) +m+' '+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2) +s
- else Result:= IntToStr(Ticks/1000) +s {less than one minute}
- End;
- // The main callback function for unpacking FreeArc archives
- function FreeArcCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer;
- var
- percents, Remaining: Integer;
- s: String;
- begin
- if GetTickCount - LastTimerEvent > 1000 then begin
- // This code will be executed once each 1000 ms (этот код будет выполняться раз в 1000 миллисекунд)
- // ....
- // End of code executed by timer
- LastTimerEvent := LastTimerEvent+1000;
- end;
- if string(what)='filename' then begin
- // Update FileName label
- lblExtractFileName.Caption:= FmtMessage( cm( 'Extracting' ), [OemToAnsiStr( str )] )
- end else if (string(what)='write') and (totalUncompressedSize>0) and (Mb>lastMb) then begin
- // Assign to Mb *total* amount of data extracted to the moment from all archives
- lastMb := Mb;
- Mb := baseMb+Mb;
- // Update progress bar
- WizardForm.ProgressGauge.Position:= Mb;
- // Show how much megabytes/archives were processed up to the moment
- percents:= (Mb*1000) div totalUncompressedSize;
- s := FmtMessage(cm('ExtractedInfo'), [IntToStr(Mb), IntToStr(totalUncompressedSize)]);
- if GetArrayLength(Arcs)>1 then
- s := s + '. '+FmtMessage(cm('ArcInfo'), [IntToStr(n+1), IntToStr(GetArrayLength(Arcs))])
- ExtractFile.Caption := s
- // Calculate and show current percents
- percents:= (Mb*1000) div totalUncompressedSize;
- s:= FmtMessage(cm('AllProgress'), [Format('%.1n', [Abs(percents/10)])]);
- if Mb > 0 then Remaining:= trunc((GetTickCount - StartInstall) * Abs((totalUncompressedSize - Mb)/Mb)) else Remaining:= 0;
- if Remaining = 0 then SetTaskBarTitle(cm('ending')) else begin
- s:= s + '. '+FmtMessage(cm('remains'), [TicksToTime(Remaining, cm('hour'), cm('min'), cm('sec'), false)])
- SetTaskBarTitle(FmtMessage(cm('taskbar'), [IntToStr(percents/10), TicksToTime(Remaining, 'h', 'm', 's', false)]))
- end;
- WizardForm.FileNameLabel.Caption := s
- end;
- AppProcessMessage;
- Result:= CancelCode;
- end;
- // Extracts all found archives
- function UnPack(Archives: string): Integer;
- var
- totalCompressedSize: Extended;
- callback: longword;
- FreeMB, TotalMB: Cardinal;
- begin
- // Display 'Extracting FreeArc archive'
- lblExtractFileName.Caption:= '';
- lblExtractFileName.Show;
- ExtractFile.caption:= cm('ArcTitle');
- ExtractFile.Show;
- // Show the 'Cancel unpacking' button and set it as default button
- btnCancelUnpacking.Caption:= WizardForm.CancelButton.Caption;
- btnCancelUnpacking.Show;
- WizardForm.ActiveControl:= btnCancelUnpacking;
- WizardForm.ProgressGauge.Position:= 0;
- // Get the size of all archives
- totalUncompressedSize := 0;
- totalCompressedSize := FindArcs(Archives);
- WizardForm.ProgressGauge.Max:= totalUncompressedSize;
- // Other initializations
- callback:= WrapFreeArcCallback(@FreeArcCallback,4); //FreeArcCallback has 4 arguments
- StartInstall:= GetTickCount; {время начала распаковки}
- LastTimerEvent:= GetTickCount;
- baseMb:= 0
- for n:= 0 to GetArrayLength(Arcs) -1 do
- begin
- lastMb := 0
- CancelCode:= 0;
- AppProcessMessage;
- try
- // Pass the specified arguments to 'unarc.dll'
- Result:= FreeArcExtract (callback, 'x', '-o+', '-dp' + AnsiToUtf8( ExpandConstant('{app}') ), '--', AnsiToUtf8(Arcs[n].Path), '', '', '', '', '');
- if CancelCode < 0 then Result:= CancelCode;
- except
- Result:= -63; // ArcFail
- end;
- baseMb:= baseMb+lastMb
- // Error occured
- if Result <> 0 then
- begin
- msgError:= FmtMessage(cm('ArcError'), [IntToStr(Result)]);
- GetSpaceOnDisk(ExtractFileDrive(ExpandConstant('{app}')), True, FreeMB, TotalMB);
- case Result of
- -1: if FreeMB < 32 {Мб на диске} then msgError:= SetupMessage(msgDiskSpaceWarningTitle)
- else msgError:= msgError + #13#10 + FmtMessage(cm('ArcBroken'), [ExtractFileName(Arcs[n].Path)]);
- -127: msgError:= cm('ArcBreak'); //Cancel button
- -63: msgError:= cm('ArcFail');
- end;
- // MsgBox(msgError, mbInformation, MB_OK); //сообщение показывается на странице завершения
- Log(msgError);
- Break; //прервать цикл распаковки
- end;
- end;
- // Hide labels and button
- WizardForm.FileNameLabel.Caption:= '';
- lblExtractFileName.Hide;
- ExtractFile.Hide;
- btnCancelUnpacking.Hide;
- end;
- procedure CurStepChanged(CurStep: TSetupStep);
- begin
- if CurStep = ssInstall then
- begin
- UnPackError:= UnPack(Archives)
- if UnPackError = 0 then
- SetTaskBarTitle(SetupMessage(msgSetupAppTitle))
- else
- begin
- // Error occured, uninstall it then
- Exec(ExpandConstant('{uninstallexe}'), '/SILENT','', sw_Hide, ewWaitUntilTerminated, n); //откат установки из-за ошибки unarc.dll
- SetTaskBarTitle(SetupMessage(msgErrorTitle))
- WizardForm.Caption:= SetupMessage(msgErrorTitle) +' - '+ cm('ArcBreak')
- end;
- end;
- end;
- // стандартный способ отката (не нужна CurPageChanged1), но архивы распаковываются до извлечения файлов инсталлятора
- // if CurStep = ssInstall then
- // if UnPack(Archives) <> 0 then Abort;
- const
- Indent=10;
- procedure ShowSplashScreen(p1:HWND;p2:string;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';
- procedure ShowMP3Panel(hMainFrm:HWND;StartVolume:integer;DefMP3Dir,BASSDir,MLabel:PChar;IsShowMP3Info,IsBkgFrmVisible:boolean;ShowTimeMP3Info:integer;dBottom:integer);external 'ShowMP3Panel@files:isgsg.dll stdcall';
- procedure KillMP3Panel;external 'KillMP3Panel@files:isgsg.dll stdcall';
- var
- Dop, Icons, Group: TCheckBox;
- lblDirectX, lblSelectDir, lblSelectDirBrowse, lblRedist: TLabel;
- lblIcons, lblGroup, lblDop: TLabel;
- PageNameLabel, PageDescriptionLabel: TLabel;
- PageNameLabel1, PageDescriptionLabel1: TLabel;
- StatusLabel, FilenameLabel: TLabel;
- WelcomeLabel1, WelcomeLabel2,
- FinishedLabel, FinishedHeadingLabel: TLabel;
- NeedSize:Integer;
- FreeMB, TotalMB: Cardinal;
- NeedSpaceLabel,FreeSpaceLabel: TLabel;
- BmpFile: TBitmapImage;
- Function InstallDop:Boolean;
- begin
- Result:=Dop.Checked;
- end;
- function CreateIcons: Boolean;
- begin
- Result:=Icons.Checked;
- end;
- function GroupIcons: Boolean;
- begin
- Result:=Group.Checked;
- end;
- procedure LogoOnClick(Sender: TObject);
- var ReturnCode: Integer;
- begin
- ShellExec('open', 'http://www.rustorka.com', '', '', SW_SHOWNORMAL, ewNoWait, ReturnCode)
- end;
- // задал процедуру, чтоб отмечался чебокс еси кликнуть по надписи lblCheckBox
- procedure DopOnClick(Sender: TObject);
- begin
- if Dop.Checked = False then
- Dop.Checked:= True else
- Dop.Checked:= False;
- end;
- procedure IconsOnClick(Sender: TObject);
- begin
- if Icons.Checked = False then
- Icons.Checked:= True else
- Icons.Checked:= False;
- end;
- procedure GroupOnClick(Sender: TObject);
- begin
- if Group.Checked = False then
- Group.Checked:= True else
- Group.Checked:= False;
- end;
- // задал процедуру, чтоб отмечался чебокс еси кликнуть по надписи lblCheckBox
- //Свободное место
- procedure GetFreeSpaceCaption(Sender: TObject);
- var
- Path: String;
- begin
- Path := ExtractFileDrive(WizardForm.DirEdit.Text);
- GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
- if FreeMB > 1024 then
- FreeSpaceLabel.Caption := ExpandConstant('{cm:SPACE} ')+ FloatToStr(round(FreeMB/1024*100)/100) + ' GB' else
- FreeSpaceLabel.Caption := ExpandConstant('{cm:SPACE} ')+ IntToStr(FreeMB)+ ' MB';
- if FreeMB < NeedSize then
- WizardForm.NextButton.Enabled := False else
- WizardForm.NextButton.Enabled := True;
- end;
- procedure GetNeedSpaceCaption;
- begin
- if NeedSize > 1024 then
- NeedSpaceLabel.Caption := ExpandConstant('{cm:SPACE1} ')+ FloatToStr(round(NeedSize/1024*100)/100) + ' GB' else
- NeedSpaceLabel.Caption := ExpandConstant('{cm:SPACE1} ')+ IntToStr(NeedSize)+ ' MB';
- end;
- //Свободное место
- procedure ProgressExt();
- begin
- FilenameLabel.Caption:= ExpandConstant(ExtractFileDir(CurrentFilename)) + '\' + ExtractFilename(CurrentFilename);
- end;
- //Загрузка скина
- procedure LoadSkin(lpszPath: String; lpszIniFileName: String);
- external 'LoadSkin@files:isskin.dll stdcall';
- procedure UnloadSkin();
- external 'UnloadSkin@files:isskin.dll stdcall';
- function ShowWindow(hWnd: Integer; uType: Integer): Integer;
- external 'ShowWindow@user32.dll stdcall';
- function InitializeSetup(): Boolean;
- begin
- ExtractTemporaryFile('Vista.cjstyles');
- LoadSkin(ExpandConstant('{tmp}\Vista.cjstyles'), '');
- Result := True;
- ExtractTemporaryFile('michael_hunter_-_gta_san_andreas_theme.mp3');
- ExtractTemporaryFile('bass.dll');
- // Result := InitializeSetup(); if not Result then exit;
- if not Result then exit;
- end;
- //Загрузка скина
- procedure InitializeWizard();
- begin
- ExtractTemporaryFile('9.bmp');
- NeedSize:= 4900;
- BmpFile:= TBitmapImage.Create(WizardForm);
- BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\9.bmp'));
- BmpFile.SetBounds(0, 0, 497, 360);
- BmpFile.Stretch:= true
- BmpFile.Parent:= WizardForm.WelcomePage;
- BmpFile:= TBitmapImage.Create(WizardForm);
- BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\9.bmp'));
- BmpFile.SetBounds(0, 0, 497, 360);
- BmpFile.Stretch:= true
- BmpFile.Parent:= WizardForm.LicensePage;
- BmpFile:= TBitmapImage.Create(WizardForm);
- BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\9.bmp'));
- BmpFile.SetBounds(0, 0, 497, 360);
- BmpFile.Stretch:= true
- BmpFile.Parent:= WizardForm.SelectDirPage;
- BmpFile:= TBitmapImage.Create(WizardForm);
- BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\9.bmp'));
- BmpFile.SetBounds(0, 0, 497, 360);
- BmpFile.Stretch:= true
- BmpFile.Parent:= WizardForm.InstallingPage;
- BmpFile:= TBitmapImage.Create(WizardForm);
- BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\9.bmp'));
- BmpFile.SetBounds(0, 0, 497, 360);
- BmpFile.Stretch:= true
- BmpFile.Parent:= WizardForm.FinishedPage;
- BmpFile:= TBitmapImage.Create(WizardForm);
- ShowMP3Panel(WizardForm.Handle,80,ExpandConstant('{tmp}'),ExpandConstant('{tmp}'),'',True,False,7000,Indent);
- // Create a 'Cancel unpacking' button and hide it for now.
- btnCancelUnpacking:=TButton.create(WizardForm);
- btnCancelUnpacking.Parent:= WizardForm;
- btnCancelUnpacking.SetBounds(WizardForm.CancelButton.Left, WizardForm.CancelButton.top, WizardForm.CancelButton.Width, WizardForm.CancelButton.Height);
- btnCancelUnpacking.OnClick:= @btnCancelUnpackingOnClick;
- btnCancelUnpacking.Hide;
- with WizardForm do
- begin
- PageNameLabel.Hide;
- PageDescriptionLabel.Hide;
- WelcomeLabel1.Hide;
- WelcomeLabel2.Hide;
- DiskSpaceLabel.Hide;
- SelectDirBitmapImage.Hide;
- SelectDirBrowseLabel.Hide;
- SelectDirLabel.Hide;
- FinishedHeadingLabel.Hide;
- FinishedLabel.Hide;
- MainPanel.Hide
- FilenameLabel.Hide;
- StatusLabel.Hide;
- end;
- with WizardForm do
- begin
- DirBrowseButton.Left:= DirBrowseButton.Left + ScaleX(40);
- DirBrowseButton.Top:= DirBrowseButton.Top + ScaleY(72);
- DirEdit.Left:= DirEdit.Left + ScaleX(40);
- DirEdit.Top:= DirEdit.Top + ScaleY(72);
- NextButton.BringToFront;
- BackButton.BringToFront;
- CancelButton.BringToFront;
- Font.Style:=[];
- Font.Name:= 'MS Sans Serif';
- DirEdit.Color:=clBlack;
- Font.Color:=clWhite;
- ProgressGauge.Top:=ScaleY(120);
- ProgressGauge.Left:=ScaleX(20);
- end;
- with WizardForm do
- begin
- InnerNotebook.Left := ScaleX(0);
- InnerNotebook.Top := ScaleY(0);
- InnerNotebook.Width := ScaleX(497);
- InnerNotebook.Height := ScaleY(360);
- OuterNotebook.Left := ScaleX(0);
- OuterNotebook.Top := ScaleY(0);
- OuterNotebook.Width := ScaleX(497);
- OuterNotebook.Height := ScaleY(360);
- end;
- WelcomeLabel1:= TLabel.Create(WizardForm);
- with WelcomeLabel1 do
- begin
- Left:= ScaleX(176);
- Top:= ScaleY(66);
- Width:= ScaleX(301);
- Height:= ScaleY(54);
- AutoSize:= false;
- Transparent:= true;
- WordWrap:= true;
- Font.Size:= 14;
- Font.Color:=ClWhite
- Font.Style := [fsBold]
- Parent:= WizardForm.WelcomePage;
- Caption:= WizardForm.WelcomeLabel1.Caption; //'Вас приветствует Мастер' + #10 + 'установки Prototype'
- Caption:= 'Вас приветствует Мастер' + #10 + 'установки GTA: San Andreas'
- 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;
- Transparent:= true;
- Parent:= WizardForm.WelcomePage;
- Caption:= WizardForm.WelcomeLabel2.Caption; //'Программа установит Prototype на Ваш компьютер.' + #10#13#10 + 'Рекомендуется закрыть все прочие приложения перед' + #10 + 'тем, как продолжить.' + #10#13#10 + 'Нажмите «Далее», чтобы продолжить или «Отмена»,' + #10 + 'чтобы выйти из прошраммы установки.';
- Caption:= 'Программа установит Grand Theft Auto: San Andreas на Ваш компьютер.' + #10#13#10 + 'Рекомендуется закрыть все прочие приложения перед' + #10 + 'тем, как продолжить.' + #10#13#10 + 'Нажмите «Далее», чтобы продолжить или «Отмена»,' + #10 + 'чтобы выйти из прошраммы установки.'
- 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.Style := [fsBold]
- Transparent:= true;
- Parent:= WizardForm.FinishedPage;
- Caption:= WizardForm.FinishedHeadingLabel.Caption; //'Завершение Мастера установки' + #10 + 'Prototype'
- Caption:= 'Завершение Мастера установки' + #10 + 'Grand Theft Auto: San Andreas'
- 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;
- Parent:= WizardForm.FinishedPage;
- Caption:= 'Игра Grand Theft Auto: San Andreas установлена на Ваш компьютер.' + #10#13#10 + 'Нажмите «Завершить», чтобы выйти из программы' + #10 + 'установки.'
- end;
- // уменьшил размер CheckBox'а, по другому никак
- begin
- dop := TCheckBox.Create(WizardForm);
- with Dop do
- begin
- Parent := WizardForm.SelectDirPage;
- Left := WizardForm.DirEdit.Left;
- Top := WizardForm.DirEdit.Top+53;
- Width := ScaleX(13);
- Height := ScaleY(13);
- TabOrder := 2;
- Checked := False;
- end;
- end;
- lblDop:= TLabel.Create(WizardForm);
- with lblDop do
- begin
- Caption:='Установить дополнительные программы (рекомендуется)';
- Left:= WizardForm.DirEdit.Left + 20;
- Top:= WizardForm.DirEdit.Top + 53;
- Width:= ScaleX(150);
- Height:= ScaleY(13);
- Transparent := True;
- Parent:= WizardForm.SelectDirPage;
- OnClick:= @DopOnClick;
- end;
- Icons:= TCheckBox.Create(WizardForm);
- with Icons do
- begin
- Parent:= WizardForm.SelectDirPage;
- Left:= WizardForm.DirEdit.Left;
- Top:= WizardForm.DirEdit.Top + 35;
- Width:= ScaleX(13);
- Height:= ScaleY(13);
- TabOrder:= 2;
- Checked:= False;
- end;
- lblIcons:= TLabel.Create(WizardForm);
- with lblIcons do
- begin
- Caption:='Создать ярлык на рабочем столе';
- Left:= WizardForm.DirEdit.Left + 20;
- Top:= WizardForm.DirEdit.Top + 35;
- Width:= ScaleX(150);
- Height:= ScaleY(13);
- Transparent := True;
- Parent:= WizardForm.SelectDirPage;
- OnClick:= @IconsOnClick;
- end;
- Group:= TCheckBox.Create(WizardForm);
- with Group do
- begin
- Parent:= WizardForm.SelectDirPage;
- Left:= WizardForm.DirEdit.Left;
- Top:= WizardForm.DirEdit.Top + 71;
- Width:= ScaleX(13);
- Height:= ScaleY(13);
- TabOrder:= 3;
- Checked:= False;
- end;
- lblGroup:= TLabel.Create(WizardForm);
- with lblGroup do
- begin
- Caption:='Создать ярлыки в меню "Пуск"';
- Left:= WizardForm.DirEdit.Left + 20;
- Top:= WizardForm.DirEdit.Top + 71;
- Width:= ScaleX(150);
- Height:= ScaleY(13);
- Transparent := True;
- Parent:= WizardForm.SelectDirPage;
- OnClick:= @GroupOnClick;
- end;
- // создаём lblSelectDir
- lblSelectDir:= TLabel.Create(WizardForm);
- with lblSelectDir do
- begin
- Caption:= WizardForm.SelectDirLabel.Caption;
- Left:= ScaleX(40);
- Top:= WizardForm.SelectDirLabel.Top + ScaleY(62);
- Width:= WizardForm.SelectDirLabel.Width;
- Height:= WizardForm.SelectDirLabel.Height;
- Transparent := True;
- Parent:= WizardForm.SelectDirPage;
- end;
- // создаём lblSelectDirBrowse
- lblSelectDirBrowse:= TLabel.Create(WizardForm);
- with lblSelectDirBrowse do
- begin
- Caption:= WizardForm.SelectDirBrowseLabel.Caption;
- Left:= ScaleX(40);
- Top:= WizardForm.SelectDirBrowseLabel.Top + ScaleY(62);
- Width:= WizardForm.SelectDirBrowseLabel.Width;
- Height:= WizardForm.SelectDirBrowseLabel.Height;
- WordWrap:= True;
- Transparent:= True;
- Parent:= WizardForm.SelectDirPage;
- end;
- NeedSpaceLabel:= TLabel.Create(WizardForm);
- with NeedSpaceLabel do
- begin
- Parent:= WizardForm.SelectDirPage;
- Left:= WizardForm.DirEdit.Left;
- Top:= ScaleY(262);
- Width:= ScaleX(209);
- Height:= ScaleY(13);
- Transparent:= True;
- end;
- FreeSpaceLabel:= TLabel.Create(WizardForm);
- with FreeSpaceLabel do
- begin
- Parent:= WizardForm.SelectDirPage;
- Left:= WizardForm.DirEdit.Left;
- Top:= ScaleY(280);
- Width:= ScaleX(209);
- Height:= ScaleY(13);
- Transparent:= True;
- end;
- WizardForm.DirEdit.OnChange:= @GetFreeSpaceCaption;
- WizardForm.DirEdit.Text:= WizardForm.DirEdit.Text + #0;
- PageNameLabel:= TLabel.Create(WizardForm);
- with PageNameLabel do
- begin
- Left:= WizardForm.PageNameLabel.Left;
- Top:= WizardForm.PageNameLabel.Top;
- Width:= ScaleX(300);
- Height:= ScaleY(14);
- AutoSize:= False;
- Font.Style:= [fsBold];
- Font.Color:= ClWhite;
- Transparent := True;
- Parent:= WizardForm.SelectDirPage;
- end;
- PageNameLabel1:= TLabel.Create(WizardForm);
- with PageNameLabel1 do
- begin
- Left:= WizardForm.PageNameLabel.Left;
- Top:= WizardForm.PageNameLabel.Top;
- Width:= ScaleX(300);
- Height:= ScaleY(14);
- AutoSize:= False;
- Font.Style:= [fsBold];
- Font.Color:= ClWhite;
- Transparent := True;
- Parent:= WizardForm.InstallingPage;
- end;
- PageDescriptionLabel:= TLabel.Create(WizardForm);
- with PageDescriptionLabel do
- begin
- Left:= WizardForm.PageDescriptionLabel.Left;
- Top:= WizardForm.PageDescriptionLabel.top;
- Width:= WizardForm.PageDescriptionLabel.Width;
- Height:= WizardForm.PageDescriptionLabel.Height;
- AutoSize:= False;
- Transparent := True;
- Parent:= WizardForm.SelectDirPage;
- end;
- PageDescriptionLabel1:= TLabel.Create(WizardForm);
- with PageDescriptionLabel1 do
- begin
- Left:= WizardForm.PageDescriptionLabel.Left;
- Top:= WizardForm.PageDescriptionLabel.top;
- Width:= WizardForm.PageDescriptionLabel.Width;
- Height:= WizardForm.PageDescriptionLabel.Height;
- AutoSize:= False;
- Transparent := True;
- Parent:= WizardForm.InstallingPage;
- end;
- StatusLabel:= TLabel.Create(WizardForm);
- with StatusLabel do
- begin
- Left:= ScaleX(20);
- Top:= ScaleY(80);
- Width:= WizardForm.StatusLabel.Width;
- Height:= WizardForm.StatusLabel.Height;
- AutoSize:= False;
- Transparent := True;
- Parent:= WizardForm.InstallingPage;
- Caption:= 'Распаковка файлов игры...'
- end;
- FilenameLabel:= TLabel.Create(WizardForm);
- with FilenameLabel do
- begin
- Left:= ScaleX(20);
- Top:= ScaleY(100);
- Width:= WizardForm.StatusLabel.Width;
- Height:= WizardForm.StatusLabel.Height;
- AutoSize:= False;
- Transparent := True;
- Parent:= WizardForm.InstallingPage;
- end;
- with WizardForm.ProgressGauge do
- begin
- // Create a label to show current FileName being extracted
- lblExtractFileName:= TLabel.Create(WizardForm);
- lblExtractFileName.parent:=WizardForm.InstallingPage;
- lblExtractFileName.autosize:=false;
- lblExtractFileName.Width:= Width;
- lblExtractFileName.top:=Top + ScaleY(35);
- lblExtractFileName.Caption:= '';
- lblExtractFileName.Hide;
- // Create a label to show percentage
- ExtractFile:= TLabel.Create(WizardForm);
- ExtractFile.parent:=WizardForm.InstallingPage;
- ExtractFile.autosize:=false;
- ExtractFile.Width:= Width;
- ExtractFile.top:=lblExtractFileName.Top + ScaleY(16);
- ExtractFile.caption:= '';
- ExtractFile.Hide;
- end;
- end;
- procedure CurPageChanged(CurPageID: Integer);
- begin
- PageNameLabel.Caption:= WizardForm.PageNameLabel.Caption;
- PageDescriptionLabel.Caption:= WizardForm.PageDescriptionLabel.Caption;
- PageNameLabel1.Caption:= WizardForm.PageNameLabel.Caption;
- PageDescriptionLabel1.Caption:= WizardForm.PageDescriptionLabel.Caption;
- if CurPageID = wpSelectDir then
- begin
- WizardForm.NextButton.Caption:= ExpandConstant('{cm:BUT}');
- GetNeedSpaceCaption;
- if FreeMB < NeedSize then
- WizardForm.NextButton.Enabled:=False;
- begin
- if CurPageID=wpInstalling
- then
- if CurPageID=wpFinished
- then
- begin
- WizardForm.Width:=497;
- WizardForm.Height:=358;
- WizardForm.Position:=poScreenCenter;
- end
- end;
- end;
- if (CurPageID = wpFinished) and (UnPackError <> 0) then
- begin // Extraction was unsuccessful (распаковщик вернул ошибку)
- // Show error message
- WizardForm.FinishedLabel.Font.Color:= $0000C0; // red (красный)
- WizardForm.FinishedLabel.Height:= WizardForm.FinishedLabel.Height * 2;
- WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) + #13#10#13#10 + msgError;
- end;
- end;
- //function InitializeSetup(): Boolean;
- //begin
- // Result := InitializeSetup2(); if not Result then exit;
- //end;
- procedure DeinitializeSetup();
- begin
- ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
- UnloadSkin();
- end;
- //; --- Dispatching code ------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement