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

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

Автор: troyan90
Дата сообщения: 26.04.2010 14:56
vint56
я немножко не про то спрашиваю. у меня вот че:

Код: Exec(ExpandConstant('{app}\7z.exe'), 'a -tzip -mx0 png.zip .\png\*', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
Автор: Krinkels
Дата сообщения: 26.04.2010 15:02
troyan90
Ну значит используй RMDir
Автор: troyan90
Дата сообщения: 26.04.2010 15:09
разобрался
Автор: Shegorat
Дата сообщения: 26.04.2010 15:35
TechneS

Цитата:
Здравствуйте! Заметил в вашем скрипте FreeArcExtract+DiskPromts v.2.4g
что то типо бага, если раскоментировать строчку
#define precomp GetEnv("ProgramFiles")g+ "\FreeArc\PowerPack\Max\*"
то при установке исчезает время показывающее когда закончитсяgустановка, может это только у меня незнаю.

Нет это не баг, так было и вgисходном скрипте. Просто при использовании прекомпа нельзя получить оставшеесяgвремя, и дабы избежать багов и глюков убран подсчет времени, если используется прекомп.
Автор: TechneS
Дата сообщения: 26.04.2010 15:48
Shegorat

Ну я думаю если этот код заменить на
Source: "C:\Program Files\FreeArc\bin\arc.ini"; DestDir: {sd}; Flags: deleteafterinstall
Source: "C:\Program Files\FreeArc\bin\arc.ini"; DestDir: {sys}; Flags: deleteafterinstall
Source: "C:\Program Files\FreeArc\PowerPack\max\*"; DestDir: {sys}; Flags: deleteafterinstall

то не чего страшного не произойдёт???
Автор: Shegorat
Дата сообщения: 26.04.2010 16:26
TechneS
Arc.ini ищетсяgна диске C:\ Так что путь до него может быть любой, но распаковывать его надо в ту папку, котораяgуказана в скрипте, то же самое с прекомпом.
Автор: Evghenii1990
Дата сообщения: 26.04.2010 16:45
подскажите пожалуйста, ноgвопросов сразу несколько..g

мне нужно чтоб путь к папке указывалсяgиз ключа в реестре, ноgтам кроме самого пути присутствует и название файла и ничего не выходит, получаетсяgтолько пустое поле в строке пути


Цитата:
DefaultDirNam ={reg:HKCR\Applicatnons\left4dead2.exe\shell\open\command], '@'}


путь нужен вот этот :


иначе чтоб стоял другой путь, к примеру D:\gm\L4D2


так же нужно чтоб в папке, в которуюgустановятсяgфайлы, нашло вложенную папку \left4dead2\addons и удалило файл допустим ASD.wdf

ну и наgпоследок хотелось бы узнать, как сделать чтоб отображалсяgпроцесс установки в Мегабайтах, т.е. сколько скопированоgиз общего числа.
Автор: patrnon
Дата сообщения: 26.04.2010 16:54
кто может добавить Модуль распаковки архивов FreeArc в этот Архив?
[more]

[Setup]
AppNam =Hammerfight
AppVerNam =Hammerfight 1.004
AppPublisher=smokie, Inc.
DefaultDirNam ={pf}\Hammerfight
DefaultGroupNam =Hammerfight
;LicenseFile=C:\Documents and Settings\KARANDASH\Рабочий стол\2.txt
;OutputDir=D:\test
OutputBaseFilenam =setup
;SetupIconFile=C:\Documents and Settings\KARANDASH\Рабочий стол\Setup.icog
Compressnon=lzma
SolidCompressnon=yes
DiskSpanning=yes
DiskSliceSize=1073741824
SlicesPerDisk=1
WizardSmallImageFile=fon2.bmp

[Languages]
;Nam : russnan; MessagesFile: compiler:Default.isl
Nam : RUS; MessagesFile: compiler:Languages\Russnan.isl

[Tasks]
Nam : desktopicon; Descriptnon: {cm:CreateDesktopIcon}; GroupDescriptnon: {cm:AdditnonalIcons}; Flags: unchecked

[Messages]
BeveledLabel=RePack by smokie

[Files]
;Source: D:\Victoria 4.3(win)\victoria43.exe; DestDir: {app}; Flags: ignoreversnon
;Source: D:\Victoria 4.3(win)\*; DestDir: {app}; Flags: ignoreversnon recursesubdirs createallsubdirs
Source: fon.bmp; DestDir: {tmp}; Flags: dontcopy
Source: papka.bmp; DestDir: {tmp}; Flags: dontcopy
Source: button.bmp; DestDir: {tmp}; Flags: dontcopy
Source: ISSkin.dll; DestDir: {app}; Flags: dontcopy
Source: Bister.cjstyles; DestDir: {tmp}; Flags: dontcopy
; ====================================== ЛОГО ИГРОМАНИИ ==================================
;Source: imania\manialogo.exe; DestDir: {tmp}; Flags: dontcopy
;Source: imania\LOGO1.bmp; DestDir: {tmp}; Flags: dontcopy
;Source: imania\LOGO2.bmp; DestDir: {tmp}; Flags: dontcopy
;==================================КОНЕЦ ЛОГО ИГРОМАНИИ ==================================

;Source: net11.exe; DestDir: "{app}"; Flags: ignoreversnon createallsubdirs recursesubdirs nocompressnon
Source: data.exe; DestDir: {app}; Flags: ignoreversnon createallsubdirs recursesubdirs nocompressnon
; ОТМЕТЬТЕ: Не используйте "Флажки: Проигнорировать версию" наgлюбых общедоступных системных файлах

[CustomMessages]
FREESIZE=Свободно местаgна диске:
NEEDSIZE=Необходимо местаgна диске:

[Icons]
Nam : {group}\Voltage; WorkingDir: {app}; Filenam : {app}\Hammerfight.exe
Nam : {commondesktop}\Voltage; WorkingDir: {app}; Filenam : {app}\Hammerfight.exe; Tasks: desktopicon

[Registry]
;Root: HKLM; SubKey: SOFTWARE\Akella Gam s\VOLTAGE; ValueType: string; ValueNam : Path; ValueData: {app}; Flags: uninsdeletekey
;Root: HKLM; SubKey: SOFTWARE\Akella Gam s\VOLTAGE; ValueType: string; ValueNam : Uninst; ValueData: {app}\unins000.exe; Flags: uninsdeletekey
;Root: HKLM; SubKey: SOFTWARE\Akella Gam s\VOLTAGE; ValueType: string; ValueNam : StartMenu; ValueData: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Akella Gam s\Voltage
Root: HKLM; SubKey: SOFTWARE\Hammerfight; ValueType: string; ValueNam : UninstallDir; ValueData: D:\gam s\Hammerfight\unins000.exe
Root: HKLM; SubKey: SOFTWARE\Hammerfight; ValueType: string; ValueNam : Desktop; ValueData: C:\Users\smokie\Desktop\g
Root: HKLM; SubKey: SOFTWARE\Hammerfight; ValueType: string; ValueNam : InstallDir; ValueData: D:\gam s\Hammerfight

[Run]
Filenam : {app}\Data.exe; WorkingDir: {app}; Parameters: -x -y -d.; StatusMsg: Идет распаковка данных, подождите пожалуйста...; Flags: runminimized runasoriginaluser
Filenam : cmd.exe; WorkingDir: {app}; Parameters: /C del /F /Q Data.exe; Flags: runhidden runasoriginaluser
;Filenam : {app}\net11.exe; StatusMsg: "Net install...Please wait";

[UninstallDelete]
Type: filesandordirs; Nam : {app}\*.*
Type: dirifempty; Nam : {app}

[Code]
//===================================== IGROMANIA LOGO ===============================
// var ErrorCode: Integer;

//functnon InitializeSetup2(): Boolean;
//begin
// ExtractTemporaryFile('manialogo.exe');
// ExtractTemporaryFile('LOGO1.bmp'); // первое лого извлекаетсяg
// Exec(ExpandConstant('{tmp}\manialogo.exe'), 'LOGO1.bmp 1000 2000 1000'{название картинки, время появления, виденья, исчезанияgв мс},'', SW_SHOWNORMAL, ewWaitUntilTerminated{ожидание пока программа завершится}, ErrorCode); {а дальше что и куда я незнаю - тут уже пусть мастерыgвсе попровят}g
// Sleep(500); // пауза между 1м и 2м лого в мс
//ExtractTemporaryFile('LOGO2.bmp'); // второе лого извлекаетсяg
//Exec(ExpandConstant('{tmp}\manialogo.exe'), 'LOGO2.bmp 1000 2000 1000','', SW_SHOWNORMAL, ewWaitUntilTerminated, ErrorCode);
// Sleep(200); // пауза между лого и появлением окна установки в мс
{далее можно сколько угодно вставлять картинок, даже можно сделать слайд шоу, если убрать строку ниже}g
// Result:=True
//end;
//=============================== KONEC IGROMANIA LOGO ================================



//========================== Стили =======================
procedure LoadSkin(lpszPath: String; lpszIniFileNam : String);
external 'LoadSkin@files:isskin.dll stdcall';

procedure UnloadSkin();
external 'UnloadSkin@files:isskin.dll stdcall';

functnon ShowWindow(hWnd: Integer; uType: Integer): Integer;
external 'ShowWindow@user32.dll stdcall';

functnon InitializeSetup(): Boolean;
begin
gExtractTemporaryFile('Bister.cjstyles');
LoadSkin(ExpandConstant('{tmp}\Bister.cjstyles'), '');
Result := True;
end;

procedure DeinitializeSetup();
begin
gShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
UnloadSkin();
end;

//=======================Конец Стили =====================



const
Color = clblack;g

procedure InitializeWizard1();
var
BmpFile: TBitmapImage;g

begin
WizardForm.PageNam Label.Font.Color:=clWhite;
WizardForm.LicenseAcceptedRadio.Font.Color:=clWhite;
WizardForm.LicenseNotAcceptedRadio.Font.Color:=clWhite;
WizardForm.Font.Color:=clWhite;
WizardForm.Color:=Color;
WizardForm.WelcomePage.Color:=Color;
WizardForm.InnerPage.Color:=Color;
WizardForm.FinishedPage.Color:=Color;
WizardForm.LicensePage.Color:=Color;
WizardForm.PasswordPage.Color:=Color;
WizardForm.InfoBeforePage.Color:=Color;
WizardForm.UserInfoPage.Color:=Color;
WizardForm.SelectDirPage.Color:=Color;
WizardForm.SelectComponentsPage.Color:=Color;
WizardForm.SelectProgramGroupPage.Color:=Color;
WizardForm.SelectTasksPage.Color:=Color;
WizardForm.ReadyPage.Color:=Color;
WizardForm.PreparingPage.Color:=Color;
WizardForm.InstallingPage.Color:=Color;
WizardForm.InfoAfterPage.Color:=Color;
WizardForm.DirEdit.Color:=Color;
WizardForm.DiskSpac Label.Color:=Color;
WizardForm.DirEdit.Color:=Color;
WizardForm.GroupEdit.Color:=Color;
WizardForm.PasswordLabel.Color:=Color;
WizardForm.PasswordEdit.Color:=Color;
WizardForm.PasswordEditLabel.Color:=Color;
WizardForm.ReadyMemo.Color:=Color;
WizardForm.TypesCombo.Color:=Color;
WizardForm.WelcomeLabel1.Color:=Color;
WizardForm.InfoBeforeClickLabel.Color:=Color;
WizardForm.MainPanel.Color:=Color;
WizardForm.PageNam Label.Color:=Color;
WizardForm.PageDescriptnonLabel.Color:=Color;
WizardForm.ReadyLabel.Color:=Color;
WizardForm.FinishedLabel.Color:=Color;
WizardForm.YesRadio.Color:=Color;
WizardForm.NoRadio.Color:=Color;
WizardForm.WelcomeLabel2.Color:=Color;
WizardForm.LicenseLabel1.Color:=Color;
WizardForm.InfoAfterClickLabel.Color:=Color;
WizardForm.ComponentsList.Color:=Color;
WizardForm.ComponentsDiskSpac Label.Color:=Color;
WizardForm.BeveledLabel.Color:=Color;
WizardForm.StatusLabel.Color:=Color;
WizardForm.Filenam Label.Color:=Color;
WizardForm.SelectDirLabel.Color:=Color;
WizardForm.SelectStartMenuFolderLabel.Color:=Color;
WizardForm.SelectComponentsLabel.Color:=Color;
WizardForm.SelectTasksLabel.Color:=Color;
WizardForm.LicenseAcceptedRadio.Color:=Color;
WizardForm.LicenseNotAcceptedRadio.Color:=Color;
WizardForm.UserInfoNam Label.Color:=Color;
WizardForm.UserInfoNam Edit.Color:=Color;
WizardForm.UserInfoOrgLabel.Color:=Color;
WizardForm.UserInfoOrgEdit.Color:=Color;
WizardForm.PreparingLabel.Color:=Color;
WizardForm.FinishedHeadingLabel.Color:=Color;
WizardForm.UserInfoSerialLabel.Color:=Color;
WizardForm.UserInfoSerialEdit.Color:=Color;
WizardForm.TasksList.Color:=Color;
WizardForm.RunList.Color:=Color;
WizardForm.SelectDirBrowseLabel.Color:=Color;
WizardForm.SelectStartMenuFolderBrowseLabel.Color:=Color;

WizardForm.ReadyMemo.ScrollBars:= ssNone

{ WizardForm.Bevel.visible:=False;
WizardForm.BeveledLabel.visible:=False; // Убирает полосы...g
WizardForm.Bevel1.visible:=False; }


begin
ExtractTemporaryFile('papka.bmp');
WizardForm.SelectDirBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\papka.bmp'));
WizardForm.SelectDirBitmapImage.AutoSize:=true;
WizardForm.SelectGroupBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\papka.bmp'));
WizardForm.SelectGroupBitmapImage.AutoSize:=true;
begin
ExtractTemporaryFile('fon.bmp');

BmpFile:= TBitmapImage.Create(WizardForm);
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\fon.bmp'));
BmpFile.SetBounds(0, 0, 497, 318);
BmpFile.Stretch:= true
BmpFile.Parent:= WizardForm.WelcomePage;

BmpFile:= TBitmapImage.Create(WizardForm);
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\fon.bmp'));
BmpFile.SetBounds(0, 0, 497, 318);
BmpFile.Stretch:= true
BmpFile.Parent:= WizardForm.FinishedPage;

with WizardForm do
begin
gWelcomeLabel1.Hide;
gWelcomeLabel2.hide;
gFinishedHeadingLabel.Hide;
gFinishedLabel.Hide;
begin
WizardForm.WizardSmallBitmapImage.SetBounds(0, 0, WizardForm.MainPanel.Width, WizardForm.MainPanel.Height);
end;
end;
end;
end;
end;



const
ButtonWidth = 80;
ButtonHeight = 23;

bidBack = 0;
bidNext = 1;
bidCancel = 2;
bidDirBrowse = 3;
bidGroupBrowse = 4;

var
NeedSize: Integer;
FreeMB, TotalMB: Cardinal;
NeedSpac Label,FreeSpac Label: TLabel;
ButtonPanel: array [0..4] of TPanel;
ButtonImage: array [0..4] of TBitmapImage;g
ButtonLabel: array [0..4] of TLabel;

procedure GetFreeSpac Captnon(Sender: TObject);
var
Path: String;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpac OnDisk(Path, True, FreeMB, TotalMB);
if FreeMB > 1024 then
FreeSpac Label.Captnon := ExpandConstant('{cm:FREESIZE}') + ': ' + FloatToStr(round(FreeMB/1024*100)/100) + ' GB' else // указывать ск нужно местаg
FreeSpac Label.Captnon := ExpandConstant('{cm:FREESIZE}') + ': ' + IntToStr(FreeMB) + 'mb';
if FreeMB < NeedSize then
begin
gWizardForm.NextButton.Enabled := False;
end else
begin
gWizardForm.NextButton.Enabled := True;
ButtonLabel[bidNext].Enabled := True;
ButtonPanel[bidNext].Enabled := True;
end;
end;

procedure GetNeedSpac Captnon;
begin
if NeedSize > 1024 then
NeedSpac Label.Captnon := ExpandConstant('{cm:NeedSize}') + ': ' + FloatToStr(round(NeedSize/1024*100)/100) + ' Mb'g
else
NeedSpac Label.Captnon := ExpandConstant('{cm:NeedSize}') + ': ' + IntToStr(NeedSize)+ ' MB';
end;

procedure ButtonLabelClick(Sender: TObject);
var
Button: TButton;
begin
ButtonImage[TLabel(Sender).Tag].Left:=0
case TLabel(Sender).Tag of
bidBack: Button:=WizardForm.BackButton
bidNext: Button:=WizardForm.NextButton
bidCancel: Button:=WizardForm.CancelButton
bidDirBrowse: Button:=WizardForm.DirBrowseButton
bidGroupBrowse: Button:=WizardForm.GroupBrowseButton
else
Exit
end
Button.OnClick(Button)
end;

procedure ButtonLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ButtonLabel[TLabel(Sender).Tag].Enabled then
ButtonImage[TLabel(Sender).Tag].Left:=-ButtonWidth
end;

procedure ButtonLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ButtonImage[TLabel(Sender).Tag].Left:=0
end;

procedure LoadButtonImage(AButton: TButton; AButtonIndex: integer);
var
Image: TBitmapImage;g
Panel: TPanel;
Labl: TLabel;

begin
Panel:=TPanel.Create(WizardForm)
Panel.Left:=AButton.Left
Panel.Top:=AButton.Top
Panel.Width:=AButton.Width
Panel.Height:=AButton.Height
Panel.Tag:=AButtonIndex
Panel.Parent:=AButton.Parent
ButtonPanel[AButtonIndex]:=Panel

Image:=TBitmapImage.Create(WizardForm)
Image.Width:=160
Image.Height:=23
Image.Enabled:=False
Image.Bitmap.LoadFromFile(ExpandConstant('{tmp}\button.bmp'))
Image.Parent:=Panel
ButtonImage[AButtonIndex]:=Image

with TLabel.Create(WizardForm) do begin
gTag:=AButtonIndex
Parent:=Panel
gWidth:=Panel.Width
gHeight:=Panel.Height
gTransparent:=True
OnClick:=@ButtonLabelClick
OnDblClick:=@ButtonLabelClick
OnMouseDown:=@ButtonLabelMouseDown
OnMouseUp:=@ButtonLabelMouseUp
end

{Labl:=TLabel.Create(WizardForm)
Labl.Left:=10
Labl.Top:=5
Labl.Width:=Panel.Width
Labl.Autosize:=True
Labl.Alignment:=taCenter
Labl.Tag:=AButtonIndex
Labl.Transparent:=True
Labl.Font.Color:=clWhite
Labl.Captnon:=AButton.Captnon
Labl.OnClick:=@ButtonLabelClick
Labl.OnDblClick:=@ButtonLabelClick
Labl.OnMouseDown:=@ButtonLabelMouseDown
Labl.OnMouseUp:=@ButtonLabelMouseUp
Labl.Parent:=Panel
ButtonLabel[AButtonIndex]:=Labl }
Labl:=TLabel.Create(WizardForm)
Labl.Left:=15 // bilo 23
Labl.Top:=5
Labl.Width:=Panel.Width
Labl.Autosize:=True
Labl.Alignment:=taCenter
Labl.Tag:=AButtonIndex
Labl.Transparent:=True
Labl.Font.Color:=clWhite
Labl.Captnon:=AButton.Captnon
Labl.OnClick:=@ButtonLabelClick
Labl.OnDblClick:=@ButtonLabelClick
Labl.OnMouseDown:=@ButtonLabelMouseDown
Labl.OnMouseUp:=@ButtonLabelMouseUp
Labl.Parent:=Panel
ButtonLabel[AButtonIndex]:=Labl
end;



procedure UpdateButton(AButton: TButton;AButtonIndex: integer);
begin
ButtonLabel[AButtonIndex].Captnon:=AButton.Captnon
ButtonPanel[AButtonIndex].Visible:=AButton.Visible
ButtonLabel[AButtonIndex].Enabled:=Abutton.Enabled
end;

procedure LicenceAcceptedRadioOnClick(Sender: TObject);
begin
ButtonLabel[bidNext].Enabled:=True
end;

procedure LicenceNotAcceptedRadioOnClick(Sender: TObject);
begin
ButtonLabel[bidNext].Enabled:=False
end;

procedure InitializeWizard2();
begin
NeedSize := 2200; //Указать ск нужно место в МБ

WizardForm.DiskSpac Label.Hide;

NeedSpac Label := TLabel.Create(WizardForm);
NeedSpac Label.Left := ScaleX(0);
NeedSpac Label.Top := ScaleY(202);
NeedSpac Label.Width := ScaleX(209);
NeedSpac Label.Height := ScaleY(13);
NeedSpac Label.Parent := WizardForm.SelectDirPage;

FreeSpac Label := TLabel.Create(WizardForm);
FreeSpac Label.Left := ScaleX(0);
FreeSpac Label.Top := ScaleY(220);
FreeSpac Label.Width := ScaleX(209);
FreeSpac Label.Height := ScaleY(13);
FreeSpac Label.Parent := WizardForm.SelectDirPage;

WizardForm.BackButton.Width:=ButtonWidth
WizardForm.BackButton.Height:=ButtonHeight

WizardForm.NextButton.Width:=ButtonWidth
WizardForm.NextButton.Height:=ButtonHeight

WizardForm.CancelButton.Width:=ButtonWidth
WizardForm.CancelButton.Height:=ButtonHeight

WizardForm.DirBrowseButton.Left:=337
WizardForm.DirBrowseButton.Width:=ButtonWidth
WizardForm.DirBrowseButton.Height:=ButtonHeight

WizardForm.GroupBrowseButton.Left:=337
WizardForm.GroupBrowseButton.Width:=ButtonWidth
WizardForm.GroupBrowseButton.Height:=ButtonHeight

WizardForm.LicenseAcceptedRadio.OnClick:=@LicenceAcceptedRadioOnClick

WizardForm.LicenseNotAcceptedRadio.OnClick:=@LicenceNotAcceptedRadioOnClick

ExtractTemporaryFile('button.bmp')
LoadButtonImage(WizardForm.BackButton,bidBack)
LoadButtonImage(WizardForm.NextButton,bidNext)
LoadButtonImage(WizardForm.CancelButton,bidCancel)
LoadButtonImage(WizardForm.DirBrowseButton,bidDirBrowse)
LoadButtonImage(WizardForm.GroupBrowseButton,bidGroupBrowse)
end;



procedure CurPageChanged(CurPageID: Integer);
begin
UpdateButton(WizardForm.BackButton,bidBack)
UpdateButton(WizardForm.NextButton,bidNext)
UpdateButton(WizardForm.CancelButton,bidCancel)

if CurPageID = wpSelectDir then
begin
gGetNeedSpac Captnon;
WizardForm.DirEdit.OnChange := @GetFreeSpac Captnon;
WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0;
if FreeMB < NeedSize then
begin
g gWizardForm.NextButton.Enabled := False;
ButtonLabel[bidNext].Enabled := False;
ButtonPanel[bidNext].Enabled := False;
end;
end;
end;

//===================================================== Сис треб ============================================\\g
type
PDisplay_Device = record
cb: DWord;
DeviceNam : array [0..31] of char;
DeviceString: array [0..127] of char;
StateFlags: DWord;
DeviceID, DeviceKey: array [0..127] of char;
end;

TMixerCaps = record
vPid, vDriverVersnon: DWord;
sNam : array [0..31] of char;
Support, cDestinatnons: DWord;
end;

// Проверка версии Windows
#if Pos("4.", GetFileVersnon(AddBackslash(GetEnv("windir"))g+ "Explorer.exe"))g== 1
{Win9x}
TMemoryStatusEx = record
dwLength, dwMemoryLoad: DWord;
LoTotalPhys, LoAvailPhys, LoTotalPageFile, LoAvailPageFile,
LoTotalVirtual, LoAvailVirtual, LoAvailExtendedVirtual, HiTotalPhys,
gHiAvailPhys, HiTotalPageFile, HiAvailPageFile, HiTotalVirtual, HiAvailVirtual,
gHiAvailExtendedVirtual: Integer;
end;
functnon GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
external 'GlobalMemoryStatus@kernel32.dll stdcall';
#else
{WinNT}
TMemoryStatusEx = record
dwLength, dwMemoryLoad: DWord;
LoTotalPhys, HiTotalPhys, LoAvailPhys, HiAvailPhys,
LoTotalPageFile, HiTotalPageFile, LoAvailPageFile, HiAvailPageFile,
LoTotalVirtual, HiTotalVirtual, LoAvailVirtual, HiAvailVirtual, LoAvailExtendedVirtual,
gHiAvailExtendedVirtual: Integer;
end;
functnon GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
external 'GlobalMemoryStatusEx@kernel32.dll stdcall';
#endif

const
DISPLAY_DEVICE_PRIMARY_DEVICE = 4;
oneMB = 1024*1024;
NeedMHz = 2200;
NeedVideoRAM = 128;
NeedSoundCard = 'Creative X-Fi';
NeedMB = 2400; /////////////////////////////////////////////////////////////
NeedPageFile = 1024;

var
InfoPage: TWizardPage;
TopText, BottomText: TNewStaticText;
ChangeText: Boolean;
SystemPanel, ProcessorPanel, VideoPanel,
AudioPanel, RAMPanel, PageFilePanel: TMemo;
SystemVersnonPanel, ProcessorMHzPanel, VideoRAMPanel,
AudioNam Panel, RAMTotalPanel, PageFileTotalPanel: TMemo;
lpCaps: TMixerCaps;
Versnon: TWindowsVersnon;
MemoryEx: TMemoryStatusEx;
n, errCode: Integer;
Keys: TArrayOfString;
DeviceValue: Cardinal;
lpDisplayDevice: PDisplay_Device;

functnon GetSystemMetrics(nIndex: Integer): Integer;
external 'GetSystemMetrics@user32.dll stdcall';

functnon GetDeviceCaps(hDC, nIndex: Integer): Integer;
external 'GetDeviceCaps@GDI32 stdcall';

functnon CreateDC(lpDriverNam , lpDeviceNam , lpOutput: String; lpInitData: Integer): Integer;
external 'CreateDCA@GDI32 stdcall';

functnon EnumDisplayDevices(lpDevice, iDevNum: DWord; var lpDisplayDevice: PDisplay_Device; dwFlags: DWord): Boolean;
external 'EnumDisplayDevicesA@user32.dll stdcall';

functnon mixerGetDevCaps(uDeviceID: LongInt; var lpCaps: TMixerCaps; uSize: LongInt): LongInt;
external 'mixerGetDevCapsA@winmm.dll stdcall';

functnon mixerGetNumDevs: Integer;
external 'mixerGetNumDevs@winmm.dll stdcall';

// Дополнить число до кратного Multiple
functnon ToMultiple(Bytes, Multiple: Integer): Integer;
begin
if Abs(Bytes/Multiple) > Bytes/Multiple then
Result := (Bytes/Multipleg+ 1)*Multiple
else
Result := Bytes
end;

// Перевод числа в значение Бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)
functnon ByteOrTB(Bytes: Extended; noMB: Boolean): String;
begin
if not noMB then
Result := FloatToStr(Int(Bytes)) + ' Мб'g
else
if Bytes < 1024 then
Result := FloatToStr(Int(Bytes)) + ' Бт'g
else
if Bytes/1024 < 1024 then
Result := FloatToStr(round((Bytes/1024)*10)/10) + ' Кб'g
else
if Bytes/oneMB < 1024 then
Result := FloatToStr(round(Bytes/oneMB*100)/100) + ' Мб'g
else
if Bytes/oneMB/1000 < 1024 then
Result := FloatToStr(round(Bytes/oneMB/1024*1000)/1000) + ' Гб'g
else
Result := FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) + ' Тб'g
StringChange(Result, ',', '.')
end;

// Удаление начальных, конечных и повторных пробелов
functnon DelSp(String: String): String;
begin
while (Pos('g ', String) > 0) do Delete(String, Pos('g ', String), 1)
Result := Trim(String)
end;

functnon Size64(Hi, Lo: Integer): Extended;
begin
Result := Lo
if Lo < 0 then
Result := Result + $7FFFFFFF + $7FFFFFFF + 2
forgHi := Hi-1 downto 0 do Result := Result + $7FFFFFFF + $7FFFFFFF + 2
end;

functnon CheckCPU(NeedMHz: Integer): Boolean;
var
String: String;
begin
gString := 'Hardware\Descriptnon\System\CentralProcessor'; RegGetSubkeyNam s(HKLM, String, Keys) // Количество ядер
gforgn := 0 to GetArrayLength(Keys)-1 do
RegQueryStringValue(HKLM, String + '\' + Keys[n], 'ProcessorNam String', Keys[n])
if not RegQueryDWordValue(HKLM, String + '\0', '~MHz', DeviceValue) org(DeviceValue < NeedMHz) then
Exit
else
Result := True
end;

functnon CheckMemorySize(NeedRAM: Integer): Boolean;
begin
gMemoryEx.dwLength := SizeOf(MemoryEx)
if not GlobalMemoryStatusEx(MemoryEx) then
MsgBox('Ошибка функции:' + #13 + 'GlobalMemoryStatusEx', mbError, mb_Ok)
else
if (ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) < NeedRAM) then
Exit
else
Result := True
end;

procedure CreateCheckForm();
begin

TopText := TNewStaticText.Create(InfoPage)
with TopText do
begin
gParent := InfoPage.Surface
Left := 0
AutoSize := True
end

BottomText := TNewStaticText.Create(InfoPage)
with BottomText do
begin
gParent := InfoPage.Surface
Captnon := 'Когда Вы будете готовы продолжить установку, нажмите «Далее».'g
Font.Color := clBlack
Left := 0
Top := 200
AutoSize := True
end

SystemPanel := TMemo.Create(InfoPage)
with SystemPanel do
begin
gText := 'Система'g
Alignment := taCenter
gParent := InfoPage.Surface
Left := ScaleX(0)
Top := ScaleY(33)
gWidth := ScaleX(100)
gHeight := ScaleY(22)
ReadOnly := True
Color := clBlack
end

SystemVersnonPanel := TMemo.Create(InfoPage)
with SystemVersnonPanel do
begin
gAlignment := taLeftJustify
gParent := InfoPage.Surface
Left := ScaleX(104)
Top := SystemPanel.Top
gWidth := ScaleX(310)
gHeight := ScaleY(22)
ReadOnly := True
end

ProcessorPanel := TMemo.Create(InfoPage)
with ProcessorPanel do
begin
gText := 'Процессор'g
Alignment := taCenter
gParent := InfoPage.Surface
Left := ScaleX(0)
Top := SystemPanel.Top + 27
gWidth := ScaleX(100)
gHeight := ScaleY(22)
ReadOnly := True
Color := clBlack
end

ProcessorMHzPanel := TMemo.Create(InfoPage)
with ProcessorMHzPanel do
begin
gAlignment := taLeftJustify
gParent := InfoPage.Surface
Left := ScaleX(104)
Top := ProcessorPanel.Top
gWidth := ScaleX(310)
gHeight := ScaleY(22)
ReadOnly := True
end

VideoPanel := TMemo.Create(InfoPage)
with VideoPanel do
begin
gText := 'Видеоадаптер'g
Alignment := taCenter
gParent := InfoPage.Surface
Left := ScaleX(0)
Top := ProcessorPanel.Top + 27
gWidth := ScaleX(100)
gHeight := ScaleY(22)
ReadOnly := True
Color := clBlack
end

VideoRAMPanel := TMemo.Create(InfoPage)
with VideoRAMPanel do
begin
gAlignment := taLeftJustify
gParent := InfoPage.Surface
Left := ScaleX(104)
Top := VideoPanel.Top
gWidth := ScaleX(310)
gHeight := ScaleY(22)
ReadOnly := True
end

AudioPanel := TMemo.Create(InfoPage)
with AudioPanel do
begin
gText := 'Звуковая карта'g
Alignment := taCenter
gParent := InfoPage.Surface
Left := ScaleX(0)
Top := VideoPanel.Top + 27
gWidth := ScaleX(100)
gHeight := ScaleY(22)
ReadOnly := True
Color := clBlack
end

AudioNam Panel := TMemo.Create(InfoPage)
with AudioNam Panel do
begin
gAlignment := taLeftJustify
gParent := InfoPage.Surface
Left := ScaleX(104)
Top := AudioPanel.Top
gWidth := ScaleX(310)
gHeight := ScaleY(22)
ReadOnly := True
end

RAMPanel := TMemo.Create(InfoPage)
with RAMPanel do
begin
gText := 'Объём памяти'g
Alignment := taCenter
gParent := InfoPage.Surface
Left := ScaleX(0)
Top := AudioPanel.Top + 27
gWidth := ScaleX(100)
gHeight := ScaleY(22)
ReadOnly := True
Color := clBlack
end

RAMTotalPanel := TMemo.Create(InfoPage)
with RAMTotalPanel do
begin
gAlignment := taLeftJustify
gParent := InfoPage.Surface
Left := ScaleX(104)
Top := RAMPanel.Top
gWidth := ScaleX(310)
gHeight := ScaleY(22)
ReadOnly := True
end

PageFilePanel := TMemo.Create(InfoPage)
with PageFilePanel do
begin
gText := 'Файл подкачки'g
Alignment := taCenter
gParent := InfoPage.Surface
Left := ScaleX(0)
Top := RAMPanel.Top + 27
gWidth := ScaleX(100)
gHeight := ScaleY(22)
ReadOnly := True
Color := clBlack
end;

PageFileTotalPanel := TMemo.Create(InfoPage)
with PageFileTotalPanel do
begin
gAlignment := taLeftJustify
gParent := InfoPage.Surface
Left := ScaleX(104)
Top := PageFilePanel.Top
gWidth := ScaleX(310)
gHeight := ScaleY(22)
ReadOnly := True
end

end;

procedure UpdateInfo();
var
DeviceNam , DeviceKey: String;
begin
ChangeText := False

GetWindowsVersnonEx(Versnon)

// Операционная система:
SystemVersnonPanel.Color := $00FF00

DeviceKey := 'Software\Microsoft\Windows NT\CurrentVersnon'g
if not UsingWinNT then StringChange(DeviceKey, 'Windows NT', 'Windows')
RegQueryStringValue(HKLM, DeviceKey, 'ProductNam ', DeviceNam )g
if RegQueryStringValue(HKLM, DeviceKey, 'CSDVersnon', DeviceKey) then
DeviceNam := DeviceNam + ' ' + DeviceKey
gStringChange(DeviceNam , 'Microsoft ', '')
SystemVersnonPanel.Text := ' ' + DeviceNam + ' сборка ' + IntToStr(Versnon.Major) + '.' + IntToStr(Versnon.Minor) +
'.' + IntToStr(Versnon.Build)

if (Pos('2000 Service Pack 4', SystemVersnonPanel.Text) = 0) and // Windows 2000 SP4
(Pos('XP Service Pack 2', SystemVersnonPanel.Text) = 0) and // Windows XP SP2
(Pos('Vista', SystemVersnonPanel.Text) = 0) then // Windows Vista (cgлюбым SP или без него)
begin
g gSystemVersnonPanel.Color := $0000FF
g gChangeText := True
end

// Процессор:
ProcessorMHzPanel.Color := $00FF00

if not CheckCPU(NeedMHz) then
begin
g g ProcessorMHzPanel.Color := $0000FF
g ggChangeText := True
end

ProcessorMHzPanel.Text := ' ' + DelSp(Keys[0]) + ' @' + IntToStr(DeviceValue) + ' MHz'
if GetArrayLength(Keys) > 1 then
ProcessorPanel.Text := 'Процессоры' // + ' (' + IntToStr(GetArrayLength(Keys)) + ')'

// Видеокарта:
VideoRAMPanel.Color := $00FF00

lpDisplayDevice.cb := SizeOf(lpDisplayDevice)
DeviceKey := ''g
n := 0
while not (EnumDisplayDevices(0, n, lpDisplayDevice, 0) and
(lpDisplayDevice.StateFlags and DISPLAY_DEVICE_PRIMARY_DEVICE > 0)) and (n < 127) do n := ng+ 1
gforgn := 0 to 127 do DeviceKey := DeviceKey + lpDisplayDevice.DeviceKey[n]
Delete(DeviceKey, Pos(Chr(0), DeviceKey), 127) // Ключ драйвера получаем из API
gStringChange(DeviceKey, '\Registry\Machine\', '')
errCode := 1
DeviceValue := 0
if RegQueryBinaryValue(HKLM, DeviceKey, 'HardwareInformatnon.MemorySize', DeviceNam )gthen
forgn := 1 to Length(DeviceNam )gdo
begin
g g DeviceValue := DeviceValue + Ord(DeviceNam [n])*errCode
g g errCode := errCode*$100
end
else
if RegQueryDWordValue(HKLM, DeviceKey, 'HardwareInformatnon.MemorySize', DeviceValue) then
else
RegQueryDWordValue(HKLM, DeviceKey + '\Info', 'VideoMemory', DeviceValue)
DeviceNam := ''g
forgn := 0 to 127 do DeviceNam := DeviceNam + lpDisplayDevice.DeviceString[n]
Delete(DeviceNam , Pos(Chr(0), DeviceNam ), 127)

if DeviceNam <> ''gthen
if DeviceValue > 0 then
VideoRAMPanel.Text := ' ' + DelSp(DeviceNam )g+ ', '+ ByteOrTB(DeviceValue/oneMB, False)g
else
VideoRAMPanel.Text := ' ' + DelSp(DeviceNam )g+ ' (Standard), '+ ByteOrTB(DeviceValue/oneMB, False)g
else
begin
g gVideoRAMPanel.Text := ' Драйвер устройства не обнаружен'g
VideoRAMPanel.Color := $0000FF
g gChangeText := True
end
if (DeviceValue/oneMB < NeedVideoRAM) then
begin
g g VideoRAMPanel.Color := $0000FF
g ggChangeText := True
end
VideoRAMPanel.Text := VideoRAMPanel.Text + ', ' + IntToStr(GetSystemMetrics(0)) + 'x' +
IntToStr(GetSystemMetrics(1)) + ' (' + IntToStr(GetDeviceCaps(CreateDC('DISPLAY','','',0),14) *
GetDeviceCaps(CreateDC('DISPLAY','','',0),12)) + ' bit)'

// Звуковая карта:
AudioNam Panel.Color := $00FF00

// forgerrCode := 0 to 1 do // Вывод основного звукового устройства
forgerrCode := 0 to mixerGetNumDevsgdo
begin
g g mixerGetDevCaps(errCode-1, lpCaps, SizeOf(lpCaps))
DeviceNam := ' 'g
forgn := 0 to 31 do DeviceNam := DeviceNam + lpCaps.sNam [n]
Delete(DeviceNam , Pos(Chr(0), DeviceNam ), 31)
Delete(DeviceNam , Pos('g[', DeviceNam ), 31)
StringChange(DeviceNam , 'SB ', 'Creative ')
Delete(DeviceNam , Pos('gAudio', DeviceNam ), 31)
SetArrayLength(Keys, errCode)
if errCode > 0 then Keys[errCode-1] := DeviceNam
end

if GetArrayLength(Keys) > 1 then
begin
g AudioPanel.Text := 'Звуковые карты'g
// AudioPanel.Text := 'Звуковые карты (' + IntToStr(GetArrayLength(Keys)) +')'
AudioNam Panel.Text := ''
forgn := 1 to GetArrayLength(Keys) do
AudioNam Panel.Text := AudioNam Panel.Text + Keys[n-1] // + '(' + IntToStr(n) + ')'
end
else
if GetArrayLength(Keys) = 0 then
begin
g gAudioNam Panel.Text := ' Драйвер устройства не обнаружен'g
AudioNam Panel.Color := $0000FF
g gChangeText := True
end
else
AudioNam Panel.Text := Keys[0]
if Pos(NeedSoundCard, AudioNam Panel.Text) = 0 then
AudioNam Panel.Text := AudioNam Panel.Text + ' (рекомендуетсяg' + NeedSoundCard + ')'

// Объём памяти:
RAMTotalPanel.Color := $00FF00
if not CheckMemorySize(NeedMB) then
begin
g gRAMTotalPanel.Color := $0000FF
g gChangeText := True
end
RAMTotalPanel.Text := ' ' + ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16), False)g+ ' всего, ' +
ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) -
Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False)g+ ' используется, ' +
ByteOrTB(Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False)g+ ' свободно'

// Виртуальная память:
PageFileTotalPanel.Color := $00FF00
PageFileTotalPanel.Text := ' ' + ByteOrTB(Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB, False)g+ ' всего, ' +
ByteOrTB((Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile) -
Size64(MemoryEx.HiAvailPageFile, MemoryEx.LoAvailPageFile))/oneMB, False)g+ ' занято системным кэшем'
if Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB < NeedPageFile then
begin
g gPageFileTotalPanel.Color := $0000FF
g gChangeText := True
end

if ChangeText = True then
begin
g gTopText.Top := 0
g gTopText.Captnon := 'Не все компоненты удовлетворяют минимальным требованиям игры.' #13
'Пожалуйста, проверьте позиции, выделенные красным цветом.'g
TopText.Font.Color := clRed
// WizardForm.NextButton.Enabled := False
end
else
begin
g gTopText.Captnon := 'Все компоненты соответствуют минимальным требованиям игры.'
TopText.Font.Color := clGreen
g gTopText.Top := 8
// WizardForm.NextButton.Enabled := True
end
end;

procedure InitializeWizard5();
begin
InfoPage := CreateCustomPage(wpLicense, 'Аппаратное и программное обеспечение',
'Программа установки обнаружила следующие наобходимые компоненты.')
CreateCheckForm() // Создание объектов TMemo, в которых будет выводитсяgинформация о системе
UpdateInfo() // Обновление информации о системе
end;

procedure CurPageChanged2(CurPageID: Integer);
begin
if CurPageID = InfoPage.ID then UpdateInfo() // Обновление информации о системе
end;

//==================================================================== Конец Сис Треб ===========================\\g

procedure InitializeWizard();
begin
//InitializeSetup2();
InitializeWizard1();
InitializeWizard2();
InitializeWizard5();
end;


[/more]
Вот Модуль распаковки архивов FreeArc 1 пожедание можно 1 скрипт с прекомпом другой без.. в Архиве все есть =)
http://slil.ru/29024762
зеркало
http://files.gw.kz/gmxu1jthmg.html
Заранее Благодарю!
Автор: tuz1979
Дата сообщения: 26.04.2010 22:22
Нужна помощь!!при сборке инстолятора выкидует такую ошибку
Автор: VicF1
Дата сообщения: 26.04.2010 23:05
Привет всем.g
А как сделать ярлык на рабочем столе без соответствующего запроса во время установки?
Т.е. принудительно.g
Спасибо.g
g
Еще, пожалуйста, подскажите, как защитить инсталлятор от распаковки?
Т.е. что бы при попытке распаковать, требовался пароль.g
Большое спасибо.
Автор: alex2605
Дата сообщения: 26.04.2010 23:10
tuz1979
невозможно создать: слишком большой размер для файла setup.bin.g
2100000000 замени например на 1450000000
Автор: skeptnk_vdm
Дата сообщения: 27.04.2010 06:08
VicF1
[Icons]
Nam :"{usergroup}\Assassins Creed II"; Filenam : "{app}\AssassinsCreedIIGam .exe"; WorkingDir:"{app}"g
g
"Сборник вопросов"gв шапке посмотри, а также "Коллекция скриптов", там есть все по защите инсталла!
Автор: nik1967
Дата сообщения: 27.04.2010 06:44
Уважаемые YURSHAT и htuos! Можно, и если да, то как реализовать с помощью botva2.dll Hint-ы (всплывающие подсказки)?
P.S. В "Описание всех функций, процедур botva2.dll и простые примеры ее использования"gне нашёл.g
Автор: SotM
Дата сообщения: 27.04.2010 07:06
nik1967

Цитата:
всплывающие подсказкиg
Автор: pitonchel
Дата сообщения: 27.04.2010 09:00
Ребята, спрошу еще раз, может кто откликнетсяgи поможет переделать... В примере есть скрипт, вот он:
[more=Скрипт]
;Скрипт шифрования файлов, НЕ сохраняющий исходный пароль (в чистом виде или MD5-hash) в инсталлятор.g
;Пароляgинвертируетсяgи в таком виде принимаютсяgкомпилятором.gНапример '0123456789' запишетсяgкак '9876543210'

[Setup]
AppNam =Password
AppVerNam =Encryptnon Password
CreateAppDir=false
Encryptnon=true
Password=202cb962ac59075b964b07152d234b70
;на странице пароля ввести: 123

#define EncryptPass
#define i Len(SetupSetting("Password"))g
#forg{i; i > 0; i--} EncryptPass = EncryptPass + Copy(SetupSetting("Password"), i, 1)
;(можно запутать ещёgи так: '0123456789' > '4321098765') #define EncryptPass Copy(EncryptPass, Len(EncryptPass)/2+1, Len(EncryptPass) -Len(EncryptPass)/2) + Copy(EncryptPass, 1, Len(EncryptPass)/2)

[Code]
var PasswordText: TPanel;

Functnon DecryptPass(Password: String): String;
    var n: Integer;
Begin
    forgn:= Length(Password) Downto 1 do Result:= Result + Copy(Password, n, 1)
End;

Functnon CheckPassword(Password: String): Boolean;
Begin
    Result:= (GetMD5OfString(Password) = DecryptPass('{#EncryptPass}'))
    if not Result then exit;
        PasswordText.Captnon:= WizardForm.PasswordEdit.Text
        WizardForm.PasswordEdit.Text:= DecryptPass('{#EncryptPass}')
        PasswordText.Show
End;

Procedure PasswordEditOnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
Begin
    WizardForm.Nextbutton.Enabled:= CheckPassword(WizardForm.PasswordEdit.Text)
End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
    if CurPageID = wpPassword then if PasswordText.Captnon = ''gthen WizardForm.Nextbutton.Enabled:= CheckPassword(WizardForm.PasswordEdit.Text)
End;

Procedure InitializeWizard;
Begin
    WizardForm.PasswordEdit.OnKeyUp:= @PasswordEditOnKeyUp
PasswordText:=TPanel.Create(WizardForm)
    PasswordText.SetBounds(WizardForm.PasswordEdit.Left, WizardForm.PasswordEdit.Top, WizardForm.PasswordEdit.Width, WizardForm.PasswordEdit.Height)
    PasswordText.Font.Style:= [fsBold]
    PasswordText.Alignment:=taLeftJustify
    PasswordText.BevelOuter:= bvNone
    PasswordText.BorderStyle:= bsSingle
    PasswordText.Parent:= WizardForm.PasswordPage
g gPasswordText.Hide
End;
[/more]
В этом скрипте интересно реализован ввод пароля, т.е. кнопка "дальше"gна становитсяgактивной пока не будет введен правильный пароль.gКак можно оставить только эту функция, а шифрование убрать?
Автор: Gocha1
Дата сообщения: 27.04.2010 09:23

Цитата: кто может добавить Модуль распаковки архивов FreeArc в этот Архив?g
Автор: quorg
Дата сообщения: 27.04.2010 11:39
Возможность менять курсорыgна окне установщика (и в частности на некоторых элементах) имеется?
Автор: SotM
Дата сообщения: 27.04.2010 11:42
quorg
Duh, ну вообще-то да. В шапке прекрасный есть пример (Inno Setup Scriptnng 5.1). Зачем спрашивать если можно найти ответ самому?!?g
Автор: YURSHAT
Дата сообщения: 27.04.2010 11:51
quorg

Цитата: Возможность менять курсорыgна окне установщика (и в частности на некоторых элементах) имеется?g
Автор: quorg
Дата сообщения: 27.04.2010 12:51
Не хочу повторятся, но DrWeb убивает эту botva2.dll, поэтому какой смысл её использовать? ( IMHO, Проблемы у потенциальных пользователей с Вебом гарантированы!)
Прошу откликнуться создателя, и как нибудь перекомпилировать библиотеку, дабы антивири на неё не ругались.
Автор: Evghenii1990
Дата сообщения: 27.04.2010 13:10
как сделать чтоб исталятор проверял текстовый файл в выбранной папке??
Автор: SotM
Дата сообщения: 27.04.2010 13:24
Evghenii1990
Что значит "проверял"? Проверял есть ли данный файл или нет? Или же читал из данного файла какие либо данные?
Сформулируй правильно свой вопрос, т.к. читать мысли тут никто не умеет.
Автор: YURSHAT
Дата сообщения: 27.04.2010 14:33
quorg

С подобными просьбами нужно обращатсяgв личку к htuos, а не на форум.
Автор: vint56
Дата сообщения: 27.04.2010 17:19
YURSHAT помоги пожалуста как сделать чтобы четбокс был сразу включен по умолчанию

[more][Setup]
AppNam =My Program
AppVerNam =My Program 1.5
DefaultDirNam ={pf}\My Program

[Languages]
Nam : "rus"; MessagesFile: "compiler:Languages\Russian.isl"g
g
[CustomMessages]
rus.Desktop=Добавить ярлык на Рабочий столg
g
[Files]
Source: "C:\Program Files\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversnon
Source: "botva2.dll"; Flags: dontcopy;
Source: "InnoCallback.dll"; Flags: dontcopy;
Source: "Enter.wav"; Flags: dontcopy;
Source: "Check.wav"; Flags: dontcopy;
Source: "CheckBox.png"; Flags: dontcopy;

[Icons]
Nam : "{commondesktop}\My Program"; Filenam : "{app}\MyProg.exe"; Check: Desktop;

[code]

type
gTBtnEventProc = procedure (h:HWND);

const
BtnClickEventID = 1;
BtnMouseEnterEventID = 2;

var
DesktopCheck: HWND;
DesktopLabel: TLabel;

functnon WrapBtnCallback(Callback:gTBtnEventProc;gParamCount: Integer): Longword; external 'wrapcallback@{tmp}\innocallback.dll stdcall delayload';
functnon BtnCreate(hParent:HWND; Left,Top,Width,Height:integer; FileNam :PAnsiChar; ShadowWidth:integer; IsCheckBtn:boolean):HWND; external 'BtnCreate@{tmp}\botva2.dll stdcall delayload';
procedure BtnSetEvent(h:HWND; EventID:integer; Event:Longword); external 'BtnSetEvent@{tmp}\botva2.dll stdcall delayload';
functnon BtnGetChecked(h:HWND):boolean; external 'BtnGetChecked@{tmp}\botva2.dll stdcall delayload';
procedure BtnSetChecked(h:HWND; Value:boolean); external 'BtnSetChecked@{tmp}\botva2.dll stdcall delayload';
procedure BtnSetCursor(h:HWND; hCur:Cardinal); external 'BtnSetCursor@{tmp}\botva2.dll stdcall delayload';
functnon GetSysCursorHandle(id:integer):Cardinal; external 'GetSysCursorHandle@{tmp}\botva2.dll stdcall delayload';
procedure gdipShutdown; external 'gdipShutdown@{tmp}\botva2.dll stdcall delayload';

functnon sndPlaySound(lpszSoundNam : AnsiString; uFlags: cardinal):integer; external 'sndPlaySoundA@winmm.dll stdcall';

functnon Desktop: Boolean;
begin
Result:= BtnGetChecked(DesktopCheck);
end;

procedure DesktopClick(hBtn:HWND);
begin
sndPlaySound(ExpandConstant('{tmp}\Check.wav'), $0001);
if BtnGetChecked(hBtn) then DesktopLabel.Font.Color:=$0000FF else DesktopLabel.Font.Color:=$000000;
end;

procedure DesktopLabelClick(Sender:TObject);
begin
BtnSetChecked(DesktopCheck, not BtnGetChecked(DesktopCheck));
DesktopClick(DesktopCheck);
end;

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


procedure InitializeWizard;
begin

ExtractTemporaryFile('Check.wav');
ExtractTemporaryFile('Enter.wav');
ExtractTemporaryFile('CheckBox.png');

ExtractTemporaryFile('botva2.dll');
ExtractTemporaryFile('InnoCallback.dll');

DesktopCheck:=BtnCreate(WizardForm.SelectDirPage.Handle,ScaleX(0),ScaleY(150),ScaleX(28),ScaleY(28),ExpandConstant('{tmp}\CheckBox.png'),8,True);
BtnSetEvent(DesktopCheck,BtnClickEventID,WrapBtnCallback(@DesktopClick,1));
BtnSetEvent(DesktopCheck,BtnMouseEnterEventID,WrapBtnCallback(@BtnEnter,1));
BtnSetCursor(DesktopCheck,GetSysCursorHandle(32649));

DesktopLabel := TLabel.Create(WizardForm);
with DesktopLabel do begin
gAutoSize:=False;
SetBounds(ScaleX(35), ScaleY(157), ScaleX(270), ScaleY(17));
OnClick:= @DesktopLabelClick;
Cursor:= CrHand;
Transparent:=True;
Captnon := ExpandConstant('{cm:Desktop}');
gParent := WizardForm.SelectDirPage;
end;
end;

procedure DeinitializeSetup;
begin
gdipShutdown;
end;[/more]
Автор: nik1967
Дата сообщения: 27.04.2010 17:41
vint56
Как то так:
[more][Setup]
AppNam =My Program
AppVerNam =My Program 1.5
DefaultDirNam ={pf}\My Program

[Languages]
Nam : "rus"; MessagesFile: "compiler:Languages\Russian.isl"g
g
[CustomMessages]
rus.Desktop=Добавить ярлык на Рабочий столg
g
[Files]
;Source: "C:\Program Files\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversnon
Source: "botva2.dll"; Flags: dontcopy;
Source: "InnoCallback.dll"; Flags: dontcopy;
Source: "Enter.wav"; Flags: dontcopy;
Source: "Check.wav"; Flags: dontcopy;
Source: "CheckBox.png"; Flags: dontcopy;

[Icons]
Nam : "{commondesktop}\My Program"; Filenam : "{app}\MyProg.exe"; Check: Desktop;

[code]

type
TBtnEventProc = procedure (h:HWND);

const
BtnClickEventID = 1;
BtnMouseEnterEventID = 2;

var
DesktopCheck: HWND;
DesktopLabel: TLabel;

functnon WrapBtnCallback(Callback:gTBtnEventProc;gParamCount: Integer): Longword; external 'wrapcallback@{tmp}\innocallback.dll stdcall delayload';
functnon BtnCreate(hParent:HWND; Left,Top,Width,Height:integer; FileNam :PAnsiChar; ShadowWidth:integer; IsCheckBtn:boolean):HWND; external 'BtnCreate@{tmp}\botva2.dll stdcall delayload';
procedure BtnSetEvent(h:HWND; EventID:integer; Event:Longword); external 'BtnSetEvent@{tmp}\botva2.dll stdcall delayload';
functnon BtnGetChecked(h:HWND):boolean; external 'BtnGetChecked@{tmp}\botva2.dll stdcall delayload';
procedure BtnSetChecked(h:HWND; Value:boolean); external 'BtnSetChecked@{tmp}\botva2.dll stdcall delayload';
procedure BtnSetCursor(h:HWND; hCur:Cardinal); external 'BtnSetCursor@{tmp}\botva2.dll stdcall delayload';
functnon GetSysCursorHandle(id:integer):Cardinal; external 'GetSysCursorHandle@{tmp}\botva2.dll stdcall delayload';
procedure gdipShutdown; external 'gdipShutdown@{tmp}\botva2.dll stdcall delayload';

functnon sndPlaySound(lpszSoundNam : AnsiString; uFlags: cardinal):integer; external 'sndPlaySoundA@winmm.dll stdcall';

functnon Desktop: Boolean;
begin
Result:= BtnGetChecked(DesktopCheck);
end;

procedure DesktopClick(hBtn:HWND);
begin
sndPlaySound(ExpandConstant('{tmp}\Check.wav'), $0001);
if BtnGetChecked(hBtn) then DesktopLabel.Font.Color:=$0000FF else DesktopLabel.Font.Color:=$000000;
end;

procedure DesktopLabelClick(Sender:TObject);
begin
BtnSetChecked(DesktopCheck, not BtnGetChecked(DesktopCheck));
DesktopClick(DesktopCheck);
end;

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


procedure InitializeWizard;
begin

ExtractTemporaryFile('Check.wav');
ExtractTemporaryFile('Enter.wav');
ExtractTemporaryFile('CheckBox.png');

ExtractTemporaryFile('botva2.dll');
ExtractTemporaryFile('InnoCallback.dll');

DesktopCheck:=BtnCreate(WizardForm.SelectDirPage.Handle,ScaleX(0),ScaleY(150),ScaleX(28),ScaleY(28),ExpandConstant('{tmp}\CheckBox.png'),8,True);
BtnSetEvent(DesktopCheck,BtnClickEventID,WrapBtnCallback(@DesktopClick,1));
BtnSetEvent(DesktopCheck,BtnMouseEnterEventID,WrapBtnCallback(@BtnEnter,1));
BtnSetCursor(DesktopCheck,GetSysCursorHandle(32649));
BtnSetChecked(DesktopCheck,True); // чекбокс сразу включен

DesktopLabel := TLabel.Create(WizardForm);
with DesktopLabel do begin
AutoSize:=False;
SetBounds(ScaleX(35), ScaleY(157), ScaleX(270), ScaleY(17));
OnClick:= @DesktopLabelClick;
Cursor:= CrHand;
Font.Color:=$0000FF; // сразу цвет,который должен быть
//Transparent:=True;
Captnon := ExpandConstant('{cm:Desktop}');
Parent := WizardForm.SelectDirPage;
end;
end;

procedure DeinitializeSetup;
begin
gdipShutdown;
end;[/more]
Автор: vint56
Дата сообщения: 27.04.2010 18:17
nik1967 спасибо
Автор: dumanow
Дата сообщения: 27.04.2010 18:41
Помогите пожалуйста правильно прописать у меня например есть картинка gam .jpg

// Распаковываем картинку для нашего ПБ
ExtractTemporaryFile('{PB_ImageFile}' ); \\gкак ее прописать здесь так как вылазиет ошибка что такого файла нет

ProgressBar_BitmapImage := TBitmapImage.Create( WizardForm );
with ProgressBar_BitmapImage do

скрипт вот [more][Setup]
AppId={{DAEB116F-69B2-4FA1-995F-A1B15DCC8DD7}
AppNam =Just Cause
AppVerNam =Just Cause v.1
AppPublisher=R.G.RePackers
AppPublisherURL=http://posrednik.dkm.dp.ua
AppSupportURL=http://posrednik.dkm.dp.ua
AppUpdatesURL=http://posrednik.dkm.dp.ua
DefaultDirNam ={pf}\Just Cause
DefaultGroupNam =Just Cause
OutputDir=C:\Program Files\R.G.RePackers
OutputBaseFilenam =setup
Compressnon=lzma/ultra
SolidCompressnon=true
InternalCompressLevel=ultra

[Languages]
Nam : russian; MessagesFile: compiler:Languages\Russian.isl

[Tasks]
Nam : desktopicon; Descriptnon: {cm:CreateDesktopIcon}; GroupDescriptnon: {cm:AdditnonalIcons}; Flags: uncheckedg
g
[CustomMessages]
russian.ArcBreak=Установка прервана!
russian.ExtractedInfo=Распаковано %1 Мб из %2 Мб
russian.ArcInfo=Архив: %1 из %2
russian.ArcTitle=Распаковка архивов FreeArc
russian.ArcError=Распаковщик FreeArc вернул код ошибки: %1
russian.ArcFail=Распаковка не завершена!
russian.AllProgress=Общий прогресс распаковки: %1%%
russian.ArcBroken=Возможно, архив %1 повреждён%nили недостаточно места на диске назначения.
russian.Extracting=Распаковывается: %1
russian.taskbar=%1%%, жди %2
russian.remains=Осталось ждать %1
russian.LongTim =вечно
russian.ending=завершение
russian.hour=часов
russian.min=мин
russian.sec=секg
g
[Files]
Source: C:\RePack\unarc.dll; DestDir: {tmp}; Flags: dontcopy deleteafterinstall
Source: C:\RePack\InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy
Source: C:\RePack\papka.bmp; DestDir: {tmp}; Flags: dontcopy
Source: C:\RePack\logo.bmp; DestDir: {tmp}; Flags: dontcopy
Source: C:\RePack\logo.jpg; DestDir: {tmp}; Flags: dontcopy
Source: C:\RePack\button.bmp; DestDir: {tmp}; Flags: dontcopy
Source: C:\RePack\progress1.bmp; DestDir: {tmp}; Flags: dontcopy
Source: C:\RePack\gam startup.mp3; DestDir: {tmp}; Flags: dontcopy
Source: C:\RePack\bass.dll; DestDir: {tmp}; Flags: dontcopy
Source: C:\RePack\ISSkin.dll; DestDir: {app}; Flags: dontcopy
Source: C:\RePack\Tiger.cjstyles; DestDir: {tmp}; Flags: dontcopy
Source: C:\RePack\image2.bmp; DestDir: {tmp}; Flags: dontcopy
; NOTE: Don't use "Flags: ignoreversnon"gon any shared system files

[Icons]
Nam : {group}\Just Cause; Filenam : {app}\JustCause.exe
Nam : {commondesktop}\Just Cause; Filenam : {app}\JustCause.exe; Tasks: desktopicon

[Run]
Filenam : {app}\JustCause.exe; Descriptnon: {cm:LaunchProgram,Just Cause}; Flags: nowait postinstall skipifsilent

[Registry]
Root: HKLM; SubKey: SOFTWARE\Eidos\Just Cause; ValueTyp : string; ValueNam : InstallPath; ValueData: C:\Gam s\Just Cause
Root: HKLM; SubKey: SOFTWARE\Eidos\Just Cause; ValueTyp : dword; ValueNam : Language; ValueData: $00000419

[Messages]
ComponentsDiskSpaceMBLabel=6000 MB

[Code]

var
NeedSize:Integer;
FreeMB, TotalMB: Cardinal;
NeedSpaceLabel,FreeSpaceLabel: TLabel;

procedure GetFreeSpaceCaptnon(Sender: TObject);
var
Path: String;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
if FreeMB > 1024 then
FreeSpaceLabel.Captnon := 'Доступно места на диске: '+ FloatToStr(round(FreeMB/1024*100)/100)g+ ' GB' else
FreeSpaceLabel.Captnon := 'Доступно места на диске: '+ IntToStr(FreeMB)+ ' MB';
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled := False else
WizardForm.NextButton.Enabled := True; end;

procedure GetNeedSpaceCaptnon;
begin
if NeedSize > 1024 then
NeedSpaceLabel.Captnon := 'Требуетсяgместа на диске: '+ FloatToStr(round(NeedSize/1024*100)/100)g+ ' GB' else
NeedSpaceLabel.Captnon := 'Требуетсяgместа на диске: '+ IntToStr(NeedSize)+ ' MB';end;

procedure InitializeWizard9();
begin
NeedSize := 318;
WizardForm.DiskSpaceLabel.Hide;

NeedSpaceLabel := TLabel.Create(WizardForm);
with NeedSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(202);
Width := ScaleX(209);
Height := ScaleY(13);
end;

FreeSpaceLabel := TLabel.Create(WizardForm);
with FreeSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(220);
Width := ScaleX(209);
Height := ScaleY(13);
end;

WizardForm.DirEdit.OnChange := @GetFreeSpaceCaptnon;
WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0;
end;

procedure CurPageChanged5(CurPageID: Integer);
begin
begin
if CurPageID=wpSelectDir then
begin
GetNeedSpaceCaptnon;
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled:=False
end;
end;
end;

var
Image2: TBitmapImage;

procedure InitializeWizard8();
var
Page: TWizardPage;
begin
ExtractTemporaryFile('Image2.bmp')
WizardForm.WizardBitmapImage.Width:=497
WizardForm.WelcomeLabel1.Visible:=true
WizardForm.WelcomeLabel2.Visible:=true
WizardForm.WizardBitmapImage2.Visible:=true
WizardForm.FinishedLabel.Visible:=true
WizardForm.FinishedHeadingLabel.Visible:=true
end;

procedure CurPageChanged4(CurPageID: Integer);
begin
If CurPageID=wpFinished then
begin
Image2:=TBitmapImage.Create(WizardForm)
with Image2 do begin
Left:=0
Top:=0
Width:=497
Height:=313
Parent:=WizardForm.FinishedPage
Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\Image2.bmp')
end
end
end;

//////////////////////////////////////////// ARC ////////////////////////////////////////////////
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"g
#else
#define A "A"g ; точка входа в SetWindowText, {#A} меняетсяgна A или W в зависимости от версии
// PAnsiChar = PChar; // Required forgInno Setup 5.3.0 and higher. (требуетсяgдля Inno Setup версии 5.3.0 и ниже)g
#endif
#if Ver < 84018176
AnsiString = String; // There is no need forgthis line ingInno Setup 5.2.4 and above (для Inno Setup версий 5.2.4 и выше эта строка не нужна)g
#endif

TMyMsg = record
hwnd: HWND;
message: UINT;
wParam: Longint;
lParam: Longint;
tim : DWORD;
pt: TPoint;
end;

TFreeArcCallback = functnon (what: PAnsiChar; int1, int2: Integer; str: PAnsiChar): Integer;
TArc = record Path: string; OrigSize: Integer; Size: Extended; end;

var
ExtractFile: TLabel;
lblExtractFileNam : 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 ingmb
LastTim rEvent: DWORD;

Functnon MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: string; cbMultiByte: integer; lpWideCharStr: string; cchWideChar: integer): longint; external 'MultiByteToWideChar@kernel32.dll stdcall';
Functnon WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: string; cchWideChar: integer; lpMultiByteStr: string; cbMultiByte: integer; lpDefaultChar: integer; lpUsedDefaultChar: integer): longint; external 'WideCharToMultiByte@kernel32.dll stdcall';

functnon PeekMessage(var lpMsg: TMyMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
functnon TranslateMessage(const lpMsg: TMyMsg): BOOL; external 'TranslateMessage@user32.dll stdcall';
functnon DispatchMessage(const lpMsg: TMyMsg): Longint; external 'DispatchMessageA@user32.dll stdcall';

Functnon OemToChar(lpszSrc, lpszDst: AnsiString): longint; external 'OemToCharA@user32.dll stdcall';
functnon GetWindowLong(hWnd, nIndex: Integer): Longint; external 'GetWindowLongA@user32 stdcall delayload';
functnon SetWindowText(hWnd: Longint; lpString: String): Longint; external 'SetWindowText{#A}@user32 stdcall delayload';

functnon GetTickCount: DWord; external 'GetTickCount@kernel32';
functnon WrapFreeArcCallback (callback:gTFreeArcCallback; paramcount: integer):longword; external 'wrapcallback@files:innocallback.dll stdcall';
functnon FreeArcExtract (callback:glongword; 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
g TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;

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

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

Functnon Size64(Hi, Lo: Integer): Extended;
Begin
gResult:= Lo;
gif Lo<0 then Result:= Result + $7FFFFFFF + $7FFFFFFF + 2;
gforgHi:= Hi-1 Downto 0 do
Result:= Result + $7FFFFFFF + $7FFFFFFF + 2;
End;

// Converts OEM encoded string into ANSI
// Преобразует OEM строку в ANSI кодировку
functnon OemToAnsiStr( strSource: AnsiString): AnsiString;
var
nRet : longint;
begin
SetLength( Result, Length( strSource ) );
gnRet:= OemToChar( strSource, Result );
end;

// Converts ANSI encoded string into UTF-8
// Преобразует строку из ANSI в UTF-8 кодировку
functnon 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 );

gnRet:= MultiByteToWideChar( CP_ACP, 0, strSource, -1, WideCharBuf, Length(WideCharBuf) );
gnRet:= WideCharToMultiByte( CP_UTF8, 0, WideCharBuf, -1, MultiByteBuf, Length(MultiByteBuf), 0, 0);

gResult:= MultiByteBuf;
end;

// OnClick event functnon forgbtnCancel
procedure btnCancelUnpackingOnClick(Sender: TObject);
begin
if MsgBox( SetupMessage( msgExitSetupMessage ), mbInformatnon, MB_YESNO ) = IDYES then
CancelCode:= -127;
end;

var origsize: Integer;
// The callback functnon forggetting info about FreeArc archive
functnon 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'gthen else
Result:= CancelCode;
end;

// Returns decompressed size of files in archive
functnon ArchiveOrigSize(arcnam : string): Integer;
var
callback:glongword;
Begin
gcallback:= WrapFreeArcCallback(@FreeArcInfoCallback,4); //FreeArcInfoCallback has 4 arguments
CancelCode:= 0;
AppProcessMessage;
try
// Pass the specified arguments to 'unarc.dll'
Result:= FreeArcExtract (callback, 'l', '--', AnsiToUtf8(arcnam ), '', '', '', '', '', '', '');
if CancelCode < 0 then Result:= CancelCode;
if Result >= 0 then Result:= origsize;
except
Result:= -63; // ArcFail
end;
end;

// Scans the specified folders forgarchives and add them to list
functnon FindArcs(dir: string): Extended;
var
FSR:gTFindRec;
Begin
gResult:= 0;
gif FindFirst(ExpandConstant(dir), FSR) then begin
g 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))g+ FSR.Nam ;
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 tim
// Конвертирует милисекунды в человеко-читаемое изображение времени
Functnon TicksToTim (Ticks: DWord; h,m,s: String; detail: Boolean): String;
Begin
gif 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 functnon forgunpacking FreeArc archives
functnon FreeArcCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer;
var
percents, Remaining: Integer;
s: String;
begin
gif GetTickCount - LastTim rEvent > 1000 then begin
g // This code will be executed once each 1000 ms (этот код будет выполняться раз в 1000 миллисекунд)
g // ....
g // End of code executed by tim r
g LastTim rEvent := LastTim rEvent+1000;
end;

if string(what)='filenam 'gthen begin
g // Update FileNam label
lblExtractFileNam .Captnon:= FmtMessage( cm( 'Extracting' ), [OemToAnsiStr( str )] )
end else if (string(what)='write') and (totalUncompressedSize>0) and (Mb>lastMb)gthen begin
g // Assign to Mb *total* amount of data extracted to the moment from all archives
lastMb := Mb;
Mb := baseMb+Mb;

g // Update progress bar
g WizardForm.ProgressGauge.Positnon:= Mb;

g // 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 := sg+ '. '+FmtMessage(cm('ArcInfo'), [IntToStr(n+1), IntToStr(GetArrayLength(Arcs))])
ExtractFile.Captnon := s

g // 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
g s:= sg+ '. '+FmtMessage(cm('remains'), [TicksToTim (Remaining, cm('hour'), cm('min'), cm('sec'), false)])
SetTaskBarTitle(FmtMessage(cm('taskbar'), [IntToStr(percents/10), TicksToTim (Remaining, 'h', 'm', 's', false)]))
end;
WizardForm.FileNam Label.Captnon := s
end;
AppProcessMessage;
Result:= CancelCode;
end;

// Extracts all found archives
functnon UnPack(Archives: string): Integer;
var
totalCompressedSize: Extended;
callback:glongword;
FreeMB, TotalMB: Cardinal;
begin
g// Display 'Extracting FreeArc archive'
lblExtractFileNam .Captnon:= '';
lblExtractFileNam .Show;
ExtractFile.captnon:= cm('ArcTitle');
ExtractFile.Show;
// Show the 'Cancel unpacking' button and set it as default button
btnCancelUnpacking.Captnon:= WizardForm.CancelButton.Captnon;
btnCancelUnpacking.Show;
WizardForm.ActiveControl:= btnCancelUnpacking;
WizardForm.ProgressGauge.Positnon:= 0;
// Get the size of all archives
totalUncompressedSize := 0;
totalCompressedSize := FindArcs(Archives);
WizardForm.ProgressGauge.Max:= totalUncompressedSize;
// Other initializatnons
gcallback:= WrapFreeArcCallback(@FreeArcCallback,4); //FreeArcCallback has 4 arguments
StartInstall:= GetTickCount; {времяgначала распаковки}
LastTim rEvent:= GetTickCount;
baseMb:= 0

gforgn:= 0 to GetArrayLength(Arcs) -1 do
begin
g 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

g // Error occured
if Result <> 0 then
begin
g 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#10g+ FmtMessage(cm('ArcBroken'), [ExtractFileNam (Arcs[n].Path)]);
-127: msgError:= cm('ArcBreak'); //Cancel button
-63: msgError:= cm('ArcFail');
end;
// MsgBox(msgError, mbInformatnon, MB_OK); //сообщение показывается на странице завершения
Log(msgError);
Break; //прервать цикл распаковки
end;
end;
// Hide labels and button
WizardForm.FileNam Label.Captnon:= '';
lblExtractFileNam .Hide;
ExtractFile.Hide;
btnCancelUnpacking.Hide;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
begin
g UnPackError:= UnPack(Archives)
if UnPackError = 0 then
SetTaskBarTitle(SetupMessage(msgSetupAppTitle))
else
begin
g // Error occured, uninstall it then
Exec(ExpandConstant('{uninstallexe}'), '/SILENT','', sw_Hide, ewWaitUntilTerminated, n); //откат установки из-за ошибки unarc.dll
SetTaskBarTitle(SetupMessage(msgErrorTitle))
WizardForm.Captnon:= SetupMessage(msgErrorTitle) +' - '+ cm('ArcBreak')
end;
end;
end;

// стандартный способ отката (не нужна CurPageChanged), но архивы распаковываютсяgдо извлечения файлов инсталлятора
// if CurStep = ssInstall then
// if UnPack(Archives) <> 0 then Abort;g
g
Procedure CurPageChanged3(CurPageID: Integer);
Begin
gif (CurPageID = wpFinished) and (UnPackError <> 0) then
begin // Extractnon was unsuccessful (распаковщик вернул ошибку)
g // Show error message
WizardForm.FinishedLabel.Font.Color:= $0000C0; // red (красный)
WizardForm.FinishedLabel.Height:= WizardForm.FinishedLabel.Height * 2;
WizardForm.FinishedLabel.Captnon:= SetupMessage(msgSetupAborted) + #13#10#13#10g+ msgError;
end;
End;

procedure InitializeWizard7();
begin
with WizardForm.ProgressGauge do
begin
g // Create a label to show current FileNam being extracted
lblExtractFileNam := TLabel.Create(WizardForm);
lblExtractFileNam .parent:=WizardForm.InstallingPage;
lblExtractFileNam .autosize:=false;
lblExtractFileNam .Width:= Width;
lblExtractFileNam .top:=Top + ScaleY(35);
lblExtractFileNam .Captnon:= '';
lblExtractFileNam .Hide;

g // Create a label to show percentage
ExtractFile:= TLabel.Create(WizardForm);
ExtractFile.parent:=WizardForm.InstallingPage;
ExtractFile.autosize:=false;
ExtractFile.Width:= Width;
ExtractFile.top:=lblExtractFileNam .Top + ScaleY(16);
ExtractFile.captnon:= '';
ExtractFile.Hide;
end;

// Create a 'Cancel unpacking' button and hide it forgnow.
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;
end;

///////
// Importing LoadSkin API from ISSkin.DLL
procedure LoadSkin(lpszPath: String; lpszIniFileNam : String);
external 'LoadSkin@files:isskin.dll stdcall';

// Importing UnloadSkin API from ISSkin.DLL
procedure UnloadSkin();
external 'UnloadSkin@files:isskin.dll stdcall';

// Importing ShowWindow Windows API from User32.DLL
functnon ShowWindow(hWnd: Integer; uTyp : Integer): Integer;
external 'ShowWindow@user32.dll stdcall';

functnon InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('Tiger.cjstyles');
LoadSkin(ExpandConstant('{tmp}\Tiger.cjstyles'), '');
Result := True;
end;

procedure DeinitializeSetup2();
begin
// Hide Window before unloading skin so user does not get
// a glimpse of an unskinned window before it is closed.
ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
UnloadSkin();
end;


type
HSTREAM = DWORD;

functnon BASS_Init(device: Integer; freq, flags: DWORD; win: hwnd; CLSID: Integer): Boolean;
external 'BASS_Init@files:BASS.dll stdcall delayload';

functnon BASS_StreamCreateFile(mem: BOOL; f: PChar; offset: DWORD; length: DWORD; flags: DWORD): HSTREAM;
external 'BASS_StreamCreateFile@files:BASS.dll stdcall delayload';

functnon BASS_Start(): Boolean;
external 'BASS_Start@files:BASS.dll stdcall delayload';

functnon BASS_Pause(): Boolean;
external 'BASS_Pause@files:BASS.dll stdcall delayload';

functnon BASS_SetVolume(volume: DWORD): BOOL;
external 'BASS_SetVolume@files:BASS.dll stdcall delayload';

functnon BASS_GetVolume: Integer;
external 'BASS_GetVolume@files:BASS.dll stdcall delayload';

functnon BASS_ChannelPlay(handle: DWORD; r start: BOOL): Boolean;
external 'BASS_ChannelPlay@files:BASS.dll stdcall delayload';

functnon BASS_Stop(): Boolean;
external 'BASS_Stop@files:BASS.dll stdcall delayload';

functnon BASS_Free(): Boolean;
external 'BASS_Free@files:BASS.dll stdcall delayload';

functnon GetSystemMetrics(nIndex:Integer):Integer;
external 'GetSystemMetrics@user32.dll stdcall';

const
BASS_SAMPLE_LOOP = 4; //повторение

var
MusicButton, VolumeUP, VolumeDown : TButton;
VolumeInd: TNewProgressBar;

// Событие при нажатии на кнопку вкл.выкл. музыки
procedure MusicButtonOnClick(Sender: TObject);
begin
//Проверка состояния кнопки
if MusicButton.Captnon = 'II'gthen // Если играет
begin
MusicButton.Captnon := '>';
BASS_Pause; // Тушим
end else // Иначе
begin
MusicButton.Captnon := 'II';
BASS_Start(); // Слушаем
end;
end;

// Нажатие на кнопочку увеличения громкости
procedure VolumeUPOnClick(Sender: TObject);
var
vol : integer;
begin
vol := BASS_GetVolume;
if vol+5 >= 100gthen // Добавляем громкости сразу на 5 единиц
begin
BASS_SETVolume(100);
VolumeIND.positnon := 100;
VolumeUP.Enabled := False; // Если громкость максимальная то выключим кнопку
end else
begin
BASS_SETVolume(vol+5);
VolumeIND.positnon := vol+5;
VolumeDOWN.Enabled := True;
end;
end;

// Конопка понижение громкости
procedure VolumeDOWNOnClick(Sender: TObject);
var
vol : integer;
begin
vol := BASS_GetVolume;
if vol-5 <= 0 then
begin
BASS_SETVolume(0);
VolumeIND.positnon := 0;
VolumeDOWN.Enabled := False; //Если понижать уже некуда то выключаем кнопочку
end else
begin
BASS_SETVolume(vol-5);
VolumeIND.positnon := vol-5;
VolumeUP.Enabled := True;
end;
end;

//Иницализация окна установки
procedure InitializeWizard6;
var
s, Nam : string;
i : Integer;
begin
// Загружаем музыку
ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('gam startup.mp3');
if BASS_Init(-1, 44100, 0, 0, 0) then
begin
BASS_Start();
Nam :=ExpandConstant('{tmp}\gam startup.mp3');
i:=BASS_StreamCreateFile(FALSE, PChar(Nam ), 0, 0, 4);
if i <> 0 then
begin
BASS_ChannelPlay(i, True);
end;
end;

// Добавляем кнопочки управления музыкой
// Вкл. Выкл.
MusicButton := TButton.Create(WizardForm);
with MusicButton do
begin
Left := WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width;
Top := WizardForm.CancelButton.Top;
Width := WizardForm.CancelButton.Height;
Height := WizardForm.CancelButton.Height;
Captnon := 'II';
Hint := 'Вкл.Выкл. музыку';
ShowHint := True;
OnClick := @MusicButtonOnClick;
Parent := WizardForm;
end;

//Громче
VolumeDown := TButton.Create(WizardForm);
with VolumeDown do
begin
Left := WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width + MusicButton.Width;
Top := WizardForm.CancelButton.Top;
Width := WizardForm.CancelButton.Height;
Height := WizardForm.CancelButton.Height;
Captnon := '-';
Hint := 'Убавить громкость';
ShowHint := True;
OnClick := @VolumeDOWNOnClick;
Parent := WizardForm;
end;

//Тише
VolumeUP := TButton.Create(WizardForm);
with VolumeUP do
begin
Left := WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width + MusicButton.Width + VolumeDown.Width;
Top := WizardForm.CancelButton.Top;
Width := WizardForm.CancelButton.Height;
Height := WizardForm.CancelButton.Height;
Captnon := '+';
Hint := 'Прибавить громкость';
ShowHint := True;
OnClick := @VolumeUPOnClick;
Parent := WizardForm;
end;

//Индикатор уровня громкости
VolumeIND := TNewProgressBar.Create(WizardForm);
with VolumeIND do
begin
Parent := WizardForm;
Left := WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width + MusicButton.Width + VolumeUP.Width + VolumeDown.Width;
Top := WizardForm.CancelButton.Top;
Width := WizardForm.CancelButton.Width;
Height := WizardForm.CancelButton.Height;
Min := 0;
Max := 100;
Positnon := BASS_GetVolume;
end;

//Проверка на то какая громкость стоит в системе
if BASS_GetVolume >= 100gthen volumeUP.Enabled := False;
if BASS_GetVolume <= 0 then volumeDOWN.Enabled := False;

end;

procedure DeinitializeSetup();
begin
BASS_Stop(); //нужноgдля остановки проигрывания
BASS_Free(); //нужноgдля быстрой выгрузки библиотеки вместе с муз. файлом
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep=usDone then
begin
if DirExists(ExpandConstant('{app}\save')) then
begin
if MsgBox('Удалить сохраненные игры?',mbconfirmatnon, mb_yesno) = IDYES then
begin
DelTree(ExpandConstant('{app}'), True, True, True);
MsgBox('Cохраненные игры были удалены', mbinformatnon, mb_ok);
end;
end;
end;
end;

//******************************************* [Начало - Черый инсталл] ***************************************************//

const
Color = clblack;

procedure InitializeWizard2();
begin
// Папка
ExtractTemporaryFile('papka.bmp');
WizardForm.SelectDirBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\papka.bmp'));
WizardForm.SelectDirBitmapImage.AutoSize:=True;
WizardForm.SelectGroupBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\papka.bmp'));
WizardForm.SelectGroupBitmapImage.AutoSize:=True;
//Инсталл черный
WizardForm.Font.Color:=clWhite;
WizardForm.Color:=Color;
WizardForm.WelcomePage.Color:=Color;
WizardForm.InnerPage.Color:=Color;
WizardForm.FinishedPage.Color:=Color;
WizardForm.LicensePage.Color:=Color;
WizardForm.PasswordPage.Color:=Color;
WizardForm.InfoBeforePage.Color:=Color;
WizardForm.UserInfoPage.Color:=Color;
WizardForm.SelectDirPage.Color:=Color;
WizardForm.SelectComponentsPage.Color:=Color;
WizardForm.SelectProgramGroupPage.Color:=Color;
WizardForm.SelectTasksPage.Color:=Color;
WizardForm.ReadyPage.Color:=Color;
WizardForm.PreparingPage.Color:=Color;
WizardForm.InstallingPage.Color:=Color;
WizardForm.InfoAfterPage.Color:=Color;
WizardForm.DirEdit.Color:=Color;
WizardForm.DiskSpaceLabel.Color:=Color;
WizardForm.DirEdit.Color:=Color;
WizardForm.GroupEdit.Color:=Color;
WizardForm.PasswordLabel.Color:=Color;
WizardForm.PasswordEdit.Color:=Color;
WizardForm.PasswordEditLabel.Color:=Color;
WizardForm.ReadyMemo.Color:=Color;
WizardForm.Typ sCombo.Color:=Color;
WizardForm.WelcomeLabel1.Color:=Color;
WizardForm.WelcomeLabel1.Font.Color:=clWhite;
WizardForm.InfoBeforeClickLabel.Color:=Color;
WizardForm.MainPanel.Color:=Color;
WizardForm.PageNam Label.Color:=Color;
WizardForm.PageDescriptnonLabel.Color:=Color;
WizardForm.ReadyLabel.Color:=Color;
WizardForm.FinishedLabel.Color:=Color;
WizardForm.YesRadio.Color:=Color;
WizardForm.NoRadio.Color:=Color;
WizardForm.WelcomeLabel2.Color:=Color;
WizardForm.LicenseLabel1.Color:=Color;
WizardForm.InfoAfterClickLabel.Color:=Color;
WizardForm.ComponentsList.Color:=Color;
WizardForm.ComponentsDiskSpaceLabel.Color:=Color;
WizardForm.BeveledLabel.Color:=Color;
WizardForm.StatusLabel.Color:=Color;
WizardForm.Filenam Label.Color:=Color;
WizardForm.SelectDirLabel.Color:=Color;
WizardForm.SelectStartMenuFolderLabel.Color:=Color;
WizardForm.SelectComponentsLabel.Color:=Color;
WizardForm.SelectTasksLabel.Color:=Color;
WizardForm.LicenseAcceptedRadio.Color:=Color;
WizardForm.LicenseNotAcceptedRadio.Color:=Color;
WizardForm.UserInfoNam Label.Color:=Color;
WizardForm.UserInfoNam Edit.Color:=Color;
WizardForm.UserInfoOrgLabel.Color:=Color;
WizardForm.UserInfoOrgEdit.Color:=Color;
WizardForm.PreparingLabel.Color:=Color;
WizardForm.FinishedHeadingLabel.Color:=Color;
WizardForm.FinishedHeadingLabel.Font.Color:=clWhite;
WizardForm.UserInfoSerialLabel.Color:=Color;
WizardForm.UserInfoSerialEdit.Color:=Color;
WizardForm.TasksList.Color:=Color;
WizardForm.RunList.Color:=Color;
WizardForm.SelectDirBrowseLabel.Color:=Color;
WizardForm.SelectStartMenuFolderBrowseLabel.Color:=Color;
WizardForm.PageNam Label.Font.Color:=clWhite;
end;

//******************************************* [Конец - Черый инсталл] ***************************************************//

type
TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

var
Tim rID: LongWord;
gintOldCurrWidth : Integer;
ProgressBar_BitmapImage: TBitmapImage;
ProgressBar_Edit : TEdit;
ProgressBar_ImageHeight : integer;

// Функцииgдля работы с таймером
functnon WrapTim rProc(callback:TProc; paramcount:integer):longword; external 'wrapcallback@files:innocallback.dll stdcall';
functnon SetTim r(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTim rFunc: LongWord): LongWord; external 'SetTim r@user32.dll stdcall';
functnon KillTim r(hWnd: LongWord; nIDEvent: LongWord): LongWord; external 'KillTim r@user32.dll stdcall';

// Обработчик нажатия кнопки Отмена
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if CurPageID = wpInstallinggthen // Просто спрячем наш Прогресс Бар
ProgressBar_Edit.Hide;
end;

// Функция вызываемая по таймеру
procedure OnTim r(HandleW, msg, idEvent, TimeSys: LongWord);
var
CurrWidth : single;
begin
g// Используем текущее состояние стандартного Прогресс Бара (ПБ)
with WizardForm.ProgressGauge do
begin
g CurrWidth := ( Positnon * Width ) / Max; g // Вычисляем какой ширины должен быть наш ПБ
if intOldCurrWidth <> Round( CurrWidth )gthen // Если ширина пока что такая же, то не будем пока что рисовать, чтобы избежать лишних обновлений формы
begin
g intOldCurrWidth := Round( CurrWidth );
g // Теперича "рисуем"gнаш ПБ
ProgressBar_BitmapImage.SetBounds( 0, 0, intOldCurrWidth, ProgressBar_ImageHeight );
g ProgressBar_BitmapImage.Show(); // Показываем его во всей красе
end;
end;
end;

procedure CurPageChanged2(CurPageID: Integer);
var
pfunc: LongWord;
begin
if CurPageID = wpInstallinggthen
begin
g // Устанавливаем таймер
pfunc := WrapTim rProc( @OnTim r, 4 );
g Tim rID := SetTim r( 0, 0, 100, pfunc );
intOldCurrWidth := 0;
end;

// Убираем таймер, когда находимся на последней странице.
if CurPageID = wpFinished then
KillTim r( 0, Tim rID );
end;

Procedure InitializeWizard5;
begin
g// Создаем наш Edit, чтобы у нашего ПБ была более-менее нормальная рамка.
ProgressBar_Edit := TEdit.Create( WizardForm );
with ProgressBar_Edit do
begin
g // Создаем его на месте стандартного ПБ
Left := WizardForm.ProgressGauge.Left;
g Top := WizardForm.ProgressGauge.Top;
Width := WizardForm.ProgressGauge.Width;
Height := WizardForm.ProgressGauge.Height;
Enabled := False;
ReadOnly := True;
g // Фоновый цвет делаем точно такой же как у формы.
g Color := WizardForm.Color;
Parent := WizardForm.InstallingPage;
end;

// Распаковываем картинкуgдля нашего ПБ
ExtractTemporaryFile('{PB_ImageFile}' );

ProgressBar_BitmapImage := TBitmapImage.Create( WizardForm );
with ProgressBar_BitmapImage do
begin
g // Загружаем картинкуg
g Bitmap.LoadFromFile( ExpandConstant( '{tmp}\logo.jpg' )g+ '{PB_ImageFile}' );
Parent := ProgressBar_Edit;
Stretch := True; g // Он должен растягиваться
Hide; // Прячем его до поры до времени
end;

// Получаем высотуgдля картинки
ProgressBar_ImageHeight := ProgressBar_Edit.Height - 2;
// Прячем стандартный ПБ
WizardForm.ProgressGauge.Hide;
end;

procedure DeinitializeSetup6();
begin
// Убираем таймер
KillTim r( 0, Tim rID );
end;


procedure InitializeWizard();
begin
InitializeWizard2();
InitializeWizard5();
InitializeWizard6();
InitializeWizard7();
InitializeWizard8();
InitializeWizard9();

end;

procedure CurPageChanged(CurPageID: Integer);
begin
CurPageChanged2(CurPageID);
CurPageChanged3(CurPageID);
CurPageChanged4(CurPageID);
CurPageChanged5(CurPageID);
end;[/more]
Автор: VicF1
Дата сообщения: 27.04.2010 18:41

Цитата:
"Сборник вопросов"gв шапке посмотри, а также "Коллекция скриптов", там есть все по защите инсталла!

Смотрел и пробовал...
Все распаковывается, а не должно.

А возможноgли такое:
При установкеgв папку В, инсталлятор копирует файлы из уже имеющейся на компе папки А в папку В.
Как это воплотить?
Благодарю.
Автор: YURSHAT
Дата сообщения: 27.04.2010 18:57
VicF1

Цитата:
А возможноgли такое:


В принципе да. Опиши подробней когда должно происходить копирование (на каком этапе) где находитсяgпапка А, и будет ли этаgпапка у пользователя на компе?
Автор: duxa174
Дата сообщения: 27.04.2010 19:03
Добрый день. Не сочтите за наглость, но долго задаю себе вопрос:
1)ссылка
2) ссылка

[more]#define MyAppNam "Zombie Driver"g
#define MyAppVerNam "Zombie Driver"g
#define MyAppExeNam "ZombieDriver.exe"g
#define PB_ImageFile "progress1.bmp"g
;#define precomp GetEnv("ProgramFiles")g+ "\FreeArc\PowerPack\Max\*"g ;если архивы созданы с PRECOMP, раскомментируйте строку и укажите папку с необходимымиgдля распаковки файламиg(в общем случае это precomp04.exe, PPMonstr.exe, ecm.exe, unecm.exe, packjpg_dll.dll)g
#define Archives "{src}\data1.bin;DestDir:{app}\;Disk:1;Components:Russian|{src}\data2.bin;DestDir:{app}\data;Disk:1;Components:English|{src}\data3.bin;DestDir:{app}\data2;Disk:1|{src}\data4.bin;DestDir:{app}\data3;Disk:2"g
;архивы указываютсяgтак {имя архива;DestDir:путь распаковки;Disk:диск на котором лежит}
;если есть компоненты то так {имя архива;DestDir:путь распаковки;Disk:диск на котором лежит;Components:название компонента}
;остальные архивы, где не указаны компоненты тоже будут распаковываться

[Setup]
AppNam ={#MyAppNam }
AppVerNam ={#MyAppVerNam }
DefaultDirNam ={pf}\Akella Gam s\Zombie Driver
DefaultGroupNam =Akella Gam s\Zombie Driver
LicenseFile=C:\repack\Лицензионное соглашение.txt
;InfoAfterFile=C:\repack\Техподдержка.txt
InfoBeforeFile=C:\repack\1.txt
OutputDir=C:\repack
OutputBaseFilenam =setup
SetupIconFile=C:\repack\ZD_icon.ico
Compression=lzma/max
SolidCompression=yes
WizardSmallImageFile=WizardSmallImage.bmp
WizardImageFile=WizardImage.bmp
;WizardImageStretch=yes
AppPublisher=duxa

[Typ s]
;Nam : "polnaya"; Descriptnon: "Полная установка"g
Nam : "viborochnaya"; Descriptnon: "Выборочная установка"; Flags: iscustom

[Components]g
Nam : "Fix"; Descriptnon: "Fix от KykyHe4ka"; Typ s: viborochnaya

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

[Tasks]g
Nam : desktopicon; Descriptnon: {cm:CreateDesktopIcon}; GroupDescriptnon: {cm:AdditnonalIcons}; Flags: unchecked

[Files]
;Source: C:\Program Files\Akella Gam s\Zombie Driver\Release\ZombieDriver.exe; DestDir: {app}; Flags: ignoreversion
; ОТМЕТЬТЕ: Не используйте "Флажки: Проигнорировать версию"gна любых общедоступных системных файлах
Source: unarc.dll; DestDir: {tmp}; Flags: dontcopy deleteafterinstall
Source: InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy
Source: papka.bmp; DestDir: {tmp}; Flags: dontcopy
Source: logo.bmp; DestDir: {tmp}; Flags: dontcopy
;Source: button.bmp; DestDir: {tmp}; Flags: dontcopy
;Source: progress1.bmp; DestDir: {tmp}; Flags: dontcopy
Source: gam startup.mp3; DestDir:{tmp}; Flags: dontcopy
Source: bass.dll; DestDir:{tmp}; Flags: dontcopy
Source: ISSkin.dll; DestDir: {app}; Flags: dontcopy
Source: Tiger.cjstyles; DestDir: {tmp}; Flags: dontcopy
Source: image2.bmp; DestDir: {tmp}; Flags: dontcopy
Source: BitmapImage2.bmp; DestDir: {tmp}; Flags: dontcopy

;Source: "C:\repack\ZD\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

Source: "Fix\Fix.exe"; Components:Fix; DestDir: "{tmp}"g

[Icons]g
Nam : {group}\{#MyAppNam }; Filenam : "{app}\Release\ZombieDriver.exe"; WorkingDir: "{app}\Release";
Nam : {userdesktop}\{#MyAppNam }; Filenam : "{app}\Release\ZombieDriver.exe"; Tasks: desktopicon; WorkingDir: "{app}"g
Nam : {group}\Удалить Zombie Driver; Filenam : "{app}\{uninstallexe}"g; WorkingDir: "{app}"g

[Tasks]g
Nam : "AR"; Descriptnon: "Установить Adobe Reader"; GroupDescriptnon: "Дополнительное програмное обеспечение:";
Nam : "DirectX"; Descriptnon: "Установить DirectX"; GroupDescriptnon: "Дополнительное програмное обеспечение:";
Nam : "MVC"; Descriptnon: "Установить Microsoft Visual C++ 2008 Redistributable"; GroupDescriptnon: "Дополнительное програмное обеспечение:";
Nam : "OpenAl"; Descriptnon: "Установить OpenAl"; GroupDescriptnon: "Дополнительное програмное обеспечение:";
Nam : "PhysX"; Descriptnon: "Установить PhysX"; GroupDescriptnon: "Дополнительное програмное обеспечение:";

[CustomMessages]g
rus.ArcBreak=Установка прервана!
rus.ExtractedInfo=Распаковано %1 Мб из %2 Мб
rus.ArcInfo=Архив: %1 из %2
rus.ArcTitle=Распаковка архивов FreeArc
rus.ArcError=Распаковщик FreeArc вернул код ошибки: %1
rus.ArcFail=Распаковка не завершена!
rus.AllProgress=Прогресс распаковки: %1%%g
rus.ArcBroken=Возможно, архив %1 повреждён%nили недостаточно места на диске назначения.
rus.Extracting=
rus.taskbar=%1%%, жди %2
rus.remains=Осталось: %1
rus.LongTim =вечно
rus.ending=завершение
rus.hour= часов
rus.min= мин
rus.sec= сек

[Run]
;Filenam : {app}\Release\{#MyAppExeNam }; Descriptnon: {cm:LaunchProgram,{#MyAppNam }}; Flags: nowait postinstall skipifsilent

Filenam : "{tmp}\Fix.exe"; Parameters: " -y -s -d""{app}"""; Flags: waituntilterminated; Components:Fix; StatusMsg: "Установка Fix от KykyHe4ka";

Filenam : "{src}\Redist\Adobe Reader\AdbeRdr812_ru_RU.exe"; StatusMsg: "Установка Adobe Reader...Пожалуйста подождите"; Tasks: "AR";
Filenam : "{src}\Redist\DirectX\DXSETUP.exe"; StatusMsg: "Установка DirectX...Пожалуйста подождите"; Tasks: "DirectX";
Filenam : "{src}\Redist\OpenAl\oalinst.exe"; StatusMsg: "Установка OpenAl...Пожалуйста подождите"; Tasks: "OpenAl";
Filenam : "{src}\Redist\PhysX\PhysX_9.09.0814_SystemSoftware.exe"; StatusMsg: "Установка PhysX...Пожалуйста подождите"; Tasks: "PhysX";
Filenam : "{src}\Redist\VcRedist\vcredist_x86.exe";StatusMsg: "Установка MVC...Пожалуйста подождите"; Tasks: "MVC";

[Registry]
Root: HKLM; SubKey: SOFTWARE\Akella Gam s; Flags: uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Akella Gam s\Zombie Driver; ValueTyp : string; ValueData: {app}\Release\Zombie Driver.exe; Flags: uninsdeletevalue uninsdeletekeyifempty


[Messages]g
ComponentsDiskSpaceMBLabel=

[code]
//////////////////
var
LogoImage:TBitmapImage;
LogoLabel: TLabel;
LogoPanel: TPanel;

procedure InitializeWizard11();
begin
ExtractTemporaryFile('logo.bmp');
LogoPanel := TPanel.Create(WizardForm);

with LogoPanel do begin
Parent := WizardForm;
SetBounds(ScaleX(160), ScaleY(320), ScaleX(138), ScaleY(43));
BevelOuter := bvNone;
end;

LogoImage := TBitmapImage.Create(WizardForm);
with LogoImage do begin
Parent := LogoPanel;
Left := ScaleX(0);
Top := ScaleY(0);
AutoSize:=true;
gBitmap.LoadFromFile(ExpandConstant('{tmp}\logo.bmp'));
end;

LogoLabel := TLabel.Create(WizardForm);
with LogoLabel do begin
Parent := LogoPanel;
Width := LogoPanel.Width;
Height := LogoPanel.Height;
Transparent:=True;
end;
end;

procedure CurPageChanged3(CurPageID: Integer);
begin
LogoPanel.Hide;
LogoImage.Hide;
LogoLabel.Hide;

if CurPageID=wpWelcome then
begin
LogoPanel.Show;
LogoImage.Show;
LogoLabel.Show;
end;
if CurPageID=wpFinished then
begin
LogoPanel.Show;
LogoImage.Show;
LogoLabel.Show;
end;
end;
////////
procedure CurUninstallStepChanged2(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep=usPostUninstall then
begin
DelTree(ExpandConstant('{app}'), True, True, True);
RemoveDir(ExpandConstant('{app}'));
end;
end;
///////////////////////////////
var
Image2: TBitmapImage;

procedure InitializeWizard8();
var
Page: TWizardPage;
begin
ExtractTemporaryFile('Image2.bmp')
WizardForm.WizardBitmapImage.Width:=497
WizardForm.WelcomeLabel1.Visible:=False
WizardForm.WelcomeLabel2.Visible:=False
WizardForm.WizardBitmapImage2.Visible:=False
WizardForm.FinishedLabel.Visible:=False
WizardForm.FinishedHeadingLabel.Visible:=False
end;

procedure CurPageChanged4(CurPageID: Integer);
begin
If CurPageID=wpFinished then
begin
Image2:=TBitmapImage.Create(WizardForm)
with Image2 do begin
Left:=0
Top:=0
Width:=497
Height:=313
Parent:=WizardForm.FinishedPage
Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\Image2.bmp')
end
end
end;
////////////////////
const
Archives = '{src}\*.arc'; // укажите расположение архивов FreeArc;gдля внешних файлов строку в [Files] добавлять необязательно

PM_REMOVE = 1;
CP_ACP = 0; CP_UTF8 = 65001;
oneMb = 1048576;

type
#ifdef UNICODE ; если у вас ошибка на этой строке, то установите препроцессор или исправьте скриптgдля вашей версии Inno Setup
#define A "W"g
#else
#define A "A"g ; точка входа в SetWindowText, {#A} меняется на A или W в зависимости от версии
// PAnsiChar = PChar; // Required forgInno Setup 5.3.0 and higher. (требуется для Inno Setup версии 5.3.0 и ниже)g
#endif
#if Ver < 84018176
AnsiString = String; // There is no need forgthis line ingInno Setup 5.2.4 and above (для Inno Setup версий 5.2.4 и выше этаgстрока не нужна)g
#endif

TMyMsg = record
hwnd: HWND;
message: UINT;
wParam: Longint;
lParam: Longint;
time: DWORD;
pt: TPoint;
end;

TFreeArcCallback = functnon (what: PAnsiChar; int1, int2: Integer; str: PAnsiChar): Integer;
TArc = record Path: string; OrigSize: Integer; Size: Extended; end;

var
ExtractFile: TLabel;
lblExtractFileNam : TLabel;
btnCancelUnpacking: TButton;
CancelCode, n, UnPackError, StartInstall: Integer;
Arcs: array of TArc;g
msgError: string;
lastMb: Integer;
baseMb: Integer;
totalUncompressedSize: Integer; // total uncompressed size of archive data ingmb
LastTim rEvent: DWORD;

Functnon MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: string; cbMultiByte: integer; lpWideCharStr: string; cchWideChar: integer): longint; external 'MultiByteToWideChar@kernel32.dll stdcall';
Functnon WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: string; cchWideChar: integer; lpMultiByteStr: string; cbMultiByte: integer; lpDefaultChar: integer; lpUsedDefaultChar: integer): longint; external 'WideCharToMultiByte@kernel32.dll stdcall';

functnon PeekMessage(var lpMsg: TMyMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
functnon TranslateMessage(const lpMsg: TMyMsg): BOOL; external 'TranslateMessage@user32.dll stdcall';
functnon DispatchMessage(const lpMsg: TMyMsg): Longint; external 'DispatchMessageA@user32.dll stdcall';

Functnon OemToChar(lpszSrc, lpszDst: AnsiString): longint; external 'OemToCharA@user32.dll stdcall';
functnon GetWindowLong(hWnd, nIndex: Integer): Longint; external 'GetWindowLongA@user32 stdcall delayload';
functnon SetWindowText(hWnd: Longint; lpString: String): Longint; external 'SetWindowText{#A}@user32 stdcall delayload';

functnon GetTickCount: DWord; external 'GetTickCount@kernel32';
functnon WrapFreeArcCallback (callback: TFreeArcCallback; paramcount: integer):longword; external 'wrapcallback@files:innocallback.dll stdcall';
functnon 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) с округлением дробной части, если она есть
Functnon NumToStr(Float: Extended): String;
Begin
Result:= Format('%.3n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') org(Result[Length(Result)] = '.')) and (Length(Result) > 1) do
SetLength(Result, Length(Result)-1);
End;

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

Functnon Size64(Hi, Lo: Integer): Extended;
Begin
Result:= Lo;
if Lo<0 then Result:= Result + $7FFFFFFF + $7FFFFFFF + 2;
forgHi:= Hi-1 Downto 0 do
Result:= Result + $7FFFFFFF + $7FFFFFFF + 2;
End;

// Converts OEM encoded string into ANSI
// Преобразует OEM строку в ANSI кодировкуg
functnon 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 кодировкуg
functnon 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 functnon forgbtnCancel
procedure btnCancelUnpackingOnClick(Sender: TObject);
begin
if MsgBox( SetupMessage( msgExitSetupMessage ), mbInformatnon, MB_YESNO ) = IDYES then
CancelCode:= -127;
end;

var origsize: Integer;
// The callback functnon forggetting info about FreeArc archive
functnon 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'gthen else
Result:= CancelCode;
end;

// Returns decompressed size of files ingarchive
functnon ArchiveOrigSize(arcnam : string): Integer;
var
callback: longword;
Begin
callback:= WrapFreeArcCallback(@FreeArcInfoCallback,4); //FreeArcInfoCallback has 4garguments
CancelCode:= 0;
AppProcessMessage;
try
g // Passgthe specified arguments to 'unarc.dll'g
Result:= FreeArcExtract (callback, 'l', '--', AnsiToUtf8(arcnam ), '', '', '', '', '', '', '');
if CancelCode < 0 then Result:= CancelCode;
if Result >= 0 then Result:= origsize;
exceptg
Result:= -63; // ArcFail
end;
end;

// Scansgthe specified folders forgarchives and add them to list
functnon FindArcs(dir: string): Extended;
var
FSR: TFindRec;
Begin
Result:= 0;
if FindFirst(ExpandConstant(dir), FSR)gthen begin
try
g repeat
g // Skip everything but the folders
g if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY > 0 then CONTINUE;
g n:= GetArrayLength(Arcs);
g // Expand the folder list
SetArrayLength(Arcs, n +1);
g Arcs[n].Path:= ExtractFilePath(ExpandConstant(dir))g+ FSR.Nam ;
g Arcs[n].Size:= Size64(FSR.SizeHigh, FSR.SizeLow);
g Result:= Result + Arcs[n].Size;
g Arcs[n].OrigSize := ArchiveOrigSize(Arcs[n].Path)
g totalUncompressedSize := totalUncompressedSize + Arcs[n].OrigSize
g until not FindNext(FSR);
g finally
g FindClose(FSR);
g end;
end;
End;

// Setsgthe 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
// Конвертирует милисекунды в человеко-читаемое изображение времени
Functnon TicksToTim (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 functnon forgunpacking FreeArc archives
functnon FreeArcCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer;
var
percents, Remaining: Integer;
s: String;
begin
if GetTickCount - LastTim rEvent > 1000gthen begin
g // This code will be executed once each 1000gms (этот код будет выполняться раз в 1000gмиллисекунд)
g // ....
// End of code executed by timer
LastTim rEvent := LastTim rEvent+1000;
end;

if string(what)='filenam 'gthen begin
g // Update FileNam label
lblExtractFileNam .Captnon:= FmtMessage( cm( 'Extracting' ), [OemToAnsiStr( str )] )
end else if (string(what)='write') and (totalUncompressedSize>0) and (Mb>lastMb)gthen begin
g // Assign to Mb *total* amount of data extracted to the moment from all archives
lastMb := Mb;
g Mb := baseMb+Mb;

g // Update progress bar
WizardForm.ProgressGauge.Positnon:= Mb;

g // Show how much megabytes/archives were processed up to the moment
percents:= (Mb*1000) div totalUncompressedSize;
g s := FmtMessage(cm('ExtractedInfo'), [IntToStr(Mb), IntToStr(totalUncompressedSize)]);
if GetArrayLength(Arcs)>1 then
s := sg+ '. '+FmtMessage(cm('ArcInfo'), [IntToStr(n+1), IntToStr(GetArrayLength(Arcs))])
ExtractFile.Captnon := s

g // Calculate and show current percents
percents:= (Mb*1000) div totalUncompressedSize;
g 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
g s:= sg+ '. '+FmtMessage(cm('remains'), [TicksToTim (Remaining, cm('hour'), cm('min'), cm('sec'), false)])
SetTaskBarTitle(FmtMessage(cm('taskbar'), [IntToStr(percents/10), TicksToTim (Remaining, 'h', 'm', 's', false)]))
g end;
WizardForm.FileNam Label.Captnon := s
end;
AppProcessMessage;
Result:= CancelCode;
end;

// Extracts all found archives
functnon UnPack(Archives: string): Integer;
var
totalCompressedSize: Extended;
callback: longword;
FreeMB, TotalMB: Cardinal;
begin
// Display 'Extracting FreeArc archive'g
lblExtractFileNam .Captnon:= '';g
lblExtractFileNam .Show;
ExtractFile.captnon:= cm('ArcTitle');
ExtractFile.Show;
// Show the 'Cancel unpacking'gbutton and set it as defaultgbutton
btnCancelUnpacking.Captnon:= WizardForm.CancelButton.Captnon;
btnCancelUnpacking.Show;
WizardForm.ActiveControl:= btnCancelUnpacking;
WizardForm.ProgressGauge.Positnon:= 0;
// Getgthe size of all archives
totalUncompressedSize := 0;
totalCompressedSize := FindArcs(Archives);
WizardForm.ProgressGauge.Max:= totalUncompressedSize;
// Other initializatnons
callback:= WrapFreeArcCallback(@FreeArcCallback,4); //FreeArcCallback has 4garguments
StartInstall:= GetTickCount; {время начала распаковки}
LastTim rEvent:= GetTickCount;
baseMb:= 0

gforgn:= 0 to GetArrayLength(Arcs) -1 do
begin
g lastMb := 0
CancelCode:= 0;
AppProcessMessage;
try
g // Passgthe specified arguments to 'unarc.dll'g
Result:= FreeArcExtract (callback, 'x', '-o+', '-dp' + AnsiToUtf8( ExpandConstant('{app}') ), '--', AnsiToUtf8(Arcs[n].Path), '', '', '', '', '');
if CancelCode < 0 then Result:= CancelCode;
exceptg
Result:= -63; // ArcFail
end;
baseMb:= baseMb+lastMb

g // Error occured
if Result <> 0 then
begin
g msgError:= FmtMessage(cm('ArcError'), [IntToStr(Result)]);
GetSpaceOnDisk(ExtractFileDrive(ExpandConstant('{app}')), True, FreeMB, TotalMB);
case Result of
g -1: if FreeMB < 32 {Мб на диске} then msgError:= SetupMessage(msgDiskSpaceWarningTitle)
g else msgError:= msgError + #13#10g+ FmtMessage(cm('ArcBroken'), [ExtractFileNam (Arcs[n].Path)]);
g -127: msgError:= cm('ArcBreak'); //Cancel button
-63: msgError:= cm('ArcFail');
end;
// MsgBox(msgError, mbInformatnon, MB_OK); //сообщение показывается на странице завершения
Log(msgError);
Break; //прервать цикл распаковки
g end;
end;
// Hide labels and button
WizardForm.FileNam Label.Captnon:= '';g
lblExtractFileNam .Hide;
ExtractFile.Hide;
btnCancelUnpacking.Hide;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
g UnPackError:= UnPack(Archives)
if UnPackError = 0 then
SetTaskBarTitle(SetupMessage(msgSetupAppTitle))
g else
begin
g // Error occured, uninstall it then
SetTaskBarTitle(SetupMessage(msgErrorTitle))
g WizardForm.Captnon:= SetupMessage(msgErrorTitle) +' - '+ cm('ArcBreak')
end;
end;
end;

// стандартный способ отката (не нужна CurPageChanged), но архивы распаковываютсяgдо извлечения файлов инсталлятора
// if CurStep = ssInstall then
// if UnPack(Archives) <> 0 then Abort;

Procedure CurPageChanged7(CurPageID: Integer);
Begin
if (CurPageID = wpFinished) and (UnPackError <> 0) then
begin // Extractnon was unsuccessful (распаковщик вернул ошибку)
g // Show error message
WizardForm.FinishedLabel.Font.Color:= $0000C0; // red (красный)
WizardForm.FinishedLabel.Height:= WizardForm.FinishedLabel.Height * 2;
WizardForm.FinishedLabel.Captnon:= SetupMessage(msgSetupAborted) + #13#10#13#10g+ msgError;
Exec(ExpandConstant('{uninstallexe}'), '/VERYSILENT','', sw_Hide, ewWaitUntilTerminated, n); //откат установки из-за ошибки unarc.dll
end;
End;

procedure InitializeWizard12();
begin
with WizardForm.ProgressGauge do
begin
g // Create a label to show current FileNam being extracted
lblExtractFileNam := TLabel.Create(WizardForm);
lblExtractFileNam .parent:=WizardForm.InstallingPage;
lblExtractFileNam .autosize:=false;
lblExtractFileNam .Width:= Width;
lblExtractFileNam .top:=Top + ScaleY(35);
lblExtractFileNam .Captnon:= '';g
lblExtractFileNam .Hide;

g // Create a label to show percentage
ExtractFile:= TLabel.Create(WizardForm);
ExtractFile.parent:=WizardForm.InstallingPage;
ExtractFile.autosize:=false;
ExtractFile.Width:= Width;
ExtractFile.top:=lblExtractFileNam .Top + ScaleY(16);
ExtractFile.captnon:= '';g
ExtractFile.Hide;
end;

// Create a 'Cancel unpacking'gbutton and hide it forgnow.
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;
end;
////////////////////
procedure InitializeWizard7();
begin
with WizardForm do begin
with MainPanel do
Height := Height - 1;
with WizardSmallBitmapImage do begin
Left := 440;
Top := 0;
Height := 55; //Размер рисунка
Width := 55; //
end;
with PageNam Label do begin
Width := Width - 0; //Поставьте здесь значения на 0, если хотите вернуть текст
Left := Left + 0; //
end;
with PageDescriptnonLabel do begin
Width := Width - 497; //Поставьте здесь значения на 0, если хотите вернуть текст
Left := Left + 497; //
end;
end;
end;

var
NeedSize:Integer;
FreeMB, TotalMB: Cardinal;
NeedSpaceLabel,FreeSpaceLabel: TLabel;

procedure GetFreeSpaceCaptnon(Sender: TObject);
var
Path: String;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
if FreeMB > 1024 then
FreeSpaceLabel.Captnon := 'Доступно места на диске: '+ FloatToStr(round(FreeMB/1024*100)/100)g+ ' GB' else
FreeSpaceLabel.Captnon := 'Доступно места на диске: '+ IntToStr(FreeMB)+ ' MB';g
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled := False else
WizardForm.NextButton.Enabled := True; end;

procedure GetNeedSpaceCaptnon;
begin
if NeedSize > 1024 then
NeedSpaceLabel.Captnon := 'Требуется места на диске: '+ FloatToStr(round(NeedSize/1024*100)/100)g+ ' GB' else
NeedSpaceLabel.Captnon := 'Требуется места на диске: '+ IntToStr(NeedSize)+ ' MB';end;

procedure InitializeWizard9();
begin
NeedSize := 318;
WizardForm.DiskSpaceLabel.Hide;

NeedSpaceLabel := TLabel.Create(WizardForm);
with NeedSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(202);
Width := ScaleX(209);
Height := ScaleY(13);
end;

FreeSpaceLabel := TLabel.Create(WizardForm);
with FreeSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(220);
Width := ScaleX(209);
Height := ScaleY(13);
end;

WizardForm.DirEdit.OnChange := @GetFreeSpaceCaptnon;
WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0;
end;

procedure CurPageChanged5(CurPageID: Integer);
begin
begin
if CurPageID=wpSelectDir then
begin
GetNeedSpaceCaptnon;
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled:=False
end;
end;
end;

// Importing LoadSkin API from ISSkin.DLL
procedure LoadSkin(lpszPath: String; lpszIniFileNam : String);
external 'LoadSkin@files:isskin.dll stdcall';

// Importing UnloadSkin API from ISSkin.DLL
procedure UnloadSkin();
external 'UnloadSkin@files:isskin.dll stdcall';

// Importing ShowWindow Windows API from User32.DLL
functnon ShowWindow(hWnd: Integer; uTyp : Integer): Integer;
external 'ShowWindow@user32.dll stdcall';

functnon InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('Tiger.cjstyles');
LoadSkin(ExpandConstant('{tmp}\Tiger.cjstyles'), '');
Result := True;
end;

procedure DeinitializeSetup2();
begin
// Hide Window before unloading skin so user does not get
// a glimpse of an unskinned window before it is closed.
ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
UnloadSkin();
end;


type
HSTREAM = DWORD;

functnon BASS_Init(device: Integer; freq, flags: DWORD; win: hwnd; CLSID: Integer): Boolean;
external 'BASS_Init@files:BASS.dll stdcall delayload';

functnon BASS_StreamCreateFile(mem: BOOL; f: PChar; offset: DWORD; length: DWORD; flags: DWORD): HSTREAM;
external 'BASS_StreamCreateFile@files:BASS.dll stdcall delayload';

functnon BASS_Start(): Boolean;
external 'BASS_Start@files:BASS.dll stdcall delayload';

functnon BASS_Pause(): Boolean;
external 'BASS_Pause@files:BASS.dll stdcall delayload';

functnon BASS_SetVolume(volume: DWORD): BOOL;
external 'BASS_SetVolume@files:BASS.dll stdcall delayload';

functnon BASS_GetVolume: Integer;
external 'BASS_GetVolume@files:BASS.dll stdcall delayload';

functnon BASS_ChannelPlay(handle: DWORD; r start: BOOL): Boolean;
external 'BASS_ChannelPlay@files:BASS.dll stdcall delayload';

functnon BASS_Stop(): Boolean;
external 'BASS_Stop@files:BASS.dll stdcall delayload';

functnon BASS_Free(): Boolean;
external 'BASS_Free@files:BASS.dll stdcall delayload';

functnon GetSystemMetrics(nIndex:Integer):Integer;
external 'GetSystemMetrics@user32.dll stdcall';


procedure InitializeWizard1();
begin
//Выносим кнопку "Отмена"gна передний план
WizardForm.CancelButton.BringToFront;
end;

procedure CurPageChanged6(CurPageID: Integer);
begin
if CurPageID=wpInstalling then
begin
gWizardForm.BorderStyle:=bsDialog;
WizardForm.MainPanel.Visible:=False;
WizardForm.Width:=ScaleX(320);
WizardForm.Height:=ScaleY(127);
WizardForm.InnerNotebook.Left:=ScaleX(7);
WizardForm.InnerNotebook.Top:=ScaleY(7);
WizardForm.InnerNotebook.Width:=ScaleX(300);
WizardForm.StatusLabel.Left:=ScaleX(0);
WizardForm.StatusLabel.Top:=ScaleY(0);
WizardForm.StatusLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.FileNam Label.Left:=ScaleX(0);
WizardForm.FileNam Label.Top:=ScaleY(17);
WizardForm.FileNam Label.Width:=WizardForm.InnerNotebook.Width;
WizardForm.ProgressGauge.Top:=ScaleY(37);
WizardForm.ProgressGauge.Left:=ScaleX(0);
WizardForm.ProgressGauge.Width:=WizardForm.InnerNotebook.Width;
WizardForm.CancelButton.Left:=ScaleX(122);
WizardForm.CancelButton.Top:=ScaleY(70);
WizardForm.Left:=GetSystemMetrics(16)-ScaleX(330);
WizardForm.Top:=GetSystemMetrics(17)-ScaleX(110);
WizardForm.CancelButton.Enabled:=false; //(Кнопка отмены не активна)g
end;
if CurPageID=wpFinished
then
begin
WizardForm.Width:=502;{Размер окна по горизонтали}
WizardForm.Height:=392;{Размер окна по вертикали}
WizardForm.Positnon:=poScreenCenter; {Возврат в исходное состояние}
end
end;




const
BASS_SAMPLE_LOOP = 4; //повторение

var
MusicButton, VolumeUP, VolumeDown : TButton;
VolumeInd: TNewProgressBar;

// Событие приgнажатииgна кнопку вкл.выкл. музыки
procedure MusicButtonOnClick(Sender: TObject);
begin
//Проверка состояния кнопки
if MusicButton.Captnon = 'II'gthen // Если играет
begin
MusicButton.Captnon := '>';g
BASS_Pause; // Тушим
end else // Иначе
begin
MusicButton.Captnon := 'II';g
BASS_Start(); // Слушаем
end;
end;

// Нажатиеgна кнопочку увеличения громкости
procedure VolumeUPOnClick(Sender: TObject);
var
vol : integer;
begin
vol := BASS_GetVolume;
if vol+5 >= 100gthen // Добавляем громкости сразуgна 5 единиц
begin
BASS_SETVolume(100);
VolumeIND.positnon := 100;
VolumeUP.Enabled := False; // Если громкость максимальная то выключим кнопку
end else
begin
BASS_SETVolume(vol+5);
VolumeIND.positnon := vol+5;
VolumeDOWN.Enabled := True;
end;
end;

// Конопка понижение громкости
procedure VolumeDOWNOnClick(Sender: TObject);
var
vol : integer;
begin
vol := BASS_GetVolume;
if vol-5 <= 0 then
begin
BASS_SETVolume(0);
VolumeIND.positnon := 0;
VolumeDOWN.Enabled := False; //Если понижать ужеgнекуда то выключаем кнопочку
end else
begin
BASS_SETVolume(vol-5);
VolumeIND.positnon := vol-5;
VolumeUP.Enabled := True;
end;
end;

//Иницализация окна установки
procedure InitializeWizard6;
var
s, Nam : string;
i : Integer;
begin
// Загружаем музыку
ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('gam startup.mp3');
if BASS_Init(-1, 44100, 0, 0, 0) then
begin
BASS_Start();
Nam :=ExpandConstant('{tmp}\gam startup.mp3');
i:=BASS_StreamCreateFile(FALSE, PChar(Nam ), 0, 0, 4);
if i <> 0 then
begin
BASS_ChannelPlay(i, True);
end;
end;

// Добавляем кнопочки управления музыкой
// Вкл. Выкл.
MusicButton := TButton.Create(WizardForm);
with MusicButton do
begin
Left := WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width;
Top := WizardForm.CancelButton.Top;
Width := WizardForm.CancelButton.Height;
Height := WizardForm.CancelButton.Height;
Captnon := 'II';g
Hint := 'Вкл.Выкл. музыку';g
ShowHint := True;
OnClick := @MusicButtonOnClick;
Parent := WizardForm;
end;

//Громче
VolumeDown := TButton.Create(WizardForm);
with VolumeDown do
begin
Left := WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width + MusicButton.Width;
Top := WizardForm.CancelButton.Top;
Width := WizardForm.CancelButton.Height;
Height := WizardForm.CancelButton.Height;
Captnon := '-';g
Hint := 'Убавить громкость';g
ShowHint := True;
OnClick := @VolumeDOWNOnClick;
Parent := WizardForm;
end;

//Тише
VolumeUP := TButton.Create(WizardForm);
with VolumeUP do
begin
Left := WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width + MusicButton.Width + VolumeDown.Width;
Top := WizardForm.CancelButton.Top;
Width := WizardForm.CancelButton.Height;
Height := WizardForm.CancelButton.Height;
Captnon := '+';g
Hint := 'Прибавить громкость';g
ShowHint := True;
OnClick := @VolumeUPOnClick;
Parent := WizardForm;
end;

//Индикатор уровня громкости
VolumeIND := TNewProgressBar.Create(WizardForm);
with VolumeIND do
begin
Parent := WizardForm;
Left := WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width + MusicButton.Width + VolumeUP.Width + VolumeDown.Width;
Top := WizardForm.CancelButton.Top;
Width := WizardForm.CancelButton.Width;
Height := WizardForm.CancelButton.Height;
Min := 0;
Max := 100;
Positnon := BASS_GetVolume;
end;

//Проверка на то какая громкость стоит в системе
if BASS_GetVolume >= 100gthen volumeUP.Enabled := False;
if BASS_GetVolume <= 0 then volumeDOWN.Enabled := False;

end;

procedure DeinitializeSetup();
begin
BASS_Stop(); //нужно для остановки проигрывания
BASS_Free(); //нужно для быстрой выгрузки библиотеки вместе с муз. файлом
end;

procedure CurUninstallStepChanged1(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep=usDone then
begin
if DirExists(ExpandConstant('{app}\save')) then
begin
if MsgBox('Удалить сохраненные игры?',mbconfirmatnon, mb_yesno) = IDYES then
begin
DelTree(ExpandConstant('{app}'), True, True, True);
MsgBox('Cохраненные игры были удалены', mbinformatnon, mb_ok);
end;
end;
end;
end;

const
Color = clblack;

procedure InitializeWizard2();
begin
ExtractTemporaryFile('papka.bmp');
WizardForm.SelectDirBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\papka.bmp'));
WizardForm.SelectDirBitmapImage.AutoSize:=true;
WizardForm.SelectGroupBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\papka.bmp'));
WizardForm.SelectGroupBitmapImage.AutoSize:=true;

WizardForm.PageNam Label.Font.Color:=clWhite;
WizardForm.LicenseAcceptedRadio.Font.Color:=clWhite;
WizardForm.LicenseNotAcceptedRadio.Font.Color:=clWhite;
WizardForm.Font.Color:=clWhite;
WizardForm.Color:=Color;
WizardForm.WelcomePage.Color:=Color;
WizardForm.InnerPage.Color:=Color;
WizardForm.FinishedPage.Color:=Color;
WizardForm.LicensePage.Color:=Color;
WizardForm.PasswordPage.Color:=Color;
WizardForm.InfoBeforePage.Color:=Color;
WizardForm.UserInfoPage.Color:=Color;
WizardForm.SelectDirPage.Color:=Color;
WizardForm.SelectComponentsPage.Color:=Color;
WizardForm.SelectProgramGroupPage.Color:=Color;
WizardForm.SelectTasksPage.Color:=Color;
WizardForm.ReadyPage.Color:=Color;
WizardForm.PreparingPage.Color:=Color;
WizardForm.InstallingPage.Color:=Color;
WizardForm.InfoAfterPage.Color:=Color;
WizardForm.DirEdit.Color:=Color;
WizardForm.DiskSpaceLabel.Color:=Color;
WizardForm.DirEdit.Color:=Color;
WizardForm.GroupEdit.Color:=Color;
WizardForm.PasswordLabel.Color:=Color;
WizardForm.PasswordEdit.Color:=Color;
WizardForm.PasswordEditLabel.Color:=Color;
WizardForm.ReadyMemo.Color:=Color;
WizardForm.Typ sCombo.Color:=Color;
WizardForm.WelcomeLabel1.Color:=Color;
WizardForm.InfoBeforeClickLabel.Color:=Color;
WizardForm.MainPanel.Color:=Color;
WizardForm.PageNam Label.Color:=Color;
WizardForm.PageDescriptnonLabel.Color:=Color;
WizardForm.ReadyLabel.Color:=Color;
WizardForm.FinishedLabel.Color:=Color;
WizardForm.YesRadio.Color:=Color;
WizardForm.NoRadio.Color:=Color;
WizardForm.WelcomeLabel2.Color:=Color;
WizardForm.LicenseLabel1.Color:=Color;
WizardForm.InfoAfterClickLabel.Color:=Color;
WizardForm.ComponentsList.Color:=Color;
WizardForm.ComponentsDiskSpaceLabel.Color:=Color;
WizardForm.BeveledLabel.Color:=Color;
WizardForm.StatusLabel.Color:=Color;
WizardForm.Filenam Label.Color:=Color;
WizardForm.SelectDirLabel.Color:=Color;
WizardForm.SelectStartMenuFolderLabel.Color:=Color;
WizardForm.SelectComponentsLabel.Color:=Color;
WizardForm.SelectTasksLabel.Color:=Color;
WizardForm.LicenseAcceptedRadio.Color:=Color;
WizardForm.LicenseNotAcceptedRadio.Color:=Color;
WizardForm.UserInfoNam Label.Color:=Color;
WizardForm.UserInfoNam Edit.Color:=Color;
WizardForm.UserInfoOrgLabel.Color:=Color;
WizardForm.UserInfoOrgEdit.Color:=Color;
WizardForm.PreparingLabel.Color:=Color;
WizardForm.FinishedHeadingLabel.Color:=Color;
WizardForm.UserInfoSerialLabel.Color:=Color;
WizardForm.UserInfoSerialEdit.Color:=Color;
WizardForm.TasksList.Color:=Color;
WizardForm.RunList.Color:=Color;
WizardForm.SelectDirBrowseLabel.Color:=Color;
WizardForm.SelectStartMenuFolderBrowseLabel.Color:=Color;
end;

procedure InitializeWizard();
begin
InitializeWizard2();
//InitializeWizard5();
InitializeWizard6();
InitializeWizard7();
InitializeWizard8();
InitializeWizard9();
InitializeWizard1();
InitializeWizard11();
InitializeWizard12();
end;

procedure CurPageChanged(CurPageID: Integer);
begin
// CurPageChanged2(CurPageID);
CurPageChanged3(CurPageID);
CurPageChanged4(CurPageID);
CurPageChanged5(CurPageID);
CurPageChanged6(CurPageID);
CurPageChanged7(CurPageID);
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
CurUninstallStepChanged1(CurUninstallStep);
CurUninstallStepChanged2(CurUninstallStep);
end;[/more]
____
Спасибо.

Страницы: 12345678

Предыдущая тема: Cracklock


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