Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 7]
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%
дружил и с другими ключами? »
Предполагаю, что обработка других ключей у вас уже реализована, тогда в вашем случае можно написать так:
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
тогда в вашем случае можно написать так: »
Благодарю, все прекрасно работает!
Господа. Знаю такой код:
[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;
размер извлечённых файлов естественно считывается неправильный. Подскажите, пожалуйста, возможно ли как-то считывать файлы из самого инсталлятора »
[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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC