Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 3]
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
Здравствуйте! Очень нужна помощь в реализации казалось бы простой фишки, от которой зависит выход релиза.
Принцип: пользователь качает базовый пакет программы, во время установки на определенной странице (допустим, на стандартной странице выбора компонентов установки) он выбирает дополнительные пакеты для этой программы, который инсталлятор сам вытянет из нужного сервера и распакует во время установки.
На первый взгляд, всё просто - скачал плагин 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
Но вот беда - файлы качаются ВСЕ, независимо от того что выбрано на странице компонентов »
Ответ есть в ваших словах, немного вдумайтесь...
Когда срабатывает 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);
R.i.m.s.k.y., Serega спасибо вам большое, а то б сам наверное никогда не допер что дело в этом) Кажется работает.
я не попутал 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;
с этим:
У меня не доходит как сделать првильно.
Большое спасибо!
Serega, Сергей а покажи пример:Да в принципе всё нормально, единственное я бы посадил эту проверку в function NextButtonClick, ну и в itd_downloadafter указал wpReady, чтоб загрузка доп. программ шла до установки основной программы. »
В продолжение проблемы 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;
Если же это пофиксить нельзя - можно ли имитировать закрытие этого окошка на каждой странице каким-нибудь скриптом?
покажи пример: »
С этой библиотекой в архиве, идут примеры, там и так всё доходчиво расписано, так что применить на практике труда не составляет.
то все следующие переходы по страницам установщика будут сопровождаться вылетающей ошибкой: "Liteui_Init: Error code 1410" »
Ну так естественно, т.к. при повторном возвращении на эту страницу, производится повторная инициализация.
Либо добавьте проверку на то, была ли библиотека уже инициализирована, либо инициализируйте библиотеку в процедуре InitializeWizard.
Кто поправит скрипт (http://rghost.ru/5307551)?
P.S. Можете поставить заставку файлом SGS2.png и можете сделать чтоб Visual C++ запускал файл с определением если система Windows x64, то в папке х64 или если Windows x86 - х86.
Я не требую, я прошу мож кто-то сделает?
P.S. Поставьте заставку файлом SGS2.png и можете сделать чтоб Visual C++ запускал файл с определением если система Windows x64, то в папке х64 или если Windows x86 - х86.
Вы уважаемый, не требуйте!
Вы уважаемый, не требуйте! »
я не требую я попросил! я вообще не требую никогда. просто не правильно выразился.
либо инициализируйте библиотеку в процедуре 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?
Проблема вроде как решилась после замены проверка на 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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.