PDA

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 7]


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 [87] 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

Nordek
05-10-2014, 01:18
Irenis, Смотрите первое сообщение (http://forum.oszone.net/post-1201499-1.html) соседней темы (http://forum.oszone.net/thread-148707.html):

Показать/скрыть: Различные сборки, русификаторы и полезные ссылки » Показать/скрыть: Распаковщики инсталляторов Inno Setup: »

Inno Setup Unpacker - стандартная версия 0.40 [20.12.2013];
Inno Setup Unpacker enhanced - расширенная версия 0.38 [??.??.????];
HavySoft InnoExtractor - стандартная версия 4.8.1.157 [09.07.2014];
InnoEx - стандартная версия 0.5 [25.06.2014];
»


На примере консольной утилиты Inno Setup Unpacker (http://sourceforge.net/projects/innounp/files/innounp/):

:: Каталог для извлечения содержимого
set DIR="C:\Stronghold"

:: Исполняемый файл
set EXE="C:\Stronghold_setup.exe"

innounp.exe -x -a -d%DIR% %EXE%

Serega
05-10-2014, 13:09
дружил и с другими ключами? »
Предполагаю, что обработка других ключей у вас уже реализована, тогда в вашем случае можно написать так:

function InitializeSetup: Boolean;
var
i, ResultCode: Integer;
param: string;
IsNeedRestart: Boolean;
begin
IsNeedRestart := False;
// проверяем с 2, ParamStr(0) = ...\setup.tmp, а ParamStr(1) = ...\setup.exe
for i := 2 to ParamCount do
if LowerCase(ParamStr(i)) = '/v' then
begin
param := param + ' /verysilent';
IsNeedRestart := True;
end
else
// запишем остальные ключи, если есть
param := param + #32 + ParamStr(i);
if IsNeedRestart then
begin
Exec(ExtractFileName(ExpandConstant('{srcexe}')), TrimLeft(param), ExtractFileDir(ExpandConstant('{srcexe}')), SW_SHOWNORMAL, ewNoWait, ResultCode);
Exit;
end;
Result := True;
end;

diman_21Ru
05-10-2014, 13:50
Как можно в стрипт вывести дополнительную страницу для Tasks.

Dodakaedr
05-10-2014, 16:53
тогда в вашем случае можно написать так: »
Благодарю, все прекрасно работает!

Tco 03
05-10-2014, 17:19
Господа. Знаю такой код:

[Setup]
AppName=MyProg
AppVerName=MyProg
OutputDir=D:\Репаки\MyProg
DefaultDirName={pf}\MyProg

[Files]
Source: compiler:innocallback.dll; Flags: dontcopy
Source: D:\Program\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs

[ code]
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;

Всё конечно работает прекрасно, но дело в том, что в папке установки уже присутствуют файлы. Из-за этого размер извлечённых файлов естественно считывается неправильный. Подскажите, пожалуйста, возможно ли как-то считывать файлы из самого инсталлятора, а не из папки?

Dodakaedr
05-10-2014, 19:51
Как можно в стрипт вывести дополнительную страницу для Tasks. »
Вот так [Setup]
AppName=My Program
AppVerName=My Program ver.1.5
DefaultDirName={pf}\My Program

[Tasks]
Name: desktopicon; Description: Create a &desktop icon; GroupDescription: Additional icons:
Name: quicklaunchicon; Description: Create a &Quick Launch icon; GroupDescription: Additional icons:; Flags: unchecked
Name: associate; Description: &Associate files; GroupDescription: Other tasks:; Flags: unchecked

[Code]
var
Page: TInputOptionWizardPage;
procedure InitializeWizard();
begin
Page := CreateInputOptionPage(wpSelectTasks,
'Выберите дополнительные задачи', 'Какие дополнительные задачи необходимо выполнить?',
'Выберите дополнительные задачи, которые должны выполниться при установке My Program, после этого нажмите «Далее»:',
False, False);

{0} Page.Add('Дополнительная задача 1');
{1} Page.Add('Дополнительная задача 2');
{2} Page.Add('Дополнительная задача 3');
{3} Page.Add('Дополнительная задача 4');
{4} Page.Add('Дополнительная задача 5');
{5} Page.Add('Дополнительная задача 6');
{6} Page.Add('Дополнительная задача 7');
{7} Page.AddEx('Дополнительное ПО', 0, True);
{8} Page.AddEx('DirectX', 1, False);
{9} Page.AddEx('AudioDriver', 1, False);
//Page.Values[7] := True;
//Page.Values[8] := True;
end;

diman_21Ru
05-10-2014, 19:55
Как сделать страницу с лицензией и FAQ ровнее

Dodakaedr
05-10-2014, 19:58
Как сделать страницу с лицензией и FAQ ровнее »
В смысле ровнее?

diman_21Ru
05-10-2014, 19:58
Dodakaedr, Окно с Файлом лицензии сделать побольше

Dodakaedr
05-10-2014, 20:04
Окно с Файлом лицензии сделать побольше »
Так задайте размерprocedure InitializeWizard();
begin
WizardForm.LicenseMemo.Width:=600;
WizardForm.LicenseMemo.Height:=400;
end;

diman_21Ru
05-10-2014, 20:13
Dodakaedr, Кнопки пропали согласится

Dodakaedr
05-10-2014, 20:21
Кнопки пропали согласится »
Соответственно и их нужно переместитьprocedure InitializeWizard();
begin
WizardForm.LicenseMemo.Width:=600;
WizardForm.LicenseMemo.Height:=400;
WizardForm.LicenseAcceptedRadio.SetBounds(ScaleX(300), ScaleY(410), ScaleX(WizardForm.LicenseAcceptedRadio.Width), ScaleY(WizardForm.LicenseAcceptedRadio.Height));
WizardForm.LicenseNotAcceptedRadio.SetBounds(ScaleX(300), ScaleY(430), ScaleX(WizardForm.LicenseNotAcceptedRadio.Width), ScaleY(WizardForm.LicenseNotAcceptedRadio.Height));
end;

diman_21Ru
05-10-2014, 20:43
Dodakaedr, Дружище может ты знаешь и FAQ как настроить его просто нет в настройках скрипта как с лицензией вот скрин

Dodakaedr
05-10-2014, 20:48
FAQ как настроить »
Так само сделайте и для того элемента которым используется ваш FAQ.

diman_21Ru
05-10-2014, 20:57
Dodakaedr, Знать бы как ещё )

Dodakaedr
05-10-2014, 20:59
diman_21Ru, Покажите тот кусок, где используется FAQ или скиньте скрипт.

diman_21Ru
05-10-2014, 21:13
Dodakaedr, InfoBeforeFile=faq.rtf

Dodakaedr
05-10-2014, 21:16
InfoBeforeFile=faq.rtf »
procedure InitializeWizard();
begin
WizardForm.InfoBeforeMemo.Width:=600;
WizardForm.InfoBeforeMemo.Height:=400;
end;

Serega
05-10-2014, 22:01
размер извлечённых файлов естественно считывается неправильный. Подскажите, пожалуйста, возможно ли как-то считывать файлы из самого инсталлятора »

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma2/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Languages]
Name: ru; MessagesFile: compiler:Languages\Russian.isl

[CustomMessages]
ru.FSize=Общий объем извлеченных файлов %s
ru.Bt=Бт
ru.Kb=Кб
ru.Mb=Мб
ru.Gb=Гб
ru.Tb=Тб

[Files]
Source: compiler:innocallback.dll; Flags: dontcopy
Source: D:\Program\*; DestDir: {app}; AfterInstall: IncSize; Flags: ignoreversion recursesubdirs createallsubdirs

[Code]
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 delayload';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall delayload';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall delayload';

function GetFileSize(const FileName: string): Extended;
{ определяет размер файла, в отличии от встроенной функции FileSize не имеет ограничения в 2 Гб }
var
FindData: TFindRec;
Lo, Hi: Integer;
begin
if FindFirst(FileName, FindData) then
try
Lo := FindData.SizeLow;
Hi := FindData.SizeHigh;
Result := Lo;
if Lo < 0 then
Result := Result + $7FFFFFFF + $7FFFFFFF + 2;
for Hi := Hi - 1 downto 0 do
Result := Result + $7FFFFFFF + $7FFFFFFF + 2;
finally
FindClose(FindData);
end;
end;

procedure IncSize;
var
Size: Integer;
begin
{ FileSize имеет ограничение в 2 Гб, но на маленьких файлах работать должен шустрее }
if FileSize(ExpandConstant(CurrentFileName), Size) then
FullSize := FullSize + Extended(Size);
end;

function BytesToReadable(Bytes: Extended; Signs: Integer): string;
{ перевод числа в значение Бт/Кб/Мб/Гб/Тб (Signs - количество знаков после запятой)}
var
n: Integer;
begin
n := 0;
while Int(Bytes) > 1023 do
begin
Bytes := Bytes/1024;
n := n + 1;
end;
case n of
0: Result := FloatToStr(Int(Bytes)) + #32 + CustomMessage('Bt'); // Байт
1: Result := Format('%.' + IntToStr(Signs) + 'n ' + CustomMessage('Kb'), [Bytes]); // Килобайт
2: Result := Format('%.' + IntToStr(Signs) + 'n ' + CustomMessage('Mb'), [Bytes]); // Мегабайт
3: Result := Format('%.' + IntToStr(Signs) + 'n ' + CustomMessage('Gb'), [Bytes]); // Гигабайт
4: Result := Format('%.' + IntToStr(Signs) + 'n ' + CustomMessage('Tb'), [Bytes]); // Терабайт
end;
StringChange(Result, ',', '.');
end;

procedure MyTimerProc(HandleW, Msg, idEvent, TimeSys: LongWord);
begin
WizardForm.StatusLabel.Caption := Format(CustomMessage('FSize'), [BytesToReadable(FullSize, 2)]);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
TimerID := SetTimer(0, 0, 500 {полсекунды}, WrapTimerProc(@MyTimerProc, 4));
end;

procedure DeinitializeSetup();
begin
KillTimer(0, TimerID);
end;

diman_21Ru
06-10-2014, 14:17
Вставил код на музыку выдает ошибку с чем связана подскажите пожалуйста вот скрин :




© OSzone.net 2001-2012