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

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

Автор: BuBeBE
Дата сообщения: 22.08.2010 16:58
Ребята, как сделать чтобы инсталятор распаковывал 2 архива arc, один за другим?
Автор: MiniMan
Дата сообщения: 22.08.2010 17:30
Как сделать установку PhysX.msi в доп по?
Автор: Sarcastic_94
Дата сообщения: 22.08.2010 17:52
насчет Msi не знаю,но я делал так

Filename: {src}\Redist\PhysX_9.09.0814_SystemSoftware.exe; WorkingDir: {src}\Redist; Check: DirectX; Flags: waituntilterminated; BeforeInstall: DirectXProgress
Автор: Flamech
Дата сообщения: 22.08.2010 17:53
MiniMan
Filename: msiexec.exe; Parameters: "-i ""{src}\Redist\PhysX.msi"" -qn"; WorkingDir: "{src}\Redist"; StatusMsg: {cm:PhysXInstall}; Check: InstallPhysX; Flags: runminimized waituntilterminated
Автор: nik1967
Дата сообщения: 22.08.2010 18:18
BuBeBE
Смотря какой инсталлятор. Ну а так: ArcLocation "{src}\*.arc"
Автор: sivolt
Дата сообщения: 22.08.2010 19:14
ребят что в этом коде не правильно? Распаковка FreeArc
Inno ругается за****

[more]
CustomMessages
rus.ArcTitle=Распаковка архивов FreeArc...
rus.ExtractedInfo=Распаковано %1 Мб из %2 Мб
rus.ArcInfo=Архив: %1 из %2
rus.AllArcProgress=Прогресс распаковки архивов: %1%%
rus.Extracting=Распаковывается: %1
rus.Taskbar=%1%%, ждите %2
rus.ArcRemains=Осталось ждать %1
rus.LongTime=вечно
rus.Ending=завершение
rus.ArcFail=Распаковка архивов не завершена!
rus.ArcBreak=Распаковка архивов прервана!
rus.ArcFinishedHeading=Установка игры {#GameName} не завершена
rus.ArcError=Установка игры {#GameVerName} не была завершена.
rus.ArcTrouble=Пожалуйста, устраните проблему и запустите установку снова.
rus.ArcBroken=Возможно, архив %1 повреждён или недостаточно места на диске назначения.

UninstallDelete
Type: filesandordirs; Name: {app}

code

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

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

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

Archives = '{#ArcLocation}';

var
ExtractFile, ArcProgressInfoLabel: TLabel;
CancelUnpackingBtn: HWND;
CancelCode, n, ArcInd, UnPackError, StartInstall,
lastMb, baseMb, CurMB, totalUncompressedSize: Integer;
Arcs: array of TArc;
msgError: string;

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

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

Function OemToChar(lpszSrc, lpszDst: AnsiString): longint; external 'OemToCharA@user32.dll stdcall';
function GetWindowLong(hWnd, nIndex: Integer): Longint; external 'GetWindowLongA@user32 stdcall delayload';
function SetWindowText(hWnd: Longint; lpString: AnsiString): Longint; external 'SetWindowTextA@user32 stdcall delayload';

function WrapFreeArcCallback (callback: TFreeArcCallback; paramcount: integer):longword; external 'wrapcallback@{tmp}\innocallback.dll stdcall delayload';
function FreeArcExtract (callback: longword; cmd1,cmd2,cmd3,cmd4,cmd5,cmd6,cmd7,cmd8,cmd9,cmd10: PAnsiChar): integer; external 'FreeArcExtract@files:unarc.dll cdecl';

procedure AppProcessMessage;
var
Msg: TMyMsg;
begin
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;

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

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

function OemToAnsiStr( strSource: AnsiString): AnsiString;
var
nRet : longint;
begin
SetLength( Result, Length( strSource ) );
nRet:= OemToChar( strSource, Result );
end;

function AnsiToUtf8(strSource: Ansistring): Ansistring;
var
nRet, nRet2: integer; WideCharBuf, MultiByteBuf: AnsiString;
begin
SetLength(WideCharBuf, Length(strSource) * 2);
SetLength(MultiByteBuf, Length(strSource) * 2);
nRet:= MultiByteToWideChar(CP_ACP, 0, strSource, -1, WideCharBuf, Length(WideCharBuf));
nRet2:= WideCharToMultiByte(CP_UTF8, 0, WideCharBuf, -1, MultiByteBuf, Length(MultiByteBuf), 0, 0);
if nRet * nRet2 = 0 then Result:= strSource else Result:= MultiByteBuf;
end;

procedure CancelUnpackingOnClick(hBtn:HWND);
begin
if MsgBox( SetupMessage( msgExitSetupMessage ), mbInformation, MB_YESNO ) = IDYES then
CancelCode:= -127;
WizardForm.StatusLabel.Caption:=SetupMessage(msgStatusRollback);
FilenameLabel.Hide;
end;

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

var origsize: Integer;

function FreeArcInfoCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer;
begin
if string(what)='origsize' then origsize := Mb else
if string(what)='compsize' then else
if string(what)='total_files' then else
Result:= CancelCode;
end;

function ArchiveOrigSize(arcname: string): Integer;
var
callback: longword;
Begin
callback:= WrapFreeArcCallback(@FreeArcInfoCallback,4);
CancelCode:= 0;
AppProcessMessage;
try
Result:= FreeArcExtract (callback, 'l', '--', AnsiToUtf8(arcname), '', '', '', '', '', '', '');
if CancelCode < 0 then Result:= CancelCode;
if Result >= 0 then Result:= origsize;
except
Result:= -63;
end;
end;

function FindArcs(dir: string): Extended;
var
FSR: TFindRec;
begin
Result:= 0;
if FindFirst(ExpandConstant(dir), FSR) then begin
try
repeat
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY > 0 then CONTINUE;
n:= GetArrayLength(Arcs);

SetArrayLength(Arcs, n +1);
Arcs[n].Path:= ExtractFilePath(ExpandConstant(dir)) + FSR.Name;
Arcs[n].Size:= Size64(FSR.SizeHigh, FSR.SizeLow);
Result:= Result + Arcs[n].Size;
Arcs[n].OrigSize := ArchiveOrigSize(Arcs[n].Path)
totalUncompressedSize := totalUncompressedSize + Arcs[n].OrigSize
until not FindNext(FSR);
finally
FindClose(FSR);
end;
end;
end;

Procedure SetTaskBarTitle(Title: AnsiString); var h: Integer;
begin
h:= GetWindowLong(MainForm.Handle, -8); if h <> 0 then SetWindowText(h, Title);
end;

Function TicksToTime(Ticks: DWord; h,m,s: String; detail: Boolean): String;
begin
if detail 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 then
Result:= IntToStr(Ticks/3600000) +h+' '+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +m
else if Ticks/60 >= 1000 then
Result:= IntToStr(Ticks/60000) +m+' '+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2) +s
else Result:= IntToStr(Ticks/1000) +s
end;

function FreeArcCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer;
var
Remaining: Integer;
s, t: String; percents: extended; pr: string;
begin

if string(what)='filename' then begin
WizardForm.FileNameLabel.Caption:= FmtMessage( cm( 'Extracting' ), [OemToAnsiStr( str )] )
end else if (string(what)='write') and (totalUncompressedSize>0) and (Mb>lastMb) then begin

lastMb := Mb; CurMb:=0;
CurMb := baseMb+Mb;

WizardForm.ProgressGauge.Position:= (CurMb*1000);

s := FmtMessage(cm('ExtractedInfo'), [IntToStr(CurMb), IntToStr(totalUncompressedSize)]);
if GetArrayLength(Arcs)>1 then
s := s + '. '+FmtMessage(cm('ArcInfo'), [IntToStr(ArcInd+1), IntToStr(GetArrayLength(Arcs))]);
ExtractFile.Caption := s

with WizardForm.ProgressGauge do begin
if (max>0) then percents:= ((position*100)/max);
pr:=Format('%.2n', [percents])
if (Position>0)and((GetTickCount-StartInstall)/1000>0) then Remaining:= ((Max-Position)/(Position/((GetTickCount-StartInstall)/1000)))*1000
else Remaining:= 0; end;

s:= FmtMessage(cm('AllArcProgress'), [pr]);

if Remaining > 0 then begin
s:= s + '. '+FmtMessage(cm('ArcRemains'), [TicksToTime(Remaining, ExpandConstant(' {cm:hour}'), ExpandConstant(' {cm:min}'), ExpandConstant(' {cm:sec}'), false)])
t:= FmtMessage(cm('taskbar'), [pr, TicksToTime(Remaining, ' ч', ' м', ' с', false)])
end else T:= cm('ending');
SetTaskBarTitle(t)
ArcProgressInfoLabel.Caption := s
end;
AppProcessMessage;
Result:= CancelCode;
end;

function UnPack(Archives: string): Integer;
var
totalCompressedSize: Extended;
callback: longword;
FreeMB, TotalMB: Cardinal;
begin
WizardForm.StatusLabel.Caption:= cm('ArcTitle');
FilenameLabel.Show;
ExtractFile.Show;
ArcProgressInfoLabel.Caption:= '';
ArcProgressInfoLabel.Hide;

BtnSetText(CancelUnpackingBtn,WizardForm.CancelButton.Caption);
BtnSetVisibility(CancelUnpackingBtn, True);
WizardForm.ProgressGauge.Position:= 0;

totalUncompressedSize := 0;
totalCompressedSize := FindArcs(Archives);
WizardForm.ProgressGauge.Max:= (totalUncompressedSize*1000);

callback:= WrapFreeArcCallback(@FreeArcCallback,4);
StartInstall:= GetTickCount;
baseMb:= 0

for ArcInd:= 0 to GetArrayLength(Arcs) -1 do
begin
lastMb := 0
CancelCode:= 0;
AppProcessMessage;
try
Result:= FreeArcExtract (callback, 'x', '-o+', '-dp' + AnsiToUtf8( ExpandConstant('{app}') ), '--', AnsiToUtf8(Arcs[ArcInd].Path), '', '', '', '', '');
if CancelCode < 0 then Result:= CancelCode;
except
Result:= -63;
end;
baseMb:= baseMb+lastMb

if Result <> 0 then
begin
msgError:= FmtMessage(cm('ArcError'), [IntToStr(Result)]);
GetSpaceOnDisk(ExtractFileDrive(ExpandConstant('{app}')), True, FreeMB, TotalMB);
case Result of
-1: if FreeMB < 32 then msgError:= SetupMessage(msgDiskSpaceWarningTitle)
else msgError:= msgError + #13#10 + FmtMessage(cm('ArcBroken'), [ExtractFileName(Arcs[ArcInd].Path)]);
-127: msgError:= cm('ArcError') + ExpandConstant(' {cm:ArcBreak}');
-63: msgError:= cm('ArcError') + ExpandConstant(' {cm:ArcFail}');
end;
Break;
end;
end;
ArcProgressInfoLabel.Hide;
ExtractFile.Hide;
BtnSetEnabled(CancelUnpackingBtn, False);
end;

procedure UnpackingArc(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
begin
BtnSetVisibility(hCancelBtn, False);
UnPackError:= UnPack(Archives)
if UnPackError = 0 then
SetTaskBarTitle(SetupMessage(msgSetupAppTitle)) else
begin
Exec(ExpandConstant('{uninstallexe}'), '/SILENT','', sw_Hide, ewWaitUntilTerminated, n);
SetTaskBarTitle(SetupMessage(msgErrorTitle));
end;
end;
end;

Procedure UnpackingArcFinished(CurPageID: Integer);
begin
if (CurPageID = wpFinished) then
begin
BtnSetVisibility(CancelUnpackingBtn, False);
if(UnPackError <> 0) then
begin
FinishedHeadingLabel.Caption:=cm('ArcFinishedHeading');
FinishedLabel.Caption:= msgError + ExpandConstant(' {cm:ArcTrouble}') + #10#13#10#13+ExpandConstant('{cm:FinishedLabel2}');
end;
end;
end;

procedure CreateArcComponents;
begin
with WizardForm.ProgressGauge do
begin
ExtractFile := TLabel.Create(WizardForm);
with ExtractFile do begin
AutoSize:=False;
SetBounds(ScaleX(80), ScaleY(385), ScaleX(638), ScaleY(17));
Alignment := taCenter;
Transparent:=True;
Font.Name:= 'Georgia'
Font.Size:= 10;
Font.Color:=$FFFFFF;
Font.Style:=[fsBold,fsItalic];
Caption:= '';
Parent := WizardForm;
Hide;
end;

ArcProgressInfoLabel := TLabel.Create(WizardForm);
with ArcProgressInfoLabel do begin
AutoSize:=False;
SetBounds(ScaleX(80), ScaleY(415), ScaleX(638), ScaleY(17));
Alignment := taCenter;
Transparent:=True;
Font.Name:= 'Georgia'
Font.Size:= 10;
Font.Color:=$FFFFFF;
Font.Style:=[fsBold,fsItalic];
Parent := WizardForm;
end;
end;

CancelUnpackingBtn:=BtnCreate(WizardForm.Handle,ScaleX(652),ScaleY(487),ScaleX(111),ScaleY(39),ExpandConstant('{tmp}\button.png'),18,False);
BtnSetEvent(CancelUnpackingBtn,BtnMouseEnterEventID,WrapBtnCallback(@CancelUnpackingOnEnter,1));
BtnSetEvent(CancelUnpackingBtn,BtnClickEventID,WrapBtnCallback(@CancelUnpackingOnClick,1));
BtnSetFont(CancelUnpackingBtn,WFButtonFont.Handle);
BtnSetFontColor(CancelUnpackingBtn,$DAE369,$DAE369,$DAE369,$B6B6B6);
BtnSetCursor(CancelUnpackingBtn,GetSysCursorHandle(32649));
BtnSetVisibility(CancelUnpackingBtn, False);
end;
[/more]
Автор: Talula41
Дата сообщения: 22.08.2010 19:19
sivolt

Цитата:
ребят что в этом коде не правильно? Inno ругается за****


inno когда ругается, то выдаёт номер строки, которая ему не нравится... а телепатов тут нет...
Автор: BuBeBE
Дата сообщения: 22.08.2010 19:26
nik1967
дело в том, что у меня есть уже такая строчка:

#define ArcLocation "{src}\setup.arc"

если прописываю ещё одну:

#define ArcLocation "{src}\setup2.arc" например, то распаковывается только со второго архива.
Автор: Alexander61434
Дата сообщения: 22.08.2010 19:32
BuBeBE, делай так.
#define ArcLocation "{src}\*.arc"
Нужно один архив назвать, допустм, setup1.arc, а второй setup2.arc, тогда будет распаковываться сначала setup1, потом setup 2.
sivolt, спрячь всё в тэг [more_][/more]

Автор: StalkMent
Дата сообщения: 22.08.2010 19:32
(удалено)
Автор: sivolt
Дата сообщения: 22.08.2010 19:44
вообщем вот такая ругань
FreeArc.iss скачан с сайта.
Автор: alex2605
Дата сообщения: 22.08.2010 19:53
у кого-нибудь есть NFS Undercover + IsDone 0.4.2.5(последней версии)? - Выложите пожалуйста
или как обновить IsDone в NFS Undercover [v2.4a] до последней?
Автор: nik1967
Дата сообщения: 22.08.2010 19:57
sivolt
Ну дак это же дополнительный скрипт, входящий в состав NFSU. Его не надо компиллировать, он сам когда надо подхватывается.
Alexander61434
BuBeBE
Я вроде то же самое написал.

Добавлено:
alex2605
Дак замени dll-ку от 0.4.2.5 и всё.
Автор: sivolt
Дата сообщения: 22.08.2010 20:02
nik1967
я его не компилировал, я его сделал как поддержку, а инно ругается что в скрипте FreeArc ошибка

+

именно ругается он, на не известные идентификаторы
Автор: nik1967
Дата сообщения: 22.08.2010 20:07
sivolt
Ну или в основном скрипте или в фриарке пропиши переменную:
var
FilenameLabel: TLabel;
Скорее всего что то переделал. Скрипты рабочие на 100%.
Автор: BuBeBE
Дата сообщения: 22.08.2010 20:09
Alexander61434
nik1967
спасибо большое
Автор: sivolt
Дата сообщения: 22.08.2010 20:10
ну незнай
что мог то дописал
var
FileNameLabel:TLabel; GetTickCount:Longint;

но еще дальше ругается:

File: FreeArc.iss
Line 228:
Column 3:
Unknown identifier 'BtnSetText'
Автор: nik1967
Дата сообщения: 22.08.2010 20:16
sivolt
Ну это уже ботва в дело пошла. Скрипт botva2.iss присутствует?
А ещё лучше скачай последнюю мою модификацию(от скромности не помру), там поновее всё будет.
Автор: sivolt
Дата сообщения: 22.08.2010 20:18
вот теперь б** такая фигня. PB.iss, botva2.iss freearc.iss, isdone.iss, все прикрутил

Compiler Error

File: FreeArc.iss

Line 269:

Column 5:

Unknown identifier 'NewPB'
Автор: nik1967
Дата сообщения: 22.08.2010 20:42
sivolt
Кинь скриптом вместе с файлами, поглядим.
Автор: miromax911
Дата сообщения: 23.08.2010 06:52
День добрый, форумчане. У меня такой вопрос, можно ли как то сделать так, чтобы после нажатия кнопки отмена в инсталляторе, или кнопки крестик, он сразу закрывался?
Автор: Shegorat
Дата сообщения: 23.08.2010 07:17
miromax911
Если я правильно понял, то добавь в секцию code следующую процедуру

Код: procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:=False;
Cancel:=True;
end;
Автор: miromax911
Дата сообщения: 23.08.2010 07:24
Shegorat
Спасибо, вышло именно так, как я хотел. =)

Добавлено:
Я конечно извеняюсь, но у меня опят вопрос. У меня есть два изображения( http://s58.radikal.ru/i161/1008/56/9392606f246f.bmp и http://s59.radikal.ru/i166/1008/99/0585f96a8548.bmp ) как можно сделать, чтобы первое изображение было фоном на экране приветствия(тоесть как WizardImageFile, но на всё окно установщика), а второе чтобы было как WizardSmallImageFile, но в ширину окна инсталятора? Надеюсь понятно изложил. =)
Автор: sivolt
Дата сообщения: 23.08.2010 09:28
nik1967

http://rghost.ru/2416159
Автор: nik1967
Дата сообщения: 23.08.2010 11:03
sivolt
Я так понял, тебе нужно прикрутить распаковку FreeArc к обычному скрипту? А вспомогательный скрипт FreeArc.iss для скриптов на botva2.dll сделан. Попробую тебе помочь.
Автор: sivolt
Дата сообщения: 23.08.2010 12:09
nik1967 вообщем, намудрил я что то и получилось

скачал откуда то скрипт FreeArc ща работает, спасибо
Автор: Alexander64217
Дата сообщения: 23.08.2010 12:13
люди подскажите плизз мне нужно архив распаковать в документы, как это реализовать?
Автор: nik1967
Дата сообщения: 23.08.2010 13:25
Alexander64217

Код: [Setup]
DefaultDirName={userdocs}\archive
или
[Setup]
DefaultDirName={commondocs}\archive
Автор: miromax911
Дата сообщения: 23.08.2010 15:52
Выражусь яснее, как сделать инсталятор на подобии этого:
http://s001.youpic.su/pictures/1281546000/87735a2b91d40ad01b11cd9d721de236.png
http://s001.youpic.su/pictures/1281546000/b623c0439f2eeac5346970aa3fa3c45a.png
Автор: azerbaijanec
Дата сообщения: 23.08.2010 16:09
miromax911
вот тебе http://rghost.ru/1853256

Страницы: 1234567891011121314151617181920212223

Предыдущая тема: Skype (Часть 3)


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