Войти

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


Страниц : 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 126 127 128 129 130 131 132 133

THE GUILTY GOD
11-09-2010, 15:50
Я скачал скрипт с установкой с 2х дисков

#define NeedSize "5890" ;Указываем размер игры,в байтах.
;#define precomp GetEnv("ProgramFiles") + "\FreeArc\PowerPack\Max\*" ;если архивы созданы с PRECOMP, раскомментируйте строку и укажите папку с необходимыми для распаковки файлами (в общем случае это precomp04.exe, PPMonstr.exe, ecm.exe, unecm.exe, packjpg_dll.dll)
;Добавляем архивы
#define Archives "{src}\data1.bin;DestDir:{app}\;Disk:1;Components:Russian"
#define Archives Archives + "|" + "{src}\data3.bin;DestDir:{app}\;Disk:1"
;архивы указываются так {имя архива;DestDir:путь распаковки;Disk:диск на котором лежит}
;если есть компоненты то так {имя архива;DestDir:путь распаковки;Disk:диск на котором лежит;Components:название компонента}
;остальные архивы, где не указаны компоненты тоже будут распаковываться

И некак не пойму как сделать так что бы устанавливался с 1го диска(без запроса второго)

R.i.m.s.k.y.
14-09-2010, 15:45
Подскажите, пожалуйста, как сделать сообщение на странице копирования (там где "зеленая колбаса" ползет).
И как сделать его кликабельным (ссылка на сайт с изменением курсора на "руку")

Пытался делать через WizardFormDesigner, вот что он выдал

[ISFormDesigner]
WizardForm=FF0A005456C73506572F7466C600

[_Code]
{ RedesignWizardFormBegin } // Don't remove this line!
// Don't modify this section. It is generated automatically.
var
Label1: TLabel;

procedure RedesignWizardForm;
begin
{ Label1 }
Label1 := TLabel.Create(WizardForm);
with Label1 do
begin
Name := 'Label1';
Parent := WizardForm.InstallingPage;
Alignment := taCenter;
Caption := 'Все программы в сборке бесплатные.' + #13#10 +
'Кейгены, кряки, серийники, таблЭтки и т.п. не требуются.';
Transparent := False;
Left := ScaleX(8);
Top := ScaleY(88);
Width := ScaleX(400);
Height := ScaleY(26);
end;

{ ReservationBegin }
// This part is for you. Add your specialized code here.

{ ReservationEnd }
end;
// Don't modify this section. It is generated automatically.
{ RedesignWizardFormEnd } // Don't remove this line!

В этом формдизайнере все есть, а не отображается при компиляции!
Заранее спасибо!

------------------------------------------------

Как выполнить что-нибуть до распаковки файлов »


[Components]
Name: kill; Description: наша прога;

[Files]
Components: kill; Source: tmp\1.txt; DestDir: {tmp}; BeforeInstall: KillEmAll; Flags: ignoreversion uninsrestartdelete setntfscompression
Components: kill; Source: уже нужные файлы...

[_Code]
procedure KillEmAll;
var Res : Integer;
Begin
Exec('taskkill.exe', ' /f /im 1.exe ',ExpandConstant('{sys}'),SW_HIDE,ewWaitUntilTerminated,res);
end;

В секции Files процедура KillEmAll, означенная в параметре BeforeInstall, выполняется ПЕРЕД КОПИРОВАНИЕМ КАЖДОГО ФАЙЛА. Т.е. если в каталоге DestDir у вас кучка файлом - процедура KillEmAll будет выполняться перед копированием каждого файла, здорово замедляя установку. Поэтому разумно скопировать один левый файлик в папку {tmp}, а потом уже требуемое.

nik1967
14-09-2010, 17:48
R.i.m.s.k.y.,
Эээ..., а зачем через WizardFormDesigner? Так не проще?
http://www.bitbest.ru/files/2010_09_14_9836618437_preview.jpg (http://www.bitbest.ru/view.php?img=2010_09_14_9836618437.jpg)
procedure MyLabel1OnClick(Sender: TObject);
var
ErrorCode: Integer;
begin
ShellExec('open', 'http://forum.ru-board.com/topic.cgi?forum=5&topic=34344', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode); // Ваш URL
end;

procedure InitializeWizard;
var
MyLabel1: TLabel;
begin
MyLabel1 := TLabel.Create(WizardForm);
with MyLabel1 do
begin
Parent := WizardForm.InstallingPage;
Alignment := taCenter;
Caption := 'Все программы в сборке бесплатные.' + #13#10 +
'Кейгены, кряки, серийники, таблЭтки и т.п. не требуются.';
Transparent := True;
Left := ScaleX(28);
Top := ScaleY(88);
Width := ScaleX(400);
Height := ScaleY(26);
Cursor := crHand;
OnClick:=@MyLabel1OnClick;
end;
end;

Cheatkiller
16-09-2010, 14:39
Доброго времени суток всем. Я новичок в этой программе, потому наверно вопросы, которые я задам покажутся вам глупыми.

1. У меня не получается, чтобы установщик включал в себя две и более папок (например я хочу в игре Сталкер упаковать отдельно папку bin и gamedata)
2. И как сделать просто фоновый рисунок сзади вместо BackColor? у меня не получается, я только находил про слайды.

[Setup]
DiskSpanning=no
DiskSliceSize=1500000000
AppName= S.T.A.L.K.E.R.
AppVerName=S.T.A.L.K.E.R. MeDVeD EDITION
AppPublisher=S.T.A.L.K.E.R. MeDVeD EDITION
AppPublisherURL=
AppVersion=
AppSupportURL=
AppUpdatesURL=
AppCopyright=Здесь закон - Тайга, а прокурор MeDVeD(С)
DefaultDirName={reg:HKLM\Software\GSC Game World\STALKER-SHOC,InstallPath|}\gamedata
DefaultGroupName=S.T.A.L.K.E.R. MeDVeD EDITION
DisableProgramGroupPage=yes
InfoAfterFile=D:\Games\S.T.A.L.K.E.R.\gamedata\описание.doc
LicenseFile=D:\12\лицензия.txt
OutputDir=C:\
OutputBaseFilename=S.T.A.L.K.E.R. MeDVeD EDITION
SetupIconFile=D:\12\иконка.ico
UninstallDisplayName=S.T.A.L.K.E.R. MeDVeD EDITION - удаление
Compression=lzma
SolidCompression=yes
WizardImageFile=D:\12\stsmall.bmp
WizardSmallImageFile=D:\12\st2.bmp
WindowVisible=yes
WindowShowCaption=no
BackColor=clBlack
BackColor2=clBlack
VersionInfoVersion=
VersionInfoCopyright=
UninstallDisplayIcon=D:\12\иконка.ico

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

[Files]
Source: "D:\Games\S.T.A.L.K.E.R.\gamedata\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "D:\Games\S.T.A.L.K.E.R.\bin\XR_3DA.exe"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "BASS.dll"; DestDir: "{tmp}"; Flags: dontcopy noencryption nocompression
Source: "sound.mp3"; DestDir: "{tmp}"; Flags: dontcopy noencryption nocompression

[Icons]
Name: "{group}\{cm:UninstallProgram,AMК}"; Filename: "{uninstallexe}"

[Code]
const
BASS_SAMPLE_LOOP = 4;

var
mp3Handle: HWND;
mp3Name: String;

function BASS_Init(device: Integer; freq, flags: DWORD; win: hwnd; CLSID: Integer): Boolean; external 'BASS_Init@files:BASS.dll stdcall delayload';
function BASS_StreamCreateFile(mem: BOOL; f: PChar; offset1: DWORD; offset2: DWORD; length1: DWORD; length2: DWORD; flags: DWORD): DWORD; external 'BASS_StreamCreateFile@files:BASS.dll stdcall delayload';
function BASS_Start: Boolean; external 'BASS_Start@files:BASS.dll stdcall delayload';
function BASS_ChannelPlay(handle: DWORD; restart: BOOL): Boolean; external 'BASS_ChannelPlay@files:BASS.dll stdcall delayload';
function BASS_Stop: Boolean; external 'BASS_Stop@files:BASS.dll stdcall delayload';
function BASS_Free: Boolean; external 'BASS_Free@files:BASS.dll stdcall delayload';

function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('sound.mp3');
mp3Name := ExpandConstant('{tmp}\sound.mp3');
BASS_Init(-1, 44100, 0, 0, 0);
mp3Handle := BASS_StreamCreateFile(FALSE, PChar(mp3Name), 0, 0, 0, 0, BASS_SAMPLE_LOOP);
BASS_Start();
BASS_ChannelPlay(mp3Handle, False);
Result := True;
end;

procedure DeinitializeSetup();
begin
BASS_Stop();
BASS_Free();
end;

Можете подсказать, что и куда добавить?

R.i.m.s.k.y.
16-09-2010, 14:48
У меня не получается, чтобы установщик включал в себя две и более папок (например я хочу в игре Сталкер упаковать отдельно папку bin и gamedata) »

[Files]
Source: stalcker\*; DestDir: {app}\; Flags: ignoreversion recursesubdirs createallsubdirs

Флаги "recursesubdirs createallsubdirs" обрабатывают подкаталоги и создают их соответственно.
А по второму вопросу не скажу - я не делал фоновые изображения. Могу только указать на коллекцию скриптов в шапке темы, что-то подобное там есть. Вот пример оттуда


[Files]
Source: "C:\background.bmp"; DestDir: "{tmp}"; Flags: dontcopy

[_Code]
function GetSystemMetrics(nIndex:Integer):Integer;
external 'GetSystemMetrics@user32.dll stdcall';

procedure InitializeWizard();
var
BackgroundBitmapImage: TBitmapImage;
s:string;
width, height:Integer;
bitmap:TBitmap;
begin
ExtractTemporaryFile('background.bmp');
WizardForm.Position:=poScreenCenter;
MainForm.BORDERSTYLE:=bsNone;
width:=GetSystemMetrics(61);
height:=GetSystemMetrics(62);
MainForm.Width:=width;
MainForm.Height:=height;
width:=MainForm.ClientWidth;
height:=MainForm.ClientHeight;
s:=ExpandConstant('{tmp}')+'\background.bmp';
BackgroundBitmapImage := TBitmapImage.Create(MainForm);
BackgroundBitmapImage.Bitmap.LoadFromFile(s);
BackgroundBitmapImage.Align := alClient;
BackgroundBitmapImage.Parent := MainForm;
BackgroundBitmapImage.Stretch:=True;
MainForm.Visible:=True;
end;

R.i.m.s.k.y.
17-09-2010, 11:08
Сделал на инно поддержку параметров командной строки
Если ставлю /haaliavi /verysilent - работает, если /verysilent /haaliavi - не работает!

procedure InitializeWizard();
...
for i:= 1 to ParamCount do begin
if (Pos(Lowercase('silent'), Lowercase(ParamStr(i))) > 0) then silent := 1 else silent := 0;
end;
...
if (silent = 1) then begin
//перебор различных параметров ком.строки
for i:= 1 to ParamCount do begin
if ( (Pos(Lowercase('/haaliavi'), Lowercase(ParamStr(i))) > 0) and haaliexists) then
WizardForm.ComponentsList.Checked[WizardForm.ComponentsList.Items.IndexOf('{#haaliaviDesc}')]:=True;
end;
end; // silent=1
...
[Registry]
Components: haaliavi...

WTF???

South
17-09-2010, 12:51
R.i.m.s.k.y.,

for i:=0 to ParamCount do begin
s:= ParamStr(i);
MsgBox(IntToStr(i)+#10#13+s, mbInformation, MB_OK);
if (Lowercase(ParamStr(i))='/silent') or (Lowercase(ParamStr(i))='/verysilent') then silent := 1 else silent := 0;
end;

if silent=1 then
for i:= 1 to ParamCount do
if (Lowercase(ParamStr(i))='/haaliavi') and haaliexists then MsgBox('haaliexists', mbInformation, MB_OK);;
//WizardForm.ComponentsList.Checked[WizardForm.ComponentsList.Items.IndexOf('{#haaliaviDesc}')]:=True;

R.i.m.s.k.y.
17-09-2010, 13:04
South, спасибо, но я уже сделал проще - в InitializeSetup получаю строчку параметров целиком, а потом если требуемый параметр найден в этой строчке то...

var GetCmdTail : string;
function InitializeSetup(): Boolean;
begin
CMDLine := GetCmdTail;
if ( Pos(Lowercase('/silent'),Lowercase(CMDLine)) > 0 ) then silent := 1 else silent := 0;

South
17-09-2010, 13:10
R.i.m.s.k.y., вот это вот
if ( Pos(Lowercase('silent'),Lowercase(CMDLine)) > 0 ) then
не очень правильно, т.к. я могу запустить инсталл вот таким образом setup.exe -silent /tipasilent \silent и т.д. и получишь ты бяку

R.i.m.s.k.y.
17-09-2010, 13:18
не очень правильно » согласен, но это прожка для моего применения, так что годится. К тому же как я понял в параметрах командной строки инно при считывании имеется некое подобие курсора, если ему получается важен порядок расстановки параметров. Вопрос был не в том как прочитать параметры строки - как в вашем примере так и было изначально, просто выяснилось что важен порядок расстановки параметров, повторяю /haaliavi /verysilent - работает, /verysilent /haaliavi - не работает! Инно запускается, но требуемое действие по haaliavi не выполняется. Вот и хотел узнать - чего инно так дуркует?

South
17-09-2010, 13:29
R.i.m.s.k.y., да он не дуркует, что написано, то и выполняется. я тоже проглядел
вот так надо
silent := 0;
for i:=0 to ParamCount do begin
s:= ParamStr(i);
MsgBox(IntToStr(i)+#10#13+s, mbInformation, MB_OK);
if (Lowercase(ParamStr(i))='/silent') or (Lowercase(ParamStr(i))='/verysilent') then begin
silent := 1
break;
end;
end;

if silent=1 then
for i:= 1 to ParamCount do
if (Lowercase(ParamStr(i))='/haaliavi') and haaliexists then MsgBox('haaliexists', mbInformation, MB_OK);;

R.i.m.s.k.y.
17-09-2010, 13:31
вот так надо »
break - чтобы дальше по строке не шел не годится - если кучка параметров надо громоздить кучку циклов на каждый из них.
Ни у кого больше идей нет почему если в ком.строке /silent стоит первый после него параметры не воспринимаются? А если /silent передвинуть в конец ком.строки - все воспринимается?

Забацал сейчас отдельный цикл на половину кучки параметров и проверил их - индейская хижина - все равно срабатывание параметров ком.строки зависит от положения /silent. What The FFFFUUUUU...!

Есть подозрение что это "хороший" инно 5.3.9 (неюникод)

South
17-09-2010, 17:31
1.Ни у кого больше идей нет почему если в ком.строке /silent стоит первый после него параметры не воспринимаются? А если /silent передвинуть в конец ком.строки - все воспринимается?
. . .
Есть подозрение что это "хороший" инно 5.3.9 (неюникод) »
есть подозрение, что ты думать не хочешь
при обработке последнего параметра, если он не 'silent', то переменной silent (от которой зависит все остальное, как я понимаю) присвоится 0 - else silent:=0. это ты так пишешь. инно здесь не причем.
2. если у тебя гора параметров и использование всех парамтров зависит от того в тихом режиме или нет запущена установка, то нужно всего 2 цикла. первый поиск того самого silent (причем тот цикл, что написал я более правильный). во втором цикле можно благополучно использовать case и в нем определить остальные переменные

R.i.m.s.k.y.
17-09-2010, 19:06
есть подозрение, что ты думать не хочешь »
Я сегодня весь день рабочий день бился квадратной башкой об эти параметры ком строки.

[Components]

# define ffdresizeDesc "FFDShow - увеличивать картинку до размеров экрана"
# define haaliaviDesc "Haali - воспроизводить avi"

Name: ffd; Description: Настройка FFDShow; Flags: checkablealone; Check: ffdexist
Name: ffd\resize; Description: {#ffdresizeDesc}; Flags: checkablealone dontinheritcheck
Name: haaliavi; Description: {#haaliaviDesc}; Check: HaaliExists

[_code]
function InitializeSetup(): Boolean;
var ErrorCode, err, i, j : integer; s, st : string; param0 : TArrayOfString;
begin

param0 := ['silent','verysilent','ffdresize','noffdresize','nohaaliavi','haaliavi']; //список допустимых параметров
s := '';

for i:=2 to ParamCount do begin
err := 0;
for j:=0 to GetArrayLength(param0)-1 do begin //проверяем корректность параметров
st := ParamStr(i);
if ( Pos(Lowercase(param0[j]), Lowercase(st)) > 0 ) then break else err := err + 1; //MsgBox(Lowercase(param0[j]) + ' ' + Lowercase(st), mbInformation, MB_OK);
end;
if (err = GetArrayLength(param0)) then begin s := s + ParamStr(i) + ' '; end;
if (Pos(Lowercase('haaliavi'), Lowercase(ParamStr(i))) > 0) then haaliavi := 1;
if (Pos(Lowercase('nohaaliavi'), Lowercase(ParamStr(i))) > 0) then nohaaliavi := 1;
if (Pos(Lowercase('ffdresize'), Lowercase(ParamStr(i))) > 0) then ffdresize := 1;
if (Pos(Lowercase('noffdresize'), Lowercase(ParamStr(i))) > 0) then noffdresize := 1;
if ( (Lowercase('/silent') = Lowercase(ParamStr(i))) or (Lowercase('/verysilent') = Lowercase(ParamStr(i)))) then silent := 1 else silent := 0;
end; //ParamCount

if (s <> '') then begin
MsgBox('Недопустимые параметры командной строки: ' + #13#10 + s, mbInformation, mb_Ok);
Result := False;

end; //InitializeSetup

procedure InitializeWizard();
...
if (silent = 1) then begin
if ( (haaliavi = 1) and haaliexists) then WizardForm.ComponentsList.Checked[WizardForm.ComponentsList.Items.IndexOf('{#haaliaviDesc}')]:=True;
if ( (nohaaliavi = 1) and haaliexists) then WizardForm.ComponentsList.Checked[WizardForm.ComponentsList.Items.IndexOf('{#haaliaviDesc}')]:=false;
if ( (ffdresize = 1) and ffdexist) then WizardForm.ComponentsList.Checked[WizardForm.ComponentsList.Items.IndexOf('{#ffdresizeDesc}')]:=True;
if ( (noffdresize = 1) and ffdexist) then WizardForm.ComponentsList.Checked[WizardForm.ComponentsList.Items.IndexOf('{#ffdresizeDesc}')]:=false;
end; // silent = 1

end; //InitializeWizard

end.

[Registry]

Components: haaliavi...
Components: ffdresize...

South
17-09-2010, 19:36
R.i.m.s.k.y., ляг поспи и все пройдет. ты зациклился на какой-то хрени
еще раз повторяю -
допустим у тебя 4 параметра
3-ий параметр=/silent
4-ый=/haaliavi.
когда цикл обрабатывает 3-ий параметр, то переменная silent присваивается 1 вот по этому условию
if ( (Lowercase('/silent') = Lowercase(ParamStr(i))) or (Lowercase('/verysilent') = Lowercase(ParamStr(i)))) then silent := 1 else silent := 0;

когда цикл обрабатывает 4-ый парамет, то по этому же самому условиюif ( (Lowercase('/silent') = Lowercase(ParamStr(i))) or (Lowercase('/verysilent') = Lowercase(ParamStr(i)))) then silent := 1 else silent := 0;
твоя переменная silent становится равной 0

что написал, то и получил

R.i.m.s.k.y.
17-09-2010, 20:00
ляг поспи и все пройдет. ты зациклился на какой-то хрени »
Действительно, СПАСИБИЩЕ! так всегда - самое сложное решается просто

El Sanchez
18-09-2010, 11:34
South, R.i.m.s.k.y., так сойдет?

function CheckDefinedKey(S: String): Boolean;
var
i: Byte;
begin
Result := False;
for i := 1 to ParamCount() do
begin
if (Pos(LowerCase(S), LowerCase(ParamStr(i))) > 0) And (Length(S) = Length(ParamStr(i))) Then Result := True;
end;
end;
...
if WizardSilent and CheckDefinedKey('/haaliavi') then blablabla;

South
18-09-2010, 12:19
El Sanchez, загвоздка была в другом, R.i.m.s.k.y. никак не мог понять где у него ошибка. сделал ошибку с самого начала, а потом слишком долго смотрел на свой код.:) такое бывает и ошибку найдешь либо на следующий день, либо тебя кто-то конкретно ткнет носом и до тебя наконец-то дойдет

по поводу твоего кода. да он рабочий, но
1. if LowerCase(S)=LowerCase(ParamStr(i)) then ... сделает ровно тоже самое, что и твой код, но отработает быстрее :).
2. ему я так понял нужно проверить наличие определенных ключей, которые он дальше будет обрабатывать. используя твою функцию уйдет ParamCount*ParamCount итераций, чтобы проверить их наличие. а если сделать
silent:=False;
haaliavi:=False;
. . .
for i:=1 to ParamCount do
case LowerCase(ParamStr(i)) of
'/silent' or '/verysilent': silent:=True;
'haaliavi': haaliavi:=True;
. . .
end;

тогда потребуется всего ParamCount итераций. если поиск и инициализация переменных завист от того тихая установка или нет, то первым циклом ищем '/silent' и '/verysilent' ключи (не забываем в нем поставить break, чтобы не бегать лишний раз по циклу), второй делаем такой как в предыдущем случае, тогда потребуется максимум 2*ParamCount итераций, что в любом случае быстрее, чем предложенный тобой вариант

El Sanchez
18-09-2010, 13:17
htuos, тогда ладно. В плане оптимизации кода твой вариант хорош и принимается , ну а разницу в несколько миллисекунд во времени выполнения я не замечу :)

moov1kk
18-09-2010, 21:00
http://ipicture.ru/uploads/100904/thumbs/5fJJDTFzkV.jpg (http://ipicture.ru/Gallery/Viewfull/1080720.html)

Знающие люди, как сделать такую распаковку?




© OSzone.net 2001-2012