Войти

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


Страниц : 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 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188

R.i.m.s.k.y.
06-01-2011, 22:40
спасибо, ты очень добр »
Всегда пожалуйста, если я знаю ответ, то отвечаю на конкретные вопросы. Вопросы общего плана "Как сделать заипок" проходят мимо. Желающие получить код на халяву так же идут следом. Если есть вопросы - сначала почитай что в шапке, поверь, это уменьшит вопросы наполовину. Я сам начинал с шапки.

Что не правильно »
InitializeSetup - это сис.функция, если она вернет Фалсе* инсталлер закроется и не пикнет. Что-то возвращает Фалсе. Потыкай Result := True в разные места, примерно так.

[_Code]
var paramZ:boolean;
function InitializeSetup(): Boolean;
var i:integer; x,s, st:string;
begin
Result := True;
for i:=2 to ParamCount do
begin st:=Lowercase(ParamStr(i));
StringChangeEx(st, '/', '', True);
StringChangeEx(st, '\', '', True); StringChangeEx(st, '-', '', True);
case st of Lowercase('z') : paramZ := true;
Result := True;
end;
end;
end;

Такая фенька с расстановкой Result := True; у меня была на старой версии инно. тут Лександер страниц 5 назад выкладывал ультра инно с препроцессором и тп., на нем у меня без этих подстановок робит

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

* ничего что я по-английски ;)

vahe-91
06-01-2011, 23:55
R.i.m.s.k.y.,
после result:=true вообще не компилируется, пишет begin ему нужен, пишу в этом месте begin, а он мне, что result это unknown identifier. Поставил инно с препроцессором, которые выкладывал Лександр не работает.

Serega
07-01-2011, 00:02
а можете мне дать целую готовую командную строку rar? »
к сожалению с ним не знаком, т.к. rar'ом не пользуюсь, на мой взгляд 7z лучше.

но в более новых темах для XP под Висту и Севен, где прогрессбар цельный, он не отображается »
Возможно, спорить не буду, у меня нет таких тем, чтоб испробовать. В любом случае, мы используем системный прогрессбар.
расположить не над основным прогрессбаром, а над фейковым? Было бы резоннее. »
Как говорят, на вкус и цвет...
Можете сами нарисовать дополнительный статик и выводить в нём сообщения.
Добавление перевода в секцию [CustomMessages] проблему не решает. Сделать два языка в секции [Types] не получается »
Решается это двумя способами:
1. В каждом своём скрипте прописываете через [CustomMessages] перевод для каждого языка и уже указываете в [Types] свою переменную, т.е.:

[CustomMessages]
russian.CustomInstallation=Выборочная установка
english.CustomInstallation=Custom installation

[Types]
Name: custom; Description: {cm:CustomInstallation}; Flags: iscustom

2. Открываете языковой файл, допустим Russian.isl, распаложен в папке Languages, находите в конце файла секцию [CustomMessages] и добавляете в неё новой строкой

CustomInstallation=Выборочная установка

и так далее для каждого языка, т.е. для English.isl:

CustomInstallation=Custom installation

а в скрипте уже просто пишите

[Types]
Name: custom; Description: {cm:CustomInstallation}; Flags: iscustom


С помощью операторов while и do пробовал зациклить, но не могу условия сообразить. »

while True do
begin
GameAlreadyInstall := RegQueryStringValue({#ValueExists}, GamePath) and FileExists({#FileExists});
case GameAlreadyInstall of
True:
begin
// здесь что-то делаем
end;
False:
begin
// здесь что-то делаем
end;
end;
// if условие then
Break; // выходим из цикла
end;

Serega
07-01-2011, 00:53
вообще не компилируется »

[Code]
var
paramZ: Boolean;

function InitializeSetup(): Boolean;
var
i: Integer;
st: string;
begin
Result := True;
for i := 2 to ParamCount do
begin
st := Lowercase(ParamStr(i));
StringChangeEx(st, '/', '', True);
StringChangeEx(st, '\', '', True);
StringChangeEx(st, '-', '', True);
paramZ := st = 'z';
end;
end;

vahe-91
07-01-2011, 10:36
Serega,
а сейчас компилируется, установщик запускается, а если запустить с ключом /z, то будет тоже самое что и без него

Serega
07-01-2011, 11:05
а если запустить с ключом /z, то будет тоже самое что и без него »
Если вы просто скопировали из предыдущего поста, то естественно.
Я лишь подкорректировал код R.i.m.s.k.y., чтоб было понятней:

var
paramZ: Boolean;

function InitializeSetup(): Boolean;
var
i: Integer;
st: string;
begin
Result := True;
for i := 2 to ParamCount do
begin
st := Lowercase(ParamStr(i));
StringChangeEx(st, '/', '', True);
StringChangeEx(st, '\', '', True);
StringChangeEx(st, '-', '', True);
paramZ := st = 'z';
end;
if paramZ then
MsgBox('Ключ "z", присутствует в командной строке.', mbInformation, MB_OK);
end;

Sotonisto
07-01-2011, 11:37
Помогите пожалуйста, как убрать черную обводку?»
Ну вот тебе прозрачный текст :wink:
http://img17.imageshack.us/img17/4949/77989039.jpg
"Новая" версия инсталла для Fallout NV :)
Изменения: добавил чебоксы и музыку во время инсталляции, немного подправил скрипт.
СКАЧАТЬ АРХИВ (http://rghost.ru/3892733)
P.S.: Спасибо за помощь с чебоксами vint56'у с Ru-board.

vahe-91
07-01-2011, 11:39
Если вы просто скопировали из предыдущего поста, то естественно. »
а как именно должно быть ? я всего 2 дня изучаю Инно

Serega
07-01-2011, 12:11
я всего 2 дня изучаю Инно »
Нашёл на предыдущей странице ваш пост, с запуском файла x.exe, должно быть так:


[Files]
Source: C:\Documents and Settings\Administrator\Desktop\x.exe; Flags: dontcopy

[Code]
var
paramZ: Boolean;

function GetKeyParamStr(const key: string): Boolean;
{ функция вернёт True, если ключ key присутствует в командной строке }
var
i: Integer;
s, t: string;
begin
try
Result := False;
t := Lowercase(key);
for i := 2 to ParamCount do
begin
s := Lowercase(ParamStr(i));
if Pos(t, s) > 0 then
begin
StringChangeEx(s, '/', '', True);
StringChangeEx(s, '\', '', True);
StringChangeEx(s, '-', '', True);
Result := t = s;
end;
if Result then Break;
end;
finally
SetLength(s, 0);
SetLength(t, 0);
end;
end;

function InitializeSetup(): Boolean;
begin
Result := True;
paramZ := GetKeyParamStr('z');
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
res: Integer;
begin
if (CurStep = ssDone) and paramZ then
begin
ExtractTemporaryFile('x.exe');
Exec(ExpandConstant('{tmp}\x.exe'), '/z', ExpandConstant('{tmp}'), SW_HIDE, ewWaitUntilTerminated, res);
end;
end;

vahe-91
07-01-2011, 13:32
Serega,
:up получилось, спасибо тебе большое :jump2: . А что еще добавить, чтобы без ключа /z запустилась x.exe без каких либо ключей. Если его запуск прописать в [run], то он запустится и во время запуска с ключом /z. :dont-know

Vista-w
07-01-2011, 13:35
Sotonisto, Чуваккккк)))))) Спасибо тебе огромное))))
Очень благодарен))))))))
Только в этот скрипт можно как то вшить распаковку 7z архивов?

Serega
07-01-2011, 13:56
чтобы без ключа /z запустилась x.exe без каких либо ключей »
Тогда сделать надо так:


[Files]
Source: C:\Documents and Settings\Administrator\Desktop\x.exe; DestDir: {tmp}; Flags: ignoreversion

[Run]
Filename: {tmp}\x.exe; Parameters: {code:KeyStr}; WorkingDir: {tmp}; Flags: runhidden

[Code]
var
paramZ: Boolean;

function KeyStr(const s: string): string;
begin
case paramZ of
True : Result := '/z';
False: Result := '';
end;
end;

function GetKeyParamStr(const key: string): Boolean;
{ функция вернёт True, если ключ key присутствует в командной строке }
var
i: Integer;
s, t: string;
begin
try
Result := False;
t := Lowercase(key);
for i := 2 to ParamCount do
begin
s := Lowercase(ParamStr(i));
if Pos(t, s) > 0 then
begin
StringChangeEx(s, '/', '', True);
StringChangeEx(s, '\', '', True);
StringChangeEx(s, '-', '', True);
Result := t = s;
end;
if Result then Break;
end;
finally
SetLength(s, 0);
SetLength(t, 0);
end;
end;

function InitializeSetup(): Boolean;
begin
Result := True;
paramZ := GetKeyParamStr('z');
end;


а про флаги секции [Run] почитайте в Справке

vahe-91
07-01-2011, 14:08
Serega,
Спасибо :beer2:

Sotonisto
07-01-2011, 19:05
Только в этот скрипт можно как то вшить распаковку 7z архивов? »
Вот тебе cамый простой способ (не забываем [_Сode] изменить на [Сode] :wink:):
[Run]
Filename: {src}\1.exe; WorkingDir: {src}; Parameters: "-y -o""{app}"""; StatusMsg: Установка русификации...; Flags: waituntilterminated

[_Сode]
procedure CurStepChanged(CurStep: TSetupStep);
var
res:Integer;
app, arc, dest:string;
begin
If CurStep=ssPostInstall
then
begin
app:=ExpandConstant('{src}')+'\1.exe';
dest:=ExpandConstant('{app}');
Exec(app, 'x "'+ arc + '" -y -o"'+ dest + '"', '', SW_SHOWNORMAL, ewWaitUntilTerminated, res);
end;
end;
Или тебе нужен скрипт распаковки с отдельным прогресс-баром?

Gnom_aka_Lexander
07-01-2011, 22:10
Sotonisto, Есть способ еще проще: Пакуется 7z sfx с без параметров (ну, может сайлент-моде=1+ самоудаление после распаковки) и запускается из секции РАН безо всякого паскаля :)

Sotonisto
07-01-2011, 23:26
Лександер, да это первое что пришло в голову :happy:
Хотя 7zip уже не так популярен как раньше :) Сейчас всем FreeArc подавай :sleep:

Vista-w
08-01-2011, 12:59
Sotonisto,
Мне нужен с отдельным прогресс баром, чтоб потом этот архив удалился?
Можно такой?
Буду благодарен.

vahe-91
08-01-2011, 15:11
как сделать, чтобы команды в секции [Run] выполнялись после распаковки архива freearc, а не до него

Serega
08-01-2011, 15:45
как сделать, чтобы команды в секции [Run] выполнялись после распаковки архива freearc »
Переместить запускаемые файлы из секции [Run] в сам код, т.е. добавить их выполнение после распаковки архива.

vahe-91
08-01-2011, 16:26
Serega,

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then begin
StartInstall:= GetTickCount {время начала извлечения файлов}
WndHookID:= SetWindowsHookEx(WH_CALLWNDPROC, WrapCWPSTRUCTProc(@OnWndHook, 3), 0, GetCurrentThreadID); {установка SendMessage хука}
TimerID:= SetTimer(0, 0, 500 {полсекунды}, WrapTimerProc(@MyTimerProc, 4)); {установка таймера}
if not {#isFalse(SetupSetting("Uninstallable"))} then Status.count:= -1; // не считать файл unins000.exe end;
if CurStep = ssPostInstall then
begin
StartInstall:= GetTickCount {время начала распаковки}
UnPackError:= UnPack('{#Archives}')
if UnPackError <> 0 then begin // Error occured, uninstall it then
if not {#isFalse(SetupSetting("Uninstallable"))} then // деинсталляция разрешёна
Exec(ExpandConstant('{uninstallexe}'), '/SILENT','', sw_Hide, ewWaitUntilTerminated, n); // откат установки из-за ошибки unarc.dll
WizardForm.caption:= SetupMessage(msgErrorTitle) +' - '+ cm('ArcBreak')
SetTaskBarTitle(SetupMessage(msgErrorTitle)) end else
SetTaskBarTitle(SetupMessage(msgSetupAppTitle));

if CurStep=ssDone then Exec('{tmp}\setup.exe', sw_Hide, ewWaitUntilTerminated) //это я добавил

end; end;


в конце того что я добавил пишет invalid number of parameters




© OSzone.net 2001-2012