Пользователь
Сообщения: 90
Благодарности: 24
|
Профиль
|
Отправить PM
| Цитировать
Цитата Respin:
Кому не жалко поделитесь, пожалуйста, скриптом сколько скопировано мегабайт/гегабайт из инсталлятора. »
|
читать дальше »
Код: 
[Setup]
AppName=MyProg
AppVerName=MyProg
DefaultDirName={pf}\MyProg
[Files]
Source: innocallback.dll; Flags: dontcopy
Source: {win}\Help\*; DestDir: {app}; Flags: external recursesubdirs;
[ Сode]
const
oneMB=1024*1024;
type
TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);
var
FullSize: Extended;
TimerID: LongWord;
function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): longword; external 'SetTimer@user32';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32 stdcall delayload';
Function NumToStr(Float: Extended): String;
Begin
Result:= Format('%.2n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
SetLength(Result, Length(Result)-1);
End;
Function 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 ByteOrTB(Bytes: Extended; noMB: Boolean): String; {Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 2х знаков после запятой)}
Begin
if not noMB then Result:= NumToStr(Int(Bytes)) +' Mb' else
if Bytes < 1024 then if Bytes = 0 then Result:= '0' else Result:= NumToStr(Int(Bytes)) +' Bt' else
if Bytes/1024 < 1024 then Result:= NumToStr(round((Bytes/1024)*10)/10) +' Kb' else
If Bytes/oneMB < 1024 then Result:= NumToStr(round(Bytes/oneMB*100)/100) +' Mb' else
If Bytes/oneMB/1000 < 1024 then Result:= NumToStr(round(Bytes/oneMB/1024*1000)/1000) +' Gb' else
Result:= NumToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Tb';
End;
function CalcDirSize(const fromDir, fileMask: string; SubDirsAllow: Boolean): Extended;
var
FSR, DSR: TFindRec; FindResult: Boolean; APath: string;
Begin
APath:= AddBackslash(fromDir);
FindResult:= FindFirst(APath + fileMask, FSR);
Try
while FindResult do
begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then Result:= Result + Size64(FSR.SizeHigh, FSR.SizeLow)
FindResult:= FindNext(FSR);
end;
FindResult := FindFirst(APath + '*.*', DSR);
while FindResult and SubDirsAllow do
begin
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and not ((DSR.Name = '.') or (DSR.Name = '..')) then
{Recursion} Result:= Result + CalcDirSize(APath + DSR.Name, fileMask, SubDirsAllow);
// если есть хоть одна рекурсия, то подсчёт почему-то не прерывается
FindResult:= FindNext(DSR);
end;
Finally
FindClose(FSR); FindClose(DSR);
end;
End;
procedure GetExtractSize();
begin
//Так как ClcDirSize суммирует полученные размеры, то сначала обнуляем счетчик
FullSize:=0;
FullSize:=CalcDirSize(ExpandConstant('{app}'), '*', true)
WizardForm.StatusLabel.Caption:= 'Общий объем извлеченных файлов ' + ByteOrTB(FullSize, true)
end;
Procedure MyTimerProc(h, msg, idevent, dwTime: Longword);
Begin
if WizardForm.CurPageID = wpInstalling then GetExtractSize();
End;
procedure DeinitializeSetup();
begin
KillTimer(0, TimerID);
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
TimerID:= SetTimer(0, 0, 500 {полсекунды}, WrapTimerProc(@MyTimerProc, 4));
end;
end;
Цитата Shkutu:
Это в том смысле, какие в каком случае (32/64 бит) директории юзать. »
|
Если я тоже правильно понял...
читать дальше »
Код: 
[Setup]
AppName=AppName
AppVerName=AppVerName
DefaultDirName={pf}\AppName
[ Code]
function InitializeSetup: Boolean;
begin
// Check IsWin64 before using a 64-bit-only feature to
// avoid an exception when running on 32-bit Windows.
if IsWin64 then
MsgBox('64-bit program files reside in: ' +
ExpandConstant('{pf64}'), mbInformation, MB_OK)
else
MsgBox('32-bit program files reside in: ' +
ExpandConstant('{pf32}'), mbInformation, MB_OK);
result:=true;
end;
|