Показать полную графическую версию : [архив] Скрипты Inno Setup. Помощь и советы [часть 2]
Pilotfcsm
20-12-2009, 14:03
Здравствуйте. Поиском не нашел того что нужно, поэтому вопрос:
Можно ли сделать так чтобы после установки программы, появлялось окно, в котором было несколько определенных пунктов, и возможность выбора одного из них. При выборе какого либо пункта, определенный файл копировался бы из папки скажем {app}\Папка\файл.ini в корневую папку программы?
Если кто встречал рпимер скрипта, поделитесь пожалуйста.
И еще последний вопрос, можно ли сделать чтобы в окне выбора компонентов( какие будут устанавливаться, а какие нет), при наведении на какой либо компонент, рядом появлялась подсказка (комментарий) для этого компонента, в котрой написано пояснение для чего нужен он? Наподобие как в нсис
Молодой, там и нет такой строчки, это задаётся вручную: 1) скриптом: [Code]
var
NeedSize:Integer; FreeMB, TotalMB: Cardinal; NeedSpaceLabel,FreeSpaceLabel: TLabel;
procedure GetFreeSpaceCaption(Sender: TObject);
var
Path: String;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
if FreeMB > 1024 then
FreeSpaceLabel.Caption := 'Доступно места на диске: '+ FloatToStr(round(FreeMB/1024*100)/100) + ' GB' else
FreeSpaceLabel.Caption := 'Доступно места на диске: '+ IntToStr(FreeMB)+ ' MB';
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled := False else
WizardForm.NextButton.Enabled := True; end;
procedure GetNeedSpaceCaption;
begin
if NeedSize > 1024 then
NeedSpaceLabel.Caption := 'Требуется места на диске: '+ FloatToStr(round(NeedSize/1024*100)/100) + ' GB' else
NeedSpaceLabel.Caption := 'Требуется места на диске: '+ IntToStr(NeedSize)+ ' MB';
end;
procedure InitializeWizard();
begin
NeedSize := 630000;
WizardForm.DiskSpaceLabel.Hide;
NeedSpaceLabel := TLabel.Create(WizardForm);
with NeedSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(202);
Width := ScaleX(209);
Height := ScaleY(13);
end;
FreeSpaceLabel := TLabel.Create(WizardForm);
with FreeSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(220);
Width := ScaleX(209);
Height := ScaleY(13);
end;
WizardForm.DirEdit.OnChange := @GetFreeSpaceCaption;
WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID=wpSelectDir then begin
GetNeedSpaceCaption;
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled:=False
end;
end;
2) Обычным редактированием Russian.isl (Default.isl)
Pilotfcsm, по поводу второго вопроса - в шапке есть Коллекция скриптов (http://victor-dobrov.narod.ru/InnoSetupScripts.7z), там это есть.
И еще последний вопрос, можно ли сделать чтобы в окне выбора компонентов( какие будут устанавливаться, а какие нет), при наведении на какой либо компонент, рядом появлялась подсказка (комментарий) для этого компонента, в котрой написано пояснение для чего нужен он? Наподобие как в нсис »
[Setup]
AppName=AppName
AppVerName=AppVerName
CreateAppDir=false
[Files]
Source: compiler:WizModernSmallImage.bmp; DestDir: {tmp}; Flags: dontcopy
Source: compiler:WizModernSmallImage-IS.bmp; DestDir: {tmp}; Flags: dontcopy
[Code_]
Var
Page: TWizardPage;
Text1,Text2,Text3,Text4: TNewStaticText;
Panel: TPanel;
ListBox: TListBox;
Check1,Check2: TCheckBox;
NoChecks,Label1,Label2: TLabel;
Image: TBitmapImage;
Function Checked1: Boolean;
begin
Result:=Check1.Checked
end;
Function Checked2: Boolean;
begin
Result:=Check2.Checked
end;
Procedure Check1OnClick (Sender: TObject);
begin
Check1.Checked:=Not(Check1.Checked)
end;
Procedure Check2OnClick (Sender: TObject);
begin
Check2.Checked:=Not(Check2.Checked)
end;
procedure Check1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
Text4.Enabled:=True
Text4.Caption:='Описание первого компонента'
Image.Bitmap.LoadFromFile(ExpandConstant('{tmp}\WizModernSmallImage.bmp'))
Image.Visible:=True
end;
procedure Check2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
Text4.Enabled:=True
Text4.Caption:='Описание второго компонента'
Image.Bitmap.LoadFromFile(ExpandConstant('{tmp}\WizModernSmallImage-IS.bmp'))
Image.Visible:=True
end;
procedure NoChecksMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
Text4.Enabled:=False
Text4.Caption:='Наведите курсор мыши на название компонента, чтобы прочесть его описание.'
Image.Visible:=False
end;
Procedure InitializeWizard();
begin
ExtractTemporaryFile('WizModernSmallImage.bmp')
ExtractTemporaryFile('WizModernSmallImage-IS.bmp')
Page:=CreateCustomPage(2, 'Компоненты устанавливаемой программы', 'Выберите компоненты, которые вы хотите установить.')
Text1:=TNewStaticText.Create(Page)
Text1.Left:=0
Text1.Top:=0
Text1.Width:=417
Text1.Height:=28
Text1.AutoSize:=False
Text1.WordWrap:=True
Text1.Caption:='Выберите компоненты программы, которые вы хотите установить. Нажмите на кнопку "Далее" для продолжения.'
Text1.Parent:=Page.Surface
Text2:=TNewStaticText.Create(Page)
Text2.Left:=0
Text2.Top:=63
Text2.Width:=130
Text2.Height:=42
Text2.AutoSize:=False
Text2.WordWrap:=True
Text2.Caption:='Выберите компоненты программы для установки:'
Text2.Parent:=Page.Surface
Image:=TBitmapImage.Create(WizardForm)
Image.Left:=0
Image.Top:=Text2.Top + Text2.Height + 10;
Image.Width:=55
Image.Height:=55
Image.Parent:=Page.Surface
Panel:=TPanel.Create(Page)
Panel.Left:=287
Panel.Top:=60
Panel.Width:=130
Panel.Height:=160
Panel.BevelInner:=bvLowered
Panel.Parent:=Page.Surface
Text3:=TNewStaticText.Create(Page)
Text3.Left:=293
Text3.Top:=54
Text3.Font.Color:=clBlue
Text3.Caption:='Описание'
Text3.Parent:=Page.Surface
Text4:=TNewStaticText.Create(Page)
Text4.Left:=4
Text4.Top:=10
Text4.Width:=122
Text4.Height:=140
Text4.AutoSize:=False
Text4.WordWrap:=True
Text4.Parent:=Panel
NoChecks:=TLabel.Create(Page)
NoChecks.Width:=WizardForm.Width
NoChecks.Height:=WizardForm.Height
NoChecks.Autosize:=False
NoChecks.Transparent:=True
NoChecks.OnMouseMove:=@NoChecksMouseMove
NoChecks.Parent:=Page.Surface
ListBox:=TListBox.Create(Page)
ListBox.Left:=135
ListBox.Top:=60
ListBox.Width:=140
ListBox.Height:=160
ListBox.Parent:=Page.Surface
Check1:=TCheckBox.Create(Page)
Check1.Left:=2
Check1.Top:=0
Check1.Checked:=True
Check1.Parent:=ListBox
Check2:=TCheckBox.Create(Page)
Check2.Left:=2
Check2.Top:=16
Check2.Checked:=True
Check2.Parent:=ListBox
Label1:=TLabel.Create(Page)
Label1.Left:=16
Label1.Top:=2
Label1.Caption:='Компонент 1'
Label1.OnClick:=@Check1OnClick
Label1.OnMouseMove:=@Check1MouseMove
Label1.Parent:=Check1
Label2:=TLabel.Create(Page)
Label2.Left:=16
Label2.Top:=2
Label2.Caption:='Компонент 2'
Label2.OnClick:=@Check2OnClick
Label2.OnMouseMove:=@Check2MouseMove
Label2.Parent:=Check2
end;
то существует ли способ его обойти??? »
Я раньше не обращал на это внимание, но действительно получается очень интересно.
Каким образом это обойти - изменить пути реализации скрипта, т.е. я как понял вы хотите использовать эти переменные в каком-то батнике, если да, то можно создавать батник программно, с помощью SaveStringToFile или SaveStringsToFile и записывать туда уже действительный путь.
ADremLIN
20-12-2009, 21:40
Serega,
Пример с батником - всего лишь для иллюстрации проблемы...
Настоящая задача - Установить Apache Http Server при помощи инсталлятора, созданного в Inno Setup'е. Зарегистрировать в качестве службы Windows, и запустить его по выбору пользователя по окончании инсталляции.
В качестве одного из дополнительных плагинов к Апачу - mod_wsgi (работает с программами написанными на языке Питон), который требует наличия в %PATH% пути к установленному в системе Питону, а конкретней - к python25.dll, или эта либа должна лежать рядом с httpd.exe.
По ряду причин - второе невозможно. Остается первое - дать понять демону апача где искать нужные библиотеки...
С помощью ChangesEnvironment=yes внутреннее, для инсталлятора, системное окружение, а в часности пути поиска - почему-то не обновляются. Если я правильно понимаю, все порожаемые инсталлятором процессы наследуют его системное окружение, и поэтому запускаются в старом, не обновленном системном окружении, со всеми вытекающими отсюда последствиями...
В моем случае при завершении работы инсталлятора апач не стартует, так как его модуль mod_wsgi не находит, свежеустановленную, но лежащую в другой папке python25.dll, хотя пути до нее в системе уже обновились. (что я надеюсь наглядно проиллюстрировал в примере выше).
Казалось бы все вышесказанное - СТРАШНЫЙ БАГ Inno Setup'а, который не позволяет решить поставленную задачу!!!
Но... Слава Великому и Ужасному ГУГЛЮ!!! Нашелся способ обойти проблему...
Воспользовавшись вот этим: Уважаемый тов. MK сообщил 21-02-2001 в 02:58 (http://www.delphikingdom.com/asp/answer.asp?IDAnswer=5587), мне удалось запустить апача со всеми нужными ему и его модулям библиотеками, вне зависимости от системной переменной %PATH%.
... если исполняемый файл и используемые им библиотеки находятся в различных каталогах, то в раздел HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths нужно добавить ключ, соответствующий имени Вашей программы без пути, например BUZZER.EXE, и в этот ключ добавить:
1. значение по умолчанию, соответствующее полному имени файла (с путем)
2. строковый параметр Path, определяющий каталоги с файлами в формате задания переменной Path в autoexec.bat
Теперь при запуске программы значение Path будет добавлено к системной переменной Path ...
Каюсь, что до этого я не знал об этой возможности в Windows :(
Итак пример, показывающий решение проблемы, подобной моей :
[Registry]
Root: HKLM; Subkey: "Software\Microsoft\Windows\CurrentVersion\App Paths\python.exe"; ValueType: string; ValueData: "{app}\python.exe"; Flags: uninsdeletekey
Root: HKLM; Subkey: "Software\Microsoft\Windows\CurrentVersion\App Paths\python.exe"; ValueType: string; ValueName: "Path"; ValueData: "{app}\python"; Flags: uninsdeletekey
[Run]
Filename: "python.exe"; WorkingDir: "{app}"; Description: Start {#MyAppName}; Components: a; Flags: shellexec postinstall waituntilterminated
Здесь python.exe лежит в {app}, а нужная ему либа в {app}\python
* При запуске вашей программы из секции [Run], флаг shellexec - включать обязательно! (без него не работает).
* Если запуск приложения происходит из секции [_Code] - обязательно используйте функцию shellexec('Open', ...).
Надеюсь мои изыскания будут полезны кому-нибудь ещё, ведь "умные люди" должны учиться на чужих ошибках...
Всем удачных инсталлов!
Сергей.
Как соеденить мой скрипт с архивом The Club.arc чтобы распаковалось и чтобы было врямя до завершения установки? Помогите! Я сам начал делать но у меня всегда ошибки вылетатю.
скрипт прикрепил
Скрипт а-ля BlackSelf от YURSHAT
Dark Engel
21-12-2009, 11:55
К сожалению никто по моему вопросику не ответил :( посему копаю сам. Нарыл такую функцию function WizardSilent: Boolean;
Решил попробовать таким образом:
//проверка на установленность и версию.
function DetectInstall(ProgName: string; ver: Integer): Boolean;
var
Names: TArrayOfString;
ResultDWord: Cardinal;
i: Integer;
msg: string;
begin
Result:= True;
if RegGetValueNames(HKEY_LOCAL_MACHINE, 'Software\***\***', Names) then
begin
for i:= 0 to GetArrayLength(Names)-1 do
if Lowercase(ProgName) = Lowercase(Names) then
begin
RegQueryDWordValue(HKEY_LOCAL_MACHINE, 'Software\***\***', Names[i], ResultDWord);
if ResultDWord > ver then
[I]begin
if WizardSilent then
Result:= False
else
msg:= 'Установленная версия *** новее.';
Result:= False;
MsgBox(msg, mbError, MB_OK);
end
else
if ResultDWord = ver then
begin
Result:= True;
end;
Break;
end;
end;
//Запись версии устанавливаемой программы.
RegWriteDWordValue(HKEY_LOCAL_MACHINE, 'Software\***\***', '***', 3);
end;
По логике если инсталяция silent то просто Result:= False а если обычная то
msg:= 'Установленная версия *** новее.';
Result:= False;
MsgBox(msg, mbError, MB_OK);
Но почему то в silent появляется пустое окошечко с кнопкой OK.
Вопрос снимается, решил сам. Если кому нужно прикладываю готовый код
//проверка на установленность и версию.
function DetectInstall(ProgName: string; ver: Integer): Boolean;
var
Names: TArrayOfString;
ResultDWord: Cardinal;
i: Integer;
msg: string;
begin
Result:= True;
if RegGetValueNames(HKEY_LOCAL_MACHINE, 'Software\***\***', Names) then
begin
for i:= 0 to GetArrayLength(Names)-1 do
if Lowercase(ProgName) = Lowercase(Names) then
begin
RegQueryDWordValue(HKEY_LOCAL_MACHINE, 'Software\***\***', Names[i], ResultDWord);
if ResultDWord > ver then
[I]begin
if not WizardSilent then
Begin
msg:= 'Установленная версия *** новее.';
Result:= False;
MsgBox(msg, mbError, MB_OK);
end
else
Result:= False
end
else
if ResultDWord = ver then
begin
Result:= True;
end;
Break;
end;
end;
//Запись версии устанавливаемой программы.
RegWriteDWordValue(HKEY_LOCAL_MACHINE, 'Software\***\***', '***', 3);
end;
Скрипт InnoSetup для распаковки архивов FreeArc (http://freearc.org/download/InnoSetup/FreeArc4InnoSetup3_5.zip)
Версия 3.5 от 21-12-2009
- поддержка опций -ap/-ld/-cfg в FreeArcExtract()
- ускорена распаковка при большом количестве wav-файлов (метод TTA)
- можно передавать NULL в качестве первого параметра (callback) в FreeArcExtract()
- исправлена ошибка: обрабатывались опции после '--'
МИШАНЧИК
22-12-2009, 01:41
YURSHAT, ЛС посмотрите пожалуйста.
Скачал новый скрипт распаковки, откомпилировал, начал проверять, и заметил что все архивы распаковываются в папку archives
Как исправить такую проблему?
Всем доброго времени суток. У меня немного запутанная проблема. Есть исска, все хорошо работает, но надо добавить 2 функции, это установка домашней страницы и сделать поиском по умолчанию. Обе это функции выполняет сторонний exe-файл, но он по умолчанию устанавливает тулбар, т.е.:
procedure CurPageChanged(CurPageID: Integer);
var
ErrorCode: Integer;
FirefoxPath: String;
begin
if CurPageId = wpFinished then
begin
if ToolbarCheck.Checked then
begin
if not ShellExec('open', ExpandConstant('{app}\prog.exe'), '/s -DefaultSearch=FALSE -StartPage=FALSE', '', SW_SHOW, ewNowait, ErrorCode) then
end;
begin
if CurPageId = wpFinished then
begin
if HomeCheck.Checked then
begin
if not ShellExec('open', ExpandConstant('{app}\prog.exe'), '/s -DefaultSearch=FALSE -StartPage=TRUE', '', SW_SHOW, ewNowait, ErrorCode) then
end;
end;
begin
if CurPageId = wpFinished then
begin
if SearchCheck.Checked then
begin
if not ShellExec('open', ExpandConstant('{app}\prog.exe'), '/s -DefaultSearch=TRUE -StartPage=FALSE', '', SW_SHOW, ewNowait, ErrorCode) then
в целом это глупо, ставить 3 программы одновременно, но в стороннем exe-шнике так устроено, что первый чекбокс обязателен, а 2 и 3 отдельно не ставятся. Вопрос, можно как то это обойти или же хотя бы поставить очерёдность, т.к. эта программка ставиться очень быстро, но при одновременной установке бывают тормоза и ошибки (зависит от ОС и железа)
Молодой, в [Files] замени это: Source: {src}\*.arc; DestDir: {app}\ArcFiles; Flags: external dontcopy на это: Source: {src}\*.arc; DestDir: {app}; Flags: external dontcopy
Уже догадался, все равно спасибо за помощь!
Подскажите как убрать слова при распаковке, оставить только то "идет распаковка игровых архивов"
и время с процентами распаковки!??
У меня немного запутанная проблема »
Возможно, что вы не ищите лёгких путей и поэтому для установки дополнений прописываете их в секции [Code]...
Можно же использовать секцию [Run]:
[Run]
Filename: {app}\prog.exe; Parameters: "/s -DefaultSearch=FALSE -StartPage=FALSE"; Description: Установить тулбар; Flags: postinstall skipifsilent skipifdoesntexist
Filename: {app}\prog.exe; Parameters: "/s -DefaultSearch=FALSE -StartPage=TRUE"; Description: Установить домашнюю страницу; Flags: postinstall skipifsilent skipifdoesntexist unchecked
Filename: {app}\prog.exe; Parameters: "/s -DefaultSearch=TRUE -StartPage=FALSE"; Description: Сделать поиском по умолчанию; Flags: postinstall skipifsilent skipifdoesntexist unchecked
поставить очерёдность »
Замените все ewNowait на ewWaitUntilTerminated
Можно же использовать секцию [Run]: »
да, это конечно же все бы упростило, но помимо трёх чекбоксом там ещё две ссылки на лицензии, описание компонентов, рисунок-пример, так что без отдельного окна не обойтись...
Замените все ewNowait на ewWaitUntilTerminated »
почему то не помогло, во время установки процесс повисает=(((
почему то не помогло, во время установки процесс повисает=((( »
При ewWaitUntilTerminated инсталл становится некликабельным, как бы зависшим, но всё нормально, так и должно быть :)
так и должно быть »
я отличаю некликабельность от зависания процесса, итог такой установки, из 3-х процедур выполнилась только первая...
я отличаю некликабельность от зависания процесса, итог такой установки, из 3-х процедур выполнилась только первая... »
Следовательно у вас где-то ошибка и процесс зависает, а команда ewWaitUntilTerminated, заставляет инсталлятор ждать завершения этого процесса. Итог - зависание самого инсталлятора.
где-то ошибка »
а примерно в чём она может заключаться, если при ewNowait относительно нормально ставиться?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC