PDA

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


Страниц : 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

Молодой
20-12-2009, 12:48
Freearc архиватор=)

Pilotfcsm
20-12-2009, 14:03
Здравствуйте. Поиском не нашел того что нужно, поэтому вопрос:
Можно ли сделать так чтобы после установки программы, появлялось окно, в котором было несколько определенных пунктов, и возможность выбора одного из них. При выборе какого либо пункта, определенный файл копировался бы из папки скажем {app}\Папка\файл.ini в корневую папку программы?

Если кто встречал рпимер скрипта, поделитесь пожалуйста.

И еще последний вопрос, можно ли сделать чтобы в окне выбора компонентов( какие будут устанавливаться, а какие нет), при наведении на какой либо компонент, рядом появлялась подсказка (комментарий) для этого компонента, в котрой написано пояснение для чего нужен он? Наподобие как в нсис

A1EXXX
20-12-2009, 15:00
Молодой, там и нет такой строчки, это задаётся вручную: 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), там это есть.

YURSHAT
20-12-2009, 15:06
И еще последний вопрос, можно ли сделать чтобы в окне выбора компонентов( какие будут устанавливаться, а какие нет), при наведении на какой либо компонент, рядом появлялась подсказка (комментарий) для этого компонента, в котрой написано пояснение для чего нужен он? Наподобие как в нсис »

[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;

Serega
20-12-2009, 15:37
то существует ли способ его обойти??? »
Я раньше не обращал на это внимание, но действительно получается очень интересно.
Каким образом это обойти - изменить пути реализации скрипта, т.е. я как понял вы хотите использовать эти переменные в каком-то батнике, если да, то можно создавать батник программно, с помощью 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', ...).

Надеюсь мои изыскания будут полезны кому-нибудь ещё, ведь "умные люди" должны учиться на чужих ошибках...

Всем удачных инсталлов!
Сергей.

AH4OyC
20-12-2009, 22:46
Как соеденить мой скрипт с архивом 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;

YURSHAT
21-12-2009, 17:07
Скрипт 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, ЛС посмотрите пожалуйста.

Молодой
22-12-2009, 13:16
Скачал новый скрипт распаковки, откомпилировал, начал проверять, и заметил что все архивы распаковываются в папку archives
Как исправить такую проблему?

Cranz86
22-12-2009, 13:37
Всем доброго времени суток. У меня немного запутанная проблема. Есть исска, все хорошо работает, но надо добавить 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 отдельно не ставятся. Вопрос, можно как то это обойти или же хотя бы поставить очерёдность, т.к. эта программка ставиться очень быстро, но при одновременной установке бывают тормоза и ошибки (зависит от ОС и железа)

A1EXXX
22-12-2009, 14:32
Молодой, в [Files] замени это: Source: {src}\*.arc; DestDir: {app}\ArcFiles; Flags: external dontcopy на это: Source: {src}\*.arc; DestDir: {app}; Flags: external dontcopy

Молодой
22-12-2009, 14:39
Уже догадался, все равно спасибо за помощь!

Подскажите как убрать слова при распаковке, оставить только то "идет распаковка игровых архивов"
и время с процентами распаковки!??

Serega
22-12-2009, 14:55
У меня немного запутанная проблема »
Возможно, что вы не ищите лёгких путей и поэтому для установки дополнений прописываете их в секции [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

Cranz86
22-12-2009, 15:48
Можно же использовать секцию [Run]: »
да, это конечно же все бы упростило, но помимо трёх чекбоксом там ещё две ссылки на лицензии, описание компонентов, рисунок-пример, так что без отдельного окна не обойтись...
Замените все ewNowait на ewWaitUntilTerminated »
почему то не помогло, во время установки процесс повисает=(((

A1EXXX
22-12-2009, 17:13
почему то не помогло, во время установки процесс повисает=((( »
При ewWaitUntilTerminated инсталл становится некликабельным, как бы зависшим, но всё нормально, так и должно быть :)

Cranz86
22-12-2009, 17:44
так и должно быть »
я отличаю некликабельность от зависания процесса, итог такой установки, из 3-х процедур выполнилась только первая...

Serega
22-12-2009, 18:29
я отличаю некликабельность от зависания процесса, итог такой установки, из 3-х процедур выполнилась только первая... »
Следовательно у вас где-то ошибка и процесс зависает, а команда ewWaitUntilTerminated, заставляет инсталлятор ждать завершения этого процесса. Итог - зависание самого инсталлятора.

Cranz86
22-12-2009, 19:00
где-то ошибка »
а примерно в чём она может заключаться, если при ewNowait относительно нормально ставиться?




© OSzone.net 2001-2012