Code:
#define needsize 5000000
[Setup]
AppName=Rina
DefaultDirName={pf}\Rina
DefaultGroupName=Rina
AppVerName=Rina
[Icons]
Name: "{userdesktop}\un"; Filename: "{app}\unins000.exe"; WorkingDir: "{app}"; Check: "CheckError";
[Files]
Source: "Files\unarc.dll"; DestDir: "{tmp}"; Flags: "dontcopy";
Source: "Files\ISDone.dll"; DestDir: "{tmp}"; Flags: "dontcopy";
[messages]
ButtonNext=< install >
[code*]
var
ISDoneCancel:integer;
ISDoneError:boolean;
const
PCFonFLY=true;
notPCFonFLY=false;
type
TCallback = function (OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;
function WrapCallback(callback:TCallback; paramcount:integer):longword;external 'wrapcallback@files:ISDone.dll stdcall delayload';
function ISArcExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath, ExtractedPath: AnsiString; DeleteInFile:boolean; Password, CfgFile, WorkPath: AnsiString; ExtractPCF: boolean ):boolean; external 'ISArcExtract@files:ISDone.dll stdcall delayload';
function Exec2 (FileName, Param: PAnsiChar;Show:boolean):boolean; external 'Exec2@files:ISDone.dll stdcall delayload';
function FileSearchInit(RecursiveSubDir:boolean):boolean; external 'FileSearchInit@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 SuspendProc:boolean; external 'SuspendProc@files:ISDone.dll stdcall';
function ResumeProc:boolean; external 'ResumeProc@files:ISDone.dll stdcall';
function ProgressCallback(OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;
begin
if OveralPct<=1000 then WizardForm.ProgressGauge.Position := OveralPct;
WizardForm.Caption:=CurrentFile;
Result := ISDoneCancel;
end;
procedure CancelButtonOnClick(Sender: TObject);
begin
SuspendProc;
if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then ISDoneCancel:=1;
ResumeProc;
end;
function CheckError:boolean;
begin
result:= not ISDoneError;
end;
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 MbOrTb(Float: Extended): String;
begin
if Float < 1024 then Result:= NumToStr(Float)+' MB' else
if Float/1024 < 1024 then Result:= NumToStr(Float/1024)+' GB' else
Result:= NumToStr(Float/(1024*1024))+' TB';
end;
function NextButtonClick(CurPageID: Integer): Boolean;
var
FreeMB, TotalMB: Cardinal;
begin
Result := True;
if CurPageID = wpWelcome then begin
GetSpaceOnDisk(ExtractFileDrive(WizardForm.DirEdit.Text), True, FreeMB, TotalMB);
if FreeMB<{#needsize} then begin
MsgBox('bla bla: '+MbOrTb({#needsize})+#13'bla bla bla '+MbOrTb(FreeMB)+' bla '+MbOrTb(TotalMB), mbError, mb_Ok);
Result := False ;
end;
end;
end;
procedure InitializeWizard();
begin
WizardForm.ProgressGauge.Max:=1000;
end;
procedure CurStepChanged(CurStep: TSetupStep);
var ExecError:boolean;
begin
case CurStep of
ssInstall: begin
WizardForm.CancelButton.OnClick := @CancelButtonOnClick;
ISDoneCancel:=0;
ExtractTemporaryFile('unarc.dll');
ISDoneError:=true;
if ISDoneInit(ExpandConstant('{src}'), $F777, 0,0,0, MainForm.Handle, 512, @ProgressCallback) then begin
repeat
if not FileSearchInit(true) then break;
if not ISArcExtract ( 0, 100, ExpandConstant('{src}\data1.arc'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
ISDoneError:=false;
until true;
ISDoneStop;
end;
end;
ssPostInstall: begin
if ISDoneError then begin
WizardForm.ProgressGauge.Hide;
WizardForm.StatusLabel.Caption:=SetupMessage(msgStatusRollback);
Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', false);
end;
end;
end;
end;
function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID=8) or (PageID=10) or (PageID=7) or (PageID=6) then Result:=true;
end;