PDA

Показать полную графическую версию : Скрипты 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.
22-04-2011, 09:52
Neutron,
по второму вопросу ответ есть в сборнике скриптов в шапке

[Setup]
DefaultDirName={reg:HKLM\Software\My Program, Path}

где будет браться путь из HKLM\Software\My Program , где ключ обозван Path , где в ключе Path хранится путь до того, что тебе надо.
Вот как отключить окно выбора пути установки:

[Setup]
DefaultDirName={pf}\My Program
DisableDirPage=yes

Если же тебе надо, чтобы при отсутствии пути в реестре установка отменялась, то тебе надо задать проверку в реестре наличия ключа Path. Хотя я допускаю, что возможно, если установка не найдет этот ключ в реестре, то она в любом случае отменит сама себя.

С первым можно попробовать так:

Function InitializeSetup: Boolean;
var res : integer;
begin
...
Exec('ping.exe ', ' 2ip.ru ', ExpandConstant('{sys}'), SW_HIDE, ewWaitUntilTerminated, res);
if res > 0 then begin
MsgBox('Надено подключение к интернету. Установка будет прекращена'+Filepath, mbInformation, MB_OK);
Result := False;
end;
end; //InitializeSetup

MrAWP
22-04-2011, 21:12
Здравствуйте! Очень нужна помощь в реализации казалось бы простой фишки, от которой зависит выход релиза.

Принцип: пользователь качает базовый пакет программы, во время установки на определенной странице (допустим, на стандартной странице выбора компонентов установки) он выбирает дополнительные пакеты для этой программы, который инсталлятор сам вытянет из нужного сервера и распакует во время установки.

На первый взгляд, всё просто - скачал плагин ISDownloader (http://www.sherlocksoftware.org/page.php?id=50) для IS, нашел уже чеё-то готовый скрипт который проверяет, выбран ли компонент и качает. Вот этот скрипт:

[Components]
Name: Component1; Description: Антивирус касперского; Flags: checkablealone; Types: full
Name: Component2; Description: Commfort Chat; Flags: checkablealone; Types: full
Name: Component3; Description: IpTv Player; Flags: checkablealone; Types: full
Name: Component4; Description: VideoLan (VLC); Flags: checkablealone; Types: full
Name: Component5; Description: Opera Browser; Flags: checkablealone; Types: full

[Для Code (бб-код форума не парсится)]

procedure InitializeWizard();
begin
itd_init;

if ISComponentSelected('Component1') then itd_addfile('http://192.168.1.153/mhhl/install/KAV6WKS_2011-09-18_x600_05E5A9CD.key',expandconstant('{tmp}\KAV6WKS_2011-09-18_x600_05E5A9CD.key'));
if ISComponentSelected('Component1') then itd_addfile('http://192.168.1.153/mhhl/install/kav.msi',expandconstant('{tmp}\kav.msi'));
if ISComponentSelected('Component2') then itd_addfile('http://192.168.1.153/mhhl/install/Chat.exe',expandconstant('{tmp}\Chat.exe'));
if ISComponentSelected('Component3') then itd_addfile('http://192.168.1.153/mhhl/install/iptvLan.exe',expandconstant('{tmp}\iptvLan.exe'));
if ISComponentSelected('Component4') then itd_addfile('http://192.168.1.153/mhhl/install/vlc.exe',expandconstant('{tmp}\vlc.exe'));
if ISComponentSelected('Component5') then itd_addfile('http://192.168.1.153/mhhl/install/Opera11.exe',expandconstant('{tmp}\Opera11.exe'));


itd_downloadafter(wpReady);
end;

Но вот беда - файлы качаются ВСЕ, независимо от того что выбрано на странице компонентов :(

Затем наткнулся на скрипт, в котором реализовано то что я хочу, но через костыли (вот он - http://freetexthost.com/osq0sfyeav) - тут перед появлением приветствия вылетают поочередно окошки для каждого компонента (типа: Ставить Это... Да/Нет), потом появляются нормальные окна установщика, окно с выбором компонентов (которое, естественно ни на что не влияет), но качает то что надо.

Прошу у вас помощи, т.к. срывается важный релиз. Гляньте кто-нибудь 1й код, мб там ошибка? Если там всё норм и это баг плагина, возможно ли действовать по принципу 2го кода, но создать новую страницу, которая будет иммитировать обычную страницу с компонентами(с чекбоксами)?

Заранее огромное спасибо за помощь.

R.i.m.s.k.y.
22-04-2011, 21:53
MrAWP, ты компоненты обрабатываешь когда до самого окна компонентов еще очередь не дошла но оно уже создано - в InitializeWizard.
Почитай в справке Installation order, а пока попробуй так:

procedure InitializeWizard();
begin
end;

procedure CurPageChanged(CurPageID: Integer);
begin
If CurPageID=wpReady then begin
itd_init;

if ISComponentSelected('Component1') then itd_addfile('http://192.168.1.153/mhhl/install/KAV6WKS_2011-09-18_x600_05E5A9CD.key',expandconstant('{tmp}\KAV6WKS_2011-09-18_x600_05E5A9CD.key'));
if ISComponentSelected('Component1') then itd_addfile('http://192.168.1.153/mhhl/install/kav.msi',expandconstant('{tmp}\kav.msi'));
if ISComponentSelected('Component2') then itd_addfile('http://192.168.1.153/mhhl/install/Chat.exe',expandconstant('{tmp}\Chat.exe'));
if ISComponentSelected('Component3') then itd_addfile('http://192.168.1.153/mhhl/install/iptvLan.exe',expandconstant('{tmp}\iptvLan.exe'));
if ISComponentSelected('Component4') then itd_addfile('http://192.168.1.153/mhhl/install/vlc.exe',expandconstant('{tmp}\vlc.exe'));
if ISComponentSelected('Component5') then itd_addfile('http://192.168.1.153/mhhl/install/Opera11.exe',expandconstant('{tmp}\Opera11.exe'));
itd_downloadafter(wpInstalling);
end;//wpReady
end;//CurPageChanged


Только смотри чтобы промежуточные окна инно не были отключены а то условие не сработает, тогда wpReady смени на то, что наступает перед wpInstalling, на wpSelectProgramGroup к примеру

страницы идут в следующем порядке
wpWelcome, wpLicense, wpPassword, wpInfoBefore, wpUserInfo, wpSelectDir, wpSelectComponents, wpSelectProgramGroup, wpSelectTasks, wpReady, wpPreparing, wpInstalling, wpInfoAfter, wpFinished

Serega
22-04-2011, 21:53
Но вот беда - файлы качаются ВСЕ, независимо от того что выбрано на странице компонентов »
Ответ есть в ваших словах, немного вдумайтесь...
Когда срабатывает procedure InitializeWizard(); и когда нужно проверять ISComponentSelected?

P.S.
R.i.m.s.k.y., извиняюсь когда писал поста не было...

R.i.m.s.k.y.
22-04-2011, 22:06
R.i.m.s.k.y., извиняюсь когда писал поста не было... »
ничего, лучше глянь, я не попутал If CurPageID=wpReady then begin и itd_downloadafter(wpInstalling);

MrAWP
22-04-2011, 22:19
R.i.m.s.k.y., Serega спасибо вам большое, а то б сам наверное никогда не допер что дело в этом) Кажется работает.

Serega
22-04-2011, 22:26
я не попутал If CurPageID=wpReady then begin и itd_downloadafter(wpInstalling); »
Да в принципе всё нормально, единственное я бы посадил эту проверку в function NextButtonClick, ну и в itd_downloadafter указал wpReady, чтоб загрузка доп. программ шла до установки основной программы.

R.i.m.s.k.y.
22-04-2011, 22:36
R.i.m.s.k.y., Serega спасибо вам большое, а то б сам наверное никогда не допер что дело в этом) Кажется работает. »
читай справку и будешь таким же крутым ;)

vovka1021
23-04-2011, 23:52
у ково есть свободное время помогите пожалуйста обьединить это


[Files]
Source: "gifctrl.dll"; Flags: dontcopy solidbreak
Source: 0023.gif; Flags: dontcopy solidbreak

[code]
const
HALIGN_CENTER = 0;
HALIGN_LEFT = 1;
HALIGN_RIGHT = 2;
VALIGN_CENTER = 0;
VALIGN_TOP = 1;
VALIGN_BOTTOM = 2;
FIT_NONE = 0;
FIT_WIDTH = 1;
FIT_HEIGHT = 2;
FIT_BOTH = 3;
CLR_INVALID = $FFFFFFFF;

function NewGifbWnd(hWndParent: HWND; X, Y, nWidth, nHeight: Integer): HWND; external 'newgifwnd@files:gifctrl.dll stdcall';
function FreeGifWnd(hWndGif: HWND): Boolean; external 'freegifwnd@files:gifctrl.dll stdcall';
function FreeAllGifWnd(): Boolean; external 'freeallgifwnd@files:gifctrl.dll stdcall';
function GifWndSetParent(hWndGif: HWND; hWndParent: HWND): Boolean; external 'gifwndsetparent@files:gifctrl.dll stdcall';
function GifWndSetBounds(hWndGif: HWND; X, Y, nWidth, nHeight: Integer): Boolean; external 'gifwndsetbounds@files:gifctrl.dll stdcall';
function GifWndLoadFromFile(hWndGif: HWND; HAlign, VAlign: Integer; BGColor: DWord; Fit: integer; GifFileName: PChar): Boolean; external 'gifwndloadfromfile@files:gifctrl.dll stdcall';

var
GifPanel: TPanel;
GIFHWND: HWND;

function InitializeSetup(): Boolean;
begin
GIFHWND := 0;
Result := True;
end;

procedure DeinitializeSetup();
begin
FreeAllGifWnd();
end;

procedure InitializeWizard();
var
GifFileName: String;
Lbl: TNewStaticText;
begin
ExtractTemporaryFile('0023.gif');

GIFHWND := NewGifbWnd(WizardForm.Handle, ScaleX(30), WizardForm.Bevel.Top + ScaleY(8), 88, 31);
GifWndLoadFromFile(GIFHWND, HALIGN_CENTER, VALIGN_CENTER, CLR_INVALID, FIT_NONE, ExpandConstant('{tmp}\0023.gif'));
Lbl := TNewStaticText.Create(WizardForm);
Lbl.Parent := WizardForm;
Lbl.AutoSize := False;
Lbl.SetBounds(ScaleX(30), WizardForm.Bevel.Top + ScaleY(8), 88, 31);
end;


с этим:

У меня не доходит как сделать првильно.

Большое спасибо!

LordSP
24-04-2011, 07:22
Serega, Сергей а покажи пример:Да в принципе всё нормально, единственное я бы посадил эту проверку в function NextButtonClick, ну и в itd_downloadafter указал wpReady, чтоб загрузка доп. программ шла до установки основной программы. »

MrAWP
24-04-2011, 11:03
В продолжение проблемы http://forum.oszone.net/post-1664090.html#post1664090

Загрузка теперь, как я уже писал, работает на ура но появилась другая проблему которую заметил только сейчас - если на странице выбора комнонентов или после нее хотя бы 1 раз вернуться на пред. страницу, то все следующие переходы по страницам установщика будут сопровождаться вылетающей ошибкой: "Liteui_Init: Error code 1410". Если нажимать ОК в окне ошибки, то она пропадает и установщик продолжает работу, но раздражает такое окошко на каждом шагу ужасно. Может быть проблема в инициализации itd_init или нужно заменить CurPageID на NextButtonClick?

Вот еще раз код:

procedure InitializeWizard();
begin
end;

procedure CurPageChanged(CurPageID: Integer);
begin
If CurPageID=wpReady then begin
itd_init;


if ISComponentSelected('Component1') then itd_addfile('http://www.sherlocksoftware.org/petz/files/petz4.zip',expandconstant('{tmp}\1.zip'));
if ISComponentSelected('Component2') then itd_addfile('http://www.sherlocksoftware.org/petz/files/petz4.zip',expandconstant('{tmp}\2.zip'));
if ISComponentSelected('Component3') then itd_addfile('http://www.sherlocksoftware.org/petz/files/petz4.zip',expandconstant('{tmp}\3.zip'));
if ISComponentSelected('Component4') then itd_addfile('http://www.sherlocksoftware.org/petz/files/petz4.zip',expandconstant('{tmp}\4.zip'));
if ISComponentSelected('Component5') then itd_addfile('http://www.sherlocksoftware.org/petz/files/petz4.zip',expandconstant('{tmp}\5.zip'));

itd_downloadafter(wpInstalling);
end;
end;

Если же это пофиксить нельзя - можно ли имитировать закрытие этого окошка на каждой странице каким-нибудь скриптом?

Serega
24-04-2011, 11:48
покажи пример: »
С этой библиотекой в архиве, идут примеры, там и так всё доходчиво расписано, так что применить на практике труда не составляет.
то все следующие переходы по страницам установщика будут сопровождаться вылетающей ошибкой: "Liteui_Init: Error code 1410" »
Ну так естественно, т.к. при повторном возвращении на эту страницу, производится повторная инициализация.
Либо добавьте проверку на то, была ли библиотека уже инициализирована, либо инициализируйте библиотеку в процедуре InitializeWizard.

xanloz
24-04-2011, 13:51
Кто поправит скрипт (http://rghost.ru/5307551)?
P.S. Можете поставить заставку файлом SGS2.png и можете сделать чтоб Visual C++ запускал файл с определением если система Windows x64, то в папке х64 или если Windows x86 - х86.
Я не требую, я прошу мож кто-то сделает?

shidow
24-04-2011, 14:11
P.S. Поставьте заставку файлом SGS2.png и можете сделать чтоб Visual C++ запускал файл с определением если система Windows x64, то в папке х64 или если Windows x86 - х86.
Вы уважаемый, не требуйте!

xanloz
24-04-2011, 14:21
Вы уважаемый, не требуйте! »
я не требую я попросил! я вообще не требую никогда. просто не правильно выразился.

MrAWP
24-04-2011, 16:48
либо инициализируйте библиотеку в процедуре InitializeWizard »

Я так и сделал, но ошибка почему то все равно вылетала. Проблема вроде как решилась после замены проверка на wpInstalling вместо wpReady.

R.i.m.s.k.y.
24-04-2011, 17:35
Я так и сделал, но ошибка почему то все равно вылетала. Проблема вроде как решилась после замены проверка на wpInstalling вместо wpReady. »
а в секции setup случайно нет строчки DisableReadyPage=true???

insombia
24-04-2011, 19:01
Как разделить установку на 2 диска по 4 гб каждый для GTA 4?

Serega
24-04-2011, 20:28
Проблема вроде как решилась после замены проверка на wpInstalling вместо wpReady »
Интересное высказывание, главное уверенное... надо так:


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

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

[Types]
Name: full; Description: Full installation
Name: custom; Description: Custom installation; Flags: iscustom

[Components]
Name: comp1; Description: Component 1; Types: full custom
Name: comp2; Description: Component 2; Types: full

#define ITDRoot ReadReg(HKEY_LOCAL_MACHINE,'Software\Sherlock Software\InnoTools\Downloader','InstallPath','')

[Files]
Source: {#ITDRoot}\itdownload.dll; Flags: dontcopy nocompression solidbreak
Source: {#ITDRoot}\languages\*.ini; Flags: dontcopy nocompression solidbreak

[Code]
#include ITDRoot + '\it_download.iss'
procedure LoadITDLang;
var
lang: string;
begin
{ заранее нужно перевести на русский файл *.ini }
lang := ExpandConstant('{language}');
try
ExtractTemporaryFile('itd_' + lang + '.ini');
ITD_LoadStrings(ExpandConstant('{tmp}\itd_' + lang + '.ini'));
except
end;
end;

procedure InitializeWizard();
begin
ITD_Init; // Currently a NOP. Don't count on it in future.
LoadITDLang;
ITD_DownloadAfter(wpReady);
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := True;
if CurPageID = wpSelectComponents then
begin
ITD_ClearFiles;
if IsComponentSelected('comp1') then
ITD_AddFile('http://www.sherlocksoftware.org/petz/files/dogz5.zip', ExpandConstant('{tmp}\dogz5.zip'));
if IsComponentSelected('comp2') then
ITD_AddFile('http://www.sherlocksoftware.org/petz/files/petz4.zip', ExpandConstant('{tmp}\petz4.zip'));
end;
end;


Как разделить установку на 2 диска »
Почитайте в Справке, секция [Setup], разделы DiskSpanning и DiskSliceSize.

murlakatamenka
24-04-2011, 21:32
xanloz, возможно вам помогут флаги 32 bit и 64 bit в секции [Run] (не уверен)
также посмотрите в help-e статью о IsWin64
Serega, R.i.m.s.k.y. и Лександер, всё верно по поводу моего старого вопроса о реестре 32- и 64-битных систем. терь и я проверил, что ничего добавлять не надо, ключи пишутся через Wow6432Node на x64, на x32 сразу в software. В скрипте задано просто HKLM/Software
по прежнему интересно
1. Как можно настроить, чтобы отдельные папки/файлы сохранялись в отдельные .bin-файлы ?
3. Подскажите нормальный вариант для сплэша. Хочу сделать следующее: сначала появляется лого Mass Effect (появление плавное, т.е. со сменой прозрачности), а потом так же плавно появляестся 2 (это цифра, для Mass Effect 2 всё делается )и спустя некоторое врмя они плавно исчезают. isgsg.dll у меня не работает вообще (Win 7 x64), вариант через sleep мне не нравится тем, что при наведении на сплэш курсор меняется на со стрелки на кружок. С картинками поработать смогу (в Photoshop).
вопрос 3 я смогу реализовать в Delphi, прикрутить к инсталлятору это дело потом можно ?
также есть мысли в том же Delphi написать dll для сплэша, мой друг сказал, что это несложно.




© OSzone.net 2001-2012