Inno Setup GameScript Generator

Для тех, кто хочет сделать мир лучше.
Сообщение
Автор
Аватара пользователя
Valera2009
Сержант
Сержант
Сообщения: 64
Зарегистрирован: 04.07.2009

#316 Сообщение 13.07.2009, 15:43

http://immage.de/image-6,05070f3.png,123598,0.html вот тут игра в 3архивах иони распаковываются и сжато покруче чем ultra64 ,но меня интересует другой вопрос как сделать %

M1ke
Модератор
Модератор
Сообщения: 1464
Зарегистрирован: 17.06.2007
Откуда: 54
Благодарил (а): 2 раза
Поблагодарили: 90 раз
Контактная информация:

#317 Сообщение 13.07.2009, 16:19

я могу ошибиться, но весьма похоже на использование отредактированного расширения Corona Skin & Check System Requirements
Изображение
Изображение
Изображение

Аватара пользователя
Valera2009
Сержант
Сержант
Сообщения: 64
Зарегистрирован: 04.07.2009

#318 Сообщение 13.07.2009, 18:32

Хм...сча почитаю

Добавлено спустя 46 минут 42 секунды:
жесть)))пошол искать Corona Skin & Check System Requirements наткнулся на руборд и там меня затянуло)))сейчас експерементирую :blush: получаются странные веши =@

Добавлено спустя 47 минут 15 секунд:

Код: Выделить всё

	#define SkinPath AddBackslash(SourcePath) + "Corona\"	;путь к файлам обложки (SourcePath - это папка главного (этого) скрипта)
Я вот немного недогоняю :O: и Corona Skin & Check System Requirements скрипт этот корона нужно копировать в папку с Inno или куда угодно?? :crazy:

South
Разработчик
Разработчик
Сообщения: 287
Зарегистрирован: 18.06.2006
Откуда: с работы
Поблагодарили: 2 раза

#319 Сообщение 14.07.2009, 00:30

Valera2009 писал(а):К тому времени как ты ответил я уже разобрался!и цвет там был как у [удалено]!
я уж не знаю что ты там написал, но предполагаю, что ты сделал скрипт с применением steam-скина. потом заменил его на свой. в итоге надпись в левом нижнем углу осталась стилизована по цвету под стим. а ты этот цвет называешь плохим словом :)
Fatman2008 писал(а):Ждём :good:
думаю это будет не очень скоро. со временем опять тоскливо.
Valera2009 писал(а):вот тут игра в 3архивах иони распаковываются и сжато покруче чем ultra64 ,но меня интересует другой вопрос как сделать %
сжато FreeArc'ом скорее всего
Valera2009 писал(а):жесть)))пошол искать Corona Skin & Check System Requirements наткнулся на руборд и там меня затянуло)))сейчас експерементирую :blush: получаются странные веши =@
туда надо было первым делом заглянуть, думаю много вопросов бы отпало
Valera2009 писал(а):Я вот немного недогоняю :O: и Corona Skin & Check System Requirements скрипт этот корона нужно копировать в папку с Inno или куда угодно?? :crazy:
копировать в любую папку, компилировать example.iss, можно его же и править под себя

Добавлено спустя 8 минут 32 секунды:
опять небольшой апдейт. обновка одна
  • - добавлена возможность сохранять свои данные в .ist-файл для дальнейшего открытия и редактирования
ЗЫ обозвал v 1.0. думаю для единички функционала хватит
все пропало

SerotoninDaGrotesque
Нович0к
Нович0к
Сообщения: 2
Зарегистрирован: 14.07.2009
Откуда: Zelenodolsk

#320 Сообщение 14.07.2009, 01:30

Мэга сорр за нубасовский вопрос, но как сделать чтобы изображение было на всё окно инсталлятора
[spoiler=""пример""]Изображение[/spoiler]
###

KKSeven92
VIP
VIP
Сообщения: 1821
Зарегистрирован: 12.05.2008
Благодарил (а): 1 раз
Поблагодарили: 8 раз
Контактная информация:

#321 Сообщение 14.07.2009, 05:01

Я просто напишу сообщение, что бы td на главной не растягивался от ника SerotoninDaGrotesque.

Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#322 Сообщение 14.07.2009, 08:16

SerotoninDaGrotesque писал(а):[spoiler=""пример""]http://immage.de/image-7,13074f111.png,0,0.html[/spoiler]
О ужас. Автору не стоит показываться Лебедеву на глаза с таким инсталлятором. Картинка с таким шрифтом и "просто так" приделанной кнопкой из медиаплеера - это эпичная жесть. Лучше и тебе, ДолгоНикПисать, так не делать.

Аватара пользователя
Valera2009
Сержант
Сержант
Сообщения: 64
Зарегистрирован: 04.07.2009

#323 Сообщение 14.07.2009, 10:25

SerotoninDaGrotesque писал(а):Мэга сорр за нубасовский вопрос, но как сделать чтобы изображение было на всё окно инсталлятора
[spoiler=""пример""]Изображение[/spoiler]
Ну или картирку растяни вручную или кодом растяни картинку

SerotoninDaGrotesque
Нович0к
Нович0к
Сообщения: 2
Зарегистрирован: 14.07.2009
Откуда: Zelenodolsk

#324 Сообщение 14.07.2009, 13:49

Valera2009
не подскажиш что и где именно нужно растянуть и если код то какой)
###

Аватара пользователя
Valera2009
Сержант
Сержант
Сообщения: 64
Зарегистрирован: 04.07.2009

#325 Сообщение 14.07.2009, 14:10

Ну если физически то фошопом или Paintnet ну вообше любым графическим редактором кроме как обычный Paint а про код сча поищу

Аватара пользователя
[artemon]
Капитан
Капитан
Сообщения: 342
Зарегистрирован: 11.08.2008
Откуда: тут нашлось столько гнилья?
Контактная информация:

#326 Сообщение 14.07.2009, 18:36

добавлена возможность сохранять свои данные в .ist-файл для дальнейшего открытия и редактирования[/list]
ЗЫ обозвал v 1.0. думаю для единички функционала хватит
Спасибо , скачал.

South большая просьба,помочь мне в реализации следующего:
Сделать установщик нескольких программ (дц,опера с уже нужными готовыми настройками).
И фишка в том,что пользователь может выбрать установить ему программу полностью,или установить только настройки (тогда юзер указывает папку с его установленной прогой ,А инстал копирует туда только файлы настройки).

незнаю в какую сторону копать.. prankster
Заранее благодарен.

Аватара пользователя
Vit_amiN
Супермодератор
Супермодератор
Сообщения: 2509
Зарегистрирован: 01.02.2007
Откуда: Over Old Hills
Благодарил (а): 15 раз
Поблагодарили: 91 раз

#327 Сообщение 14.07.2009, 18:54

[artemon]
Юзай чекбоксы (доп. параметры установки, Tasks)
Изображение

Мои русификаторы и другие полезные файлы здесь
ЗАПОМНИТЕ, ПОИСК — БЛИЖАЙШИЙ ПУТЬ К ИСТИНЕ!

Аватара пользователя
RomanSnegov
Капитан
Капитан
Сообщения: 365
Зарегистрирован: 07.10.2007
Откуда: CCCР
Контактная информация:

#328 Сообщение 15.07.2009, 01:51

[quote="South"][/quote]
спасибо, пробуем... порадовал. :)
Изображение
Изображение
Изображение
Изображение

Аватара пользователя
Valera2009
Сержант
Сержант
Сообщения: 64
Зарегистрирован: 04.07.2009

#329 Сообщение 15.07.2009, 12:06

[spoiler=""Код""]

Код: Выделить всё

#define Archives "{src}*.arc";
[Setup]
SourceDir=.
AppName=Age of Pirates 2 City of Abandoned Ships
AppVerName=Age of Pirates 2 City of Abandoned Ships
AppVersion=Age of Pirates 2 City of Abandoned Ships
AppPublisher=valera2009
AppCopyright=valera2009
DefaultDirName={pf}Age of Pirates 2 City of Abandoned Ships
DefaultGroupName=Age of Pirates 2 City of Abandoned Ships
AllowNoIcons=yes
InfoBeforeFile=I:RepackAge of Pirates 2 City of Abandoned Ships1.txt
OutputBaseFilename=setup
WizardImageFile=D:Мусор14.0457.bmp
WizardSmallImageFile=D:Мусор32131.bmp
SetupIconFile=D:lacklabel.ico
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
Compression=lzma/ultra64
SolidCompression=yes
OutputDir=.
DiskSpanning=true
DiskSliceSize=14000000

[Languages]
Name: eng; MessagesFile: compiler:Default.isl
Name: rus; MessagesFile: compiler:LanguagesRussian.isl

[CustomMessages]
eng.ArcBreak=Installation cancelled!
eng.ArcError=Decompression failed with error code %1
eng.ArcBroken=Archive «%1» is damaged or not enough free space.
eng.ArcFail=Decompression failed!
eng.ArcTitle=Extracting FreeArc archive...
eng.StatusInfo=Files: %1%2, progress %3%%, remaining time %4
eng.ArcInfo=archive: %1 из %2, size %3 of %5, %4%% extracted
eng.ArcFinish=Unpacked archives: %1, received files: %2 [%3]
eng.taskbar=%1%%, %2 remains
eng.ending=ending
eng.hour=hours
eng.min=mins
eng.sec=secs
;
rus.ArcBreak=Установка прервана!
rus.ArcError=Распаковщик FreeArc вернул код ошибки: %1
rus.ArcBroken=Возможно, архив «%1» повреждён или недостаточно места на диске назначения.
rus.ArcFail=Распаковка не завершена!
rus.ArcTitle=Распаковка FreeArc-архива...
rus.StatusInfo=файлов: %1%2, %3%% выполнено, осталось ждать %4
rus.ArcInfo=Архив %1 из %2, объём %3 из %5, %4%% распаковано
rus.ArcFinish=Распаковано архивов: %1, получено файлов: %2 [%3]
rus.taskbar=%1%%, жди %2
rus.ending=завершение
rus.hour=часов
rus.min=мин
rus.sec=сек

[Files]
Source: I:1.arc; DestDir: {app}; Flags: nocompression
Source: unarc.dll; DestDir: {tmp}; Flags: dontcopy deleteafterinstall
Source: compiler:InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy
;эта строка демонстрирует показ сведений и времени завершения при обычном извлечении файлов
Source: {win}inf*; DestDir: {app}files; Flags: external

Source: I:RepackAge of Pirates 2 City of Abandoned Ships14.07.jpg; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression solidbreak
Source: I:RepackAge of Pirates 2 City of Abandoned Ships174-g.jpg; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression solidbreak
Source: I:RepackAge of Pirates 2 City of Abandoned Ships176-r.jpg; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression solidbreak
Source: I:RepackAge of Pirates 2 City of Abandoned Ships179-r.jpg; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression solidbreak
Source: I:RepackAge of Pirates 2 City of Abandoned Ships182-r.jpg; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression solidbreak
Source: I:RepackAge of Pirates 2 City of Abandoned Ships189-r.jpg; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression solidbreak
Source: I:RepackAge of Pirates 2 City of Abandoned Ships190-r.jpg; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression solidbreak
Source: I:RepackAge of Pirates 2 City of Abandoned Ships191-r.jpg; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression solidbreak
Source: I:RepackAge of Pirates 2 City of Abandoned Ships192-r.jpg; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression solidbreak
Source: I:RepackAge of Pirates 2 City of Abandoned Ships197-r.jpg; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression solidbreak
Source: isgsg.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression solidbreak
Source: bass.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression solidbreak
Source: I:МузыкаRAPOST_-_He_s_A_Pirate.mp3; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression solidbreak
[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}

[Icons]
Name: {group}Age of Pirates 2 City of Abandoned Ships; Filename: {app}config.exe; WorkingDir: {app}
Name: {userdesktop}Age of Pirates 2 City of Abandoned Ships; Filename: {app}config.exe; WorkingDir: {app}; Tasks: desktopicon
Name: {group}{cm:UninstallProgram,Age of Pirates 2 City of Abandoned Ships}; Filename: {uninstallexe}

[Run]
Description: {cm:LaunchProgram, Age of Pirates 2 City of Abandoned Ships}; Filename: {app}config.exe; WorkingDir: {app}; Flags: nowait postinstall skipifsilent unchecked

[UninstallDelete]
Type: filesandordirs; Name: {app}

[code]
var Debug: TForm; Dl: TMemo; cDebug: boolean; Procedure D(S: string); Begin if not cDebug then begin Debug:= CreateCustomForm; Debug.SetBounds(8, 4, 380, 580) Debug.Show Dl:=TMemo.Create(Debug) Dl.Align:= alClient; Dl.ScrollBars:= ssVertical; Dl.WantReturns:= False; Dl.Parent:= Debug; cDebug:= true end; if Dl.Lines.Text = '' then Dl.Lines.Text:= S else Dl.Lines.Insert(Dl.Lines.Count, S) End; Procedure Df(S: Extended); begin D(FloatToStr(S)) End;

const
  Indent=25;
    Archives = 'I:*.arc';   // список путей к архивам (с масками), разделённых знаком |
    PM_REMOVE = 1;
    CP_ACP = 0; CP_UTF8 = 65001;
    oneMB=1024*1024;
    Period = 250; // частота обновления кнопки таскбара и строки статуса
    HC_ACTION = 0;
    VK_ESCAPE = 27;
    WM_PAINT = $F;
    WH_CALLWNDPROC = 4;

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
#define isFalse(any S)  (S = LowerCase(Str(S))) == "no" || S == "false" || S == "off" ? "true" : "false"

    TMessage = record hWnd: HWND; msg, wParam: Word; lParam: LongWord; Time: TFileTime; pt: TPoint; end;
    TFreeArcCallback = function (what: PAnsiChar; int1, int2: Integer; str: PAnsiChar): Integer;
    TArc = record Path: string; Size: Extended; end;
    TBarInfo = record stage, name: string; size: Extended; count, perc, pos, time: Integer; end;
    TCWPSTRUCT = record lParam: LongWord; wParam: Word; Msg: LongWord; hwnd: HWnd; end;
    TCWPSTRUCTProc = procedure(Code: Integer; wParam: Word; lParam: TCWPSTRUCT);
    TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);

var
    ExtractFile, StatusInfo: TLabel;
    ProgressBar: TNewProgressBar;
    CancelCode, n, ArcInd, UnPackError, StartInstall: Integer;
    Arcs: array of TArc;
    msgError: string;
    lastMb, baseMb: Integer;
    LastTimerEvent: DWORD;
    WndHookID, TimerID: LongWord;
    allSize: Extended;
    Status: TBarInfo;

function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external '[email protected] stdcall delayload';
function ssInitialize(hOwner:HWND;ssTimeShow:integer;FadeOut:boolean):boolean; external 'ssInitialize@files:isgsg.dll stdcall delayload';
procedure ssDeInitialize; external 'ssDeInitialize@files:isgsg.dll stdcall delayload';
procedure ssSetBkgImage(FileName:PChar); external 'ssSetBkgImage@files:isgsg.dll stdcall delayload';
procedure ssAddImage(FileName:PChar); external 'ssAddImage@files:isgsg.dll stdcall delayload';
procedure ssStartShow; external 'ssStartShow@files:isgsg.dll stdcall delayload';
procedure ssStopShow; external 'ssStopShow@files:isgsg.dll stdcall delayload';
function GetSystemMetrics(nIndex:Integer):integer; external '[email protected] 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';

 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';

Function OemToChar(lpszSrc, lpszDst: AnsiString): longint; external '[email protected] stdcall';
Function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: PAnsiChar; cbMultiByte: integer; lpWideCharStr: PAnsiChar; cchWideChar: integer): longint; external '[email protected] stdcall';
Function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: PAnsiChar; cchWideChar: integer; lpMultiByteStr: PAnsiChar; cbMultiByte: integer; lpDefaultChar: integer; lpUsedDefaultChar: integer): longint; external '[email protected] stdcall';

function PeekMessage(var lpMsg: TMessage; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external '[email protected] stdcall';
function TranslateMessage(const lpMsg: TMessage): BOOL; external '[email protected] stdcall';
function DispatchMessage(const lpMsg: TMessage): Longint; external '[email protected] stdcall';

function GetTickCount: DWord; external 'GetTickCount@kernel32';
function SetWindowText(hWnd: Longint; lpString: String): Longint; external 'SetWindowText{#A}@user32 stdcall delayload';
function GetKeyState(nVirtKey: Integer): ShortInt; external 'GetKeyState@user32 stdcall delayload';
function GetCurrentThreadId: LongWord; external 'GetCurrentThreadId@kernel32 stdcall delayload';

function CallNextWNDPROC(idHook: LongWord; Code: Integer; wParam: Word; lParam: TCWPSTRUCT): LongWord; external 'CallNextHookEx@user32 stdcall delayload';
function SetWindowsHookEx(idHook: LongWord; callback: LongWord; hMod: LongWord; dwThreadID: HWND): LongWord; external 'SetWindowsHookExW@user32 stdcall delayload';
function UnhookWindowsHookEx(idHook: LongWord): LongWord; external 'UnhookWindowsHookEx@user32 stdcall delayload';
function WrapCWPSTRUCTProc(callback:TCWPSTRUCTProc; paramcount:integer): longword; external 'wrapcallback@files:innocallback.dll';
function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): longword; external 'SetTimer@user32';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32 stdcall delayload';

procedure AppProcessMessage;
var
    Msg: TMessage;
begin
    if not PeekMessage(Msg, {WizardForm.Handle} 0, 0, 0, PM_REMOVE) then Exit;
    TranslateMessage(Msg); DispatchMessage(Msg);
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;

// Перевод числа в строку с точностью 2 знака (%.2n) с округлением дробной части, если она есть
Function NumToStr(Float: Extended): String;
Begin
    Result:= Format('%.2n', [Float]); StringChange(Result, ',', '.');
    while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
        SetLength(Result, Length(Result)-1);
End;

Function ByteOrTB(Bytes: Extended; noMB: Boolean): String; {Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 2х знаков после запятой)}
    Begin
        if not noMB then Result:= NumToStr(Int(Bytes)) +' Mb' else
            if Bytes < 1024 then if Bytes = 0 then Result:= '0' else Result:= NumToStr(Int(Bytes)) +' Bt' else
                if Bytes/1024 < 1024 then Result:= NumToStr(round((Bytes/1024)*10)/10) +' Kb' else
                    If Bytes/oneMB < 1024 then Result:= NumToStr(round(Bytes/oneMB*100)/100) +' Mb' else
                        If Bytes/oneMB/1000 < 1024 then Result:= NumToStr(round(Bytes/oneMB/1024*1000)/1000) +' Gb' else
                            Result:= NumToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Tb';
    End;

// Converts milliseconds to human-readable time
// Конвертирует милисекунды в человеко-читаемое изображение времени
Function TicksToTime(Ticks: DWord; h,m,s: String; detail: Boolean): String;
Begin
    if detail then            {hh:mm:ss format}
        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 then    {more than hour}
        Result:= IntToStr(Ticks/3600000) +h+' '+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +m
    else if Ticks/60 >= 1000 then    {1..60 minutes}
        Result:= IntToStr(Ticks/60000) +m+' '+ IntToStr(Ticks/1000 - Ticks/1000/60*60) +s
    else Result:= Format('%.1n', [Abs(Ticks/1000)]) +s    {less than one minute}
End;

function cm(Message: String): String; Begin Result:= ExpandConstant('{cm:'+ Message +'}') End;

Function LoWord(lw: LongWord): LongWord; Begin Result:= lw shr 16; 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, nRet2: integer; WideCharBuf, MultiByteBuf: AnsiString;
begin
    SetLength(WideCharBuf, Length(strSource) * 2);
    SetLength(MultiByteBuf, Length(strSource) * 2);
    nRet:= MultiByteToWideChar(CP_ACP, 0, strSource, -1, WideCharBuf, Length(WideCharBuf));
    nRet2:= WideCharToMultiByte(CP_UTF8, 0, WideCharBuf, -1, MultiByteBuf, Length(MultiByteBuf), 0, 0);
    if nRet * nRet2 = 0 then Result:= strSource else Result:= MultiByteBuf;
end;

// Scans the specified folders for archives and add them to list
function FindArcs(files: string): Extended; // при каждом вызове подсчитанный размер увеличивается
    var FSR: TFindRec;
Begin
    if FindFirst(ExpandConstant(files), FSR) then
        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(files)) + FSR.Name;
                Arcs[n].Size:= Size64(FSR.SizeHigh, FSR.SizeLow);
                Result:= Result + Arcs[n].Size;
            until not FindNext(FSR);
        finally
            FindClose(FSR);
        end;
End;

    var FreezeTimer: Boolean;
Procedure UpdateStatus(Flags: Integer);   // выполняется с переодичностью, заданной константой Period
var
    Remaining: Integer; i, t, s: string;
Begin
    if Flags and $1 > 0 then FreezeTimer:= Flags and $2 = 0; //  bit 0 = 1 change start/stop, bit 1 = 0 stop, bit 1 = 1 start
    if Flags and $4 > 0 then LastTimerEvent:= 0; // bit 2 = 1 reset Timer
    if FreezeTimer or (GetTickCount - LastTimerEvent <= Period) then Exit else LastTimerEvent:= GetTickCount;
  with WizardForm.ProgressGauge do begin
    if position > 0 then Remaining:= trunc((GetTickCount - StartInstall) * Abs((max - position)/position)) else Remaining:= 0;
        t:= cm('ending'); i:= t;
        if Remaining > 0 then begin
            t:= FmtMessage(cm('taskbar'), [IntToStr(Status.perc/10), TicksToTime(Remaining, 'h', 'm', 's', false)])
            i:= TicksToTime(Remaining, cm('hour'), cm('min'), cm('sec'), false)
        end;
  end;
    SetTaskBarTitle(t); // проценты и оставшееся время на кнопке инсталлятора
    if Status.size > 0 then
        s:= ' ['+ ByteOrTB(Status.size*oneMB, true) +']';   // можно сделать подсчёт размера папки {app} через CalcDirSize, но это может замедлить работу
    StatusInfo.Caption:= FmtMessage(cm('StatusInfo'), [IntToStr(Status.count +ord(Status.count < 0)), s, Format('%.1n', [Abs(Status.perc/10)]), i]);
// сдвинуть прогрессбар и обновить сведения о распакованных данных при обработке нескольких архивов на этапе распаковки
    if (Status.stage = cm('ArcTitle')) and (GetArrayLength(Arcs) > 1) then begin
        ExtractFile.Caption:= FmtMessage(cm('ArcInfo'), [IntToStr(ArcInd+1), IntToStr(GetArrayLength(Arcs)), ByteOrTB(Arcs[ArcInd].Size, true), Format('%.0n', [Status.pos/(Arcs[ArcInd].Size/oneMB)*100]), ByteOrTB(allSize, true)])
        ProgressBar.Position:= round(ProgressBar.Max * Status.pos/(Arcs[ArcInd].Size/oneMB))
    end;
End;

Procedure MyTimerProc(h, msg, idevent, dwTime: Longword);
Begin
    if WizardForm.CurPageID = wpInstalling then UpdateStatus(0);
End;

Procedure OnWndHook(Code: Integer; wParam: Word; lParam: TCWPSTRUCT);
Begin
  if (Code = HC_ACTION) and (LoWord(lParam.msg) = WM_PAINT) then begin  // подготовка данных для последующего отображения по таймеру
    if (Status.stage <> WizardForm.StatusLabel.Caption) and (WizardForm.StatusLabel.Caption <> '') then begin
        Status.stage:= WizardForm.StatusLabel.Caption;  // текущий этап установки
        if Status.stage = SetupMessage(msgStatusRollback) then begin
            StatusInfo.Hide; ExtractFile.Hide; ProgressBar.Hide;
        end;
    end;
    if (Status.name <> WizardForm.FileNameLabel.Caption) and (WizardForm.FileNameLabel.Caption <> '') then begin // имя файла, названия ярлыка и прочее
        Status.name := WizardForm.FileNameLabel.Caption;    // начало извлечения или распаковки очередного файла
        Case Status.stage of
            SetupMessage(msgStatusExtractFiles), cm('ArcTitle'): // этапы извлечения файлов и распаковки архивов
                Status.count:= Status.count + 1;    // кол-во файлов
        End;
    end;
    with WizardForm.ProgressGauge do begin
        n:= (Max - Min)/1000
        if n > 0 then Status.perc:= (Position-Min)/n;   // 1000 процентов
    end;
    UpdateStatus(0);
  end;
    CallNextWNDPROC(WndHookID, Code, wParam, lParam)    {освобождение события}
End;

// The main callback function for unpacking FreeArc archives
function FreeArcCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer;
    var Elapsed: Extended;
begin
//    if GetTickCount - LastTimerEvent > 1000 then begin
        // This code will be executed once each 1000 ms (этот код будет выполняться раз в 1000 миллисекунд)
        UpdateStatus(0);
        if GetKeyState(VK_ESCAPE) < 0 then
            if WizardForm.CancelButton.Enabled then WizardForm.Close;   // на этапе
//        LastTimerEvent := LastTimerEvent+1000;
//    end;
  Case string(what) of
    'filename': begin   // Update FileName label
        WizardForm.FileNameLabel.Caption:= OemToAnsiStr(str); // извлекаемый файл
    end;
    'progress': if Mb >= 1 then with WizardForm.ProgressGauge do begin
        for n:= 0 to ArcInd-1 do Elapsed:= Elapsed + Arcs[n].Size; Elapsed:= Elapsed/oneMB + Mb; // обработано Mбайт (для небольшого архива точность страдает)
        Position:= round(Max * Elapsed/(allSize/oneMB))
        Status.pos := Mb;   // позиция в текущем архиве
    end;
    'written': begin // Assign to Mb *total* amount of data extracted to the moment from all archives
        lastMb := Mb;   // извлечено из текущего архива
        Status.size := baseMb+Mb; // запоминаем общий объём, чтобы снимать данные по таймеру
    end;
  End;
    AppProcessMessage;
    Result:= CancelCode;
end;

// Extracts all found archives
function UnPack(Archives: string): Integer;
var
    callback: longword;
    FreeMB, TotalMB: Cardinal;
begin
    // если отмена установки разрешена, кнопка Cancel станет доступна
    WizardForm.CancelButton.Enabled:= not {#isFalse(SetupSetting("AllowCancelDuringInstall"))}
    // Get the size of all archives
  Repeat
    if Pos('|',Archives) > 0 then begin
        allSize:= FindArcs(Copy(Archives, 1, Pos('|',Archives) -1)); // сканируем очередную папку
        Delete(Archives, 1, Pos('|',Archives)); // искать далее
    end;
        allSize:= FindArcs(Archives);   // последняя (или единственная) папка с архивами
  Until Pos('|',Archives) = 0;
    // Other initializations
    callback:= WrapFreeArcCallback(@FreeArcCallback,4);   //FreeArcCallback has 4 arguments
    WizardForm.StatusLabel.Caption:= cm('ArcTitle');    // начало этапa распаковки
    ExtractFile.Show; ProgressBar.Show;
    baseMb:= 0;  // обнулить полученные мегабайты, если ранее вёлся подсчёт объёма файлов инсталлятора
    Status.count:= 0;   // не учитывать файлы, извлечённые инсталлятором
    UpdateStatus(7);  // немедленно обновить строку статуса

  for ArcInd:= 0 to GetArrayLength(Arcs) -1 do begin    // архивы в текущей папке
        CancelCode:= 0;
        AppProcessMessage;
        try
            // Pass the specified arguments to 'unarc.dll'
            Result:= FreeArcExtract (callback, 'x', '-o+', '-dp'+ AnsiToUtf8(ExpandConstant('{app}')), '--', AnsiToUtf8(Arcs[ArcInd].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)]);
            WizardForm.StatusLabel.Caption:= msgError;
            WizardForm.FileNameLabel.Caption:= ExtractFileName(Arcs[ArcInd].Path);
            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[ArcInd].Path)]);
            -127: msgError:= cm('ArcBreak');    //Cancel button
            -63:  msgError:= cm('ArcFail');
            end;
            Log(msgError);  // записываем ошибку в лог, а также показываем её текст на странице завершения
            Break;    // прервать цикл распаковки
        end;
    // Удалить текущий архив из папки приложения перед распаковкой файлов из следующего архива
        if Pos(AnsiLowercase(ExpandConstant('{app}')), AnsiLowercase(Arcs[ArcInd].Path)) > 0 then DeleteFile(Arcs[ArcInd].Path);
  end;
    if Result = 0 then WizardForm.StatusLabel.Caption:= FmtMessage(cm('ArcFinish'), [IntToStr(GetArrayLength(Arcs)), IntToStr(Status.count), ByteOrTB(Status.size*oneMB, true)]);
    StatusInfo.Hide; ExtractFile.Hide; ProgressBar.Hide;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
 if CurStep=ssInstall then begin
    ExtractTemporaryFile('174-g.jpg');
    ssAddImage(ExpandConstant('{tmp}')+'174-g.jpg');
    ExtractTemporaryFile('176-r.jpg');
    ssAddImage(ExpandConstant('{tmp}')+'176-r.jpg');
    ExtractTemporaryFile('179-r.jpg');
    ssAddImage(ExpandConstant('{tmp}')+'179-r.jpg');
    ExtractTemporaryFile('182-r.jpg');
    ssAddImage(ExpandConstant('{tmp}')+'182-r.jpg');
    ExtractTemporaryFile('189-r.jpg');
    ssAddImage(ExpandConstant('{tmp}')+'189-r.jpg');
    ExtractTemporaryFile('190-r.jpg');
    ssAddImage(ExpandConstant('{tmp}')+'190-r.jpg');
    ExtractTemporaryFile('191-r.jpg');
    ssAddImage(ExpandConstant('{tmp}')+'191-r.jpg');
    ExtractTemporaryFile('192-r.jpg');
    ssAddImage(ExpandConstant('{tmp}')+'192-r.jpg');
    ExtractTemporaryFile('197-r.jpg');
    ssAddImage(ExpandConstant('{tmp}')+'197-r.jpg');
    ssStartShow;
  end;
  if CurStep=ssPostInstall then ssStopShow;
    if CurStep = ssInstall then begin
        StartInstall:= GetTickCount    {время начала извлечения файлов}
        WndHookID:= SetWindowsHookEx(WH_CALLWNDPROC, WrapCWPSTRUCTProc(@OnWndHook, 3), 0, GetCurrentThreadId);    {установка SendMessage хука}
        TimerID:= SetTimer(0, 0, 500 {полсекунды}, WrapTimerProc(@MyTimerProc, 4));    {установка таймера}
        if not {#isFalse(SetupSetting("Uninstallable"))} then Status.count:= -1; // не считать файл unins000.exe
    end;
    if CurStep = ssPostInstall then
    begin
        StartInstall:= GetTickCount    {время начала распаковки}
        UnPackError:= UnPack(Archives)
        if UnPackError = 0 then
            SetTaskBarTitle(SetupMessage(msgSetupAppTitle)) else
        begin
            // Error occured, uninstall it then
            if not {#isFalse(SetupSetting("Uninstallable"))} then  // деинсталляция разрешёна
                Exec(ExpandConstant('{uninstallexe}'), '/SILENT','', sw_Hide, ewWaitUntilTerminated, n);    // откат установки из-за ошибки unarc.dll
            SetTaskBarTitle(SetupMessage(msgErrorTitle))
            WizardForm.Caption:= SetupMessage(msgErrorTitle) +' — '+ cm('ArcBreak')
        end;
    end;
end;

Procedure CurPageChanged(CurPageID: Integer);
Begin
  if CurPageID=wpInstalling then begin
    WizardForm.MainPanel.Visible:=False;
    WizardForm.Bevel1.Visible:=False;
    WizardForm.Width:=ScaleX(395);
    WizardForm.Height:=ScaleY(142);
    WizardForm.Left:=ScaleX(GetSystemMetrics(0)-WizardForm.Width-Indent);
    WizardForm.Top:=ScaleY(GetSystemMetrics(1)-WizardForm.Height-Indent);
    WizardForm.InnerNotebook.Left:=ScaleX(10);
    WizardForm.InnerNotebook.Top:=ScaleY(10);
    WizardForm.InnerNotebook.Width:=ScaleX(370);
    WizardForm.StatusLabel.Left:=ScaleX(0);
    WizardForm.StatusLabel.Top:=ScaleY(0);
    WizardForm.StatusLabel.Width:=WizardForm.InnerNotebook.Width;
    WizardForm.FileNameLabel.Left:=ScaleX(0);
    WizardForm.FileNameLabel.Top:=ScaleY(20);
    WizardForm.FileNameLabel.Width:=WizardForm.InnerNotebook.Width;
    WizardForm.ProgressGauge.Top:=ScaleY(40);
    WizardForm.ProgressGauge.Width:=WizardForm.InnerNotebook.Width;
    WizardForm.CancelButton.Left:=ScaleX(154);
    WizardForm.CancelButton.Top:=ScaleY(80);
  end;
  if CurPageID=wpFinished then begin
    WizardForm.Visible:=False;
    WizardForm.Width:=502;
    WizardForm.Height:=392;
    WizardForm.Left:=(GetSystemMetrics(0)-WizardForm.Width) div 2;
    WizardForm.Top:=(GetSystemMetrics(1)-WizardForm.Height) div 2;
    WizardForm.Visible:=True;
  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;

procedure WizardClose(Sender: TObject; var Action: TCloseAction);
Begin
  Action:= caNone;    // так надо
    if Status.stage = cm('ArcTitle') then begin // распаковка на этапе ssPostInstall
        UpdateStatus(1); // остановить таймер
        if MsgBox(SetupMessage(msgExitSetupMessage), mbInformation, MB_YESNO) = IDYES then
            CancelCode:= -127;  // прервать распаковку
        UpdateStatus(7); // обновить информацию
    end else
        MainForm.Close; // стандартное нажатие кнопки закрытия окна или отмены.
End;

procedure InitializeWizard();
begin
  ShowMP3Panel(WizardForm.Handle,80,ExpandConstant('{tmp}'),ExpandConstant('{tmp}'),'www.pirat.ca',False,True,0,Indent);
  ssInitialize(GetWindowLong(MainForm.Handle,-8),10,False);
  ExtractTemporaryFile('14.07.jpg');
  ssSetBkgImage(ExpandConstant('{tmp}')+'14.07.jpg');
    with WizardForm.ProgressGauge do begin
// Create controls to show extended info
    StatusInfo:= TLabel.Create(WizardForm);
        StatusInfo.parent:=WizardForm.InstallingPage;
        StatusInfo.Autosize:= false;
        StatusInfo.Top:= Top + ScaleY(32);
        StatusInfo.Width:= Width;
    ProgressBar := TNewProgressBar.Create(WizardForm);
        ProgressBar.SetBounds(Left, StatusInfo.Top + StatusInfo.Height + ScaleY(16), Width, Height);
        ProgressBar.Parent := WizardForm.InstallingPage;
        ProgressBar.max := 65536;
        ProgressBar.Hide;   // будет показан при обработке нескольких архивов
    ExtractFile:= TLabel.Create(WizardForm);
        ExtractFile.parent:=WizardForm.InstallingPage;
        ExtractFile.Autosize:= false;
        ExtractFile.Top:= ProgressBar.Top + ScaleY(32);
        ExtractFile.Width:= Width;
    end;
    WizardForm.OnClose:= @WizardClose   // позволяет прервать распаковку архивов стандартными способами
end;

Procedure DeInitializeSetup;
Begin
  KillMP3Panel;
  ssDeInitialize;
    KillTimer(0, TimerID)        {удаление таймера}
    UnhookWindowsHookEx(WndHookID)    {удаление SendMessage хука}
End;

function InitializeSetup:boolean;
begin
  ExtractTemporaryFile('OST_-_He_s_A_Pirate.mp3');
  ExtractTemporaryFile('bass.dll');
  Result:=True;
end;
[/spoiler]
Почему у меня:
1)Архив *.arc не распаковывается до конца
2)Он сам себя после распаковки не удаляет(Но это возможно из за того что он не до конца распаковывается)

Аватара пользователя
[artemon]
Капитан
Капитан
Сообщения: 342
Зарегистрирован: 11.08.2008
Откуда: тут нашлось столько гнилья?
Контактная информация:

#330 Сообщение 16.07.2009, 17:37

Vit_amiN
а можно подробнее? :(

Ответить Вложения 2