Показать полную графическую версию : [архив] Скрипты Inno Setup. Помощь и советы [часть 2]
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}, а потом уже требуемое.
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???
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;
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 не выполняется. Вот и хотел узнать - чего инно так дуркует?
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 (неюникод)
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...
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;
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, тогда ладно. В плане оптимизации кода твой вариант хорош и принимается , ну а разницу в несколько миллисекунд во времени выполнения я не замечу :)
http://ipicture.ru/uploads/100904/thumbs/5fJJDTFzkV.jpg (http://ipicture.ru/Gallery/Viewfull/1080720.html)
Знающие люди, как сделать такую распаковку?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.