Войти

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


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

Noname22
30-07-2013, 05:17
Сам адрес-то и прописан в CompileCode.bin»Люди умудряются от туда пароли вытаскивать:удалось извлечь файл CompiledCode.bin, в котором можно посмотреть пароль. »

mat_y@vk
30-07-2013, 09:13
Господа!
А есть ли возможность проверять перед установкой правильность выбора папки установки (когда файлы накатываются на установленную программу)?
Например, проверять в папке установки наличие какого либо файла?

alex barmalei
30-07-2013, 09:33
saurn, Excludes помог, благодарствую.

Noname22
30-07-2013, 09:50
Например, проверять в папке установки наличие какого либо файла? »
[Code]
var Flag: boolean;
function InitializeSetup: Boolean;
begin
Flag:= True;
Result:=true;
if not FileExists(ExpandConstant('{pf}')+'\My Program\MyProg.exe')
then
begin
MsgBox('На вашей системе не обнаружена My Program! Сначала установите My Program, затем начните установку заново.', mbInformation, MB_OK);
Flag:= False;
Result:=false;
end;
end;

mat_y@vk
30-07-2013, 11:44
Noname22, вставил вот так:
var Flag: boolean;
function InitializeSetup: Boolean;
begin
Flag:= True;
Result:=true;
if not FileExists(ExpandConstant('{app}')+'\res\resources.xml')
then
begin
MsgBox('На вашей системе не обнаружена My Program! Сначала установите My Program, затем начните установку заново.', mbInformation, MB_OK);
Flag:= False;
Result:=false;
end;
end;

Получаю ошибку
http://s018.radikal.ru/i503/1307/79/3b10fd82e093.png

пробовал разные имена файлов и разные папки... что ему не нравится в app???

Mailchik
30-07-2013, 11:57
mat_y@vk, константа {app} действительна после страницы SelectDir. На этапе инициализации она не известна, вот и ошибка.

alex barmalei
30-07-2013, 11:58
Подскажите, как называются эти линии, чтобы можно было к ним обратится через WizardForm?
Хочу у них цвет поменять.
http://storage3.static.itmages.ru/i/13/0730/h_1375170928_6640871_a6d321c44c.jpg

nik1967
30-07-2013, 12:00
mat_y@vk, пишет, что пытаетесь применить константу "app" прежде, чем она была инициализирована. По русски - пытаешься применить константу "app" до того, как инсталлятор её получит. Это делается на SelectDirPage в function NextButtonClick(CurPageID: Integer): Boolean;

mifkys
30-07-2013, 12:02
Цитата mifkys:
Можно ли во время установки после каждой записи в блоке [Run] выводить окно о запросе на продолжение установки, чтобы пользователь сам нажимал "Далее" »
mifkys, можно. Вопрос в том, что делать, если пользователь не захочет продолжать. В таком случае прервать работу установщика не удасться. »
Добрый день. Все-таки нужно отменить установку в случае, если пользователь нажмет "Отмена". Это как-то можно реализовать?

В секции [Run] у меня по очереди запускаются приложения, но на 4 файле мне нужно вывести окно, которое остановит продолжение установки до тех пор, пока пользователь не нажмет "ОК". Если же он нажмет "Отмена", то установка должна быть отменена. Сам инсталлятор работает с флагом Uninstallable=no, т.е. в portable режиме, поэтому прерывание установки мне не страшно. Окно я вывел через процедуру BeforeInstall на нужном файле, но
CancelWithoutPrompt := true;
WizardForm.Close;
не помогает. Что можно придумать? Не уже ли придется все описывать в секции [Code]?

nik1967
30-07-2013, 12:05
alex barmalei, они называются Bevel и Bevel1, и у них есть только свойства Shape: и Style:. Свойства Color у них нет.

alex barmalei
30-07-2013, 12:19
nik1967, ну хоть что-то, спасибо.

mat_y@vk
30-07-2013, 12:40
nik1967, а мmat_y@vk, пишет, что пытаетесь применить константу "app" прежде, чем она была инициализирована. По русски - пытаешься применить константу "app" до того, как инсталлятор её получит. Это делается на SelectDirPage в function NextButtonClick(CurPageID: Integer): Boolean; »
А можно это показать как пишется правильно?

Я вот что-то не пойму... в какое место в таком виде это надо вставить


///////////////////////////////////////Изоображения///////////////////////////////////////////////
procedure InitializeWizard1();
begin
ExtractTemporaryFile('{#FinishImage}');

WizardForm.WizardBitmapImage.Width:= ScaleX(497);
WizardForm.WizardBitmapImage2.Width:= ScaleX(497);
WizardForm.WizardBitmapImage2.Bitmap.LoadFromFile(ExpandConstant('{tmp}\{#FinishImage}'));

WelcomeLabel:= TLabel.Create(WizardForm);
WelcomeLabel.AutoSize:= False;
with WizardForm.WelcomeLabel2 do
WelcomeLabel.SetBounds(Left-70, Top-30, Width, Height);
WelcomeLabel.Alignment := taCenter;
WelcomeLabel.Font:= WizardForm.WelcomeLabel2.Font
WelcomeLabel.Font.Color:= clWhite;
WelcomeLabel.Font.Size:=12
WelcomeLabel.Transparent:= True;
WelcomeLabel.WordWrap:= true;
WelcomeLabel.Caption:= ExpandConstant('{cm:WelcomeLabel}');
WelcomeLabel.Parent:= WizardForm.WelcomePage
WelcomeLabel.Font.Style:=[fsBold];

FinishedLabel:= TLabel.Create(WizardForm);
FinishedLabel.AutoSize:= False;
with WizardForm.FinishedLabel do
FinishedLabel.SetBounds(Left-70, Top+70, Width, Height);
FinishedLabel.Font:= WizardForm.FinishedLabel.Font
FinishedLabel.Font.Color:= clWhite;
FinishedLabel.Transparent:= True;
FinishedLabel.WordWrap:= true;
FinishedLabel.Caption:=ExpandConstant('{cm:FinishLabel}');
FinishedLabel.Parent:= WizardForm.FinishedPage
FinishedLabel.Font.Style:=[fsBold];
FinishedLabel.Alignment := taCenter;
FinishedLabel.Font.Size:=10;

WizardForm.WelcomeLabel1.Hide;
WizardForm.WelcomeLabel2.Hide;
WizardForm.FinishedLabel.Hide;
WizardForm.FinishedHeadingLabel.Hide;
end;

/////////////////////////////////

procedure InitializeWizard2();
begin
WizardForm.MainPanel.Height:=150;
WizardForm.WizardSmallBitmapImage.SetBounds(ScaleX(0), ScaleY(0), WizardForm.MainPanel.Width, WizardForm.MainPanel.Height);

PageNameLabel:= TLabel.Create(WizardForm)
with WizardForm.PageNameLabel do
PageNameLabel.SetBounds(Left, Top+50, Width, Height);
PageNameLabel.Transparent:= True;
PageNameLabel.Font:= WizardForm.PageNameLabel.Font;
PageNameLabel.Font.Color:= clWhite; //цвет надписи
PageNameLabel.Parent:= WizardForm.MainPanel;

WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;

///////////////////////////////////////Изоображения///////////////////////////////////////////////

WizardForm.ComponentsList.Color:=WizardForm.SelectDirPage.Color
WizardForm.BackButton.Left:=0;
WizardForm.NextButton.Left:=WizardForm.CancelButton.Left+10;
WizardForm.NextButton.Top:=WizardForm.Bevel.Top+5;
WizardForm.NextButton.Height:=40;
WizardForm.BackButton.Top:=WizardForm.Bevel.Top+5;
WizardForm.BackButton.Height:=40;
WizardForm.SelectDirBrowseLabel.Hide;
WizardForm.CancelButton.Height:=40;
WizardForm.CancelButton.Top:=WizardForm.Bevel.Top+5;
WizardForm.CancelButton.Left:=WizardForm.CancelButton.Left+10;
WizardForm.CancelButton.Hide;
WizardForm.SelectDirBitmapImage.Hide
WizardForm.SelectGroupBitmapImage.Hide
WizardForm.SelectDirLabel.Left:=WizardForm.SelectDirBitmapImage.Left
WizardForm.SelectDirLabel.Top:=100
WizardForm.DirEdit.Top:=140
WizardForm.DirBrowseButton.Top:=140
WizardForm.GroupEdit.Top:=140
WizardForm.GroupBrowseButton.Top:=140
WizardForm.SelectComponentsLabel.Hide;
WizardForm.ComponentsDiskSpaceLabel.Hide;
WizardForm.SelectStartMenuFolderBrowseLabel.Hide;
WizardForm.SelectStartMenuFolderLabel.Left:=WizardForm.SelectDirBitmapImage.Left;
WizardForm.SelectStartMenuFolderLabel.Top:=100;
WizardForm.SelectTasksLabel.Hide;
WizardForm.ComponentsList.Top:=100;
WizardForm.ComponentsList.Height:=120;
WizardForm.TasksList.Top:=100;
WizardForm.TasksList.Height:=120;
WizardForm.LicenseMemo.Height:=110;
WizardForm.LicenseMemo.Top:=85;
WizardForm.StatusLabel.Top:=100;
end;

///////////////////////////////////////ISDone////////////////////////
procedure CancelButtonOnClick(Sender: TObject);
begin
SuspendProc;
if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then ISDoneCancel:=1;
ResumeProc;
end;

procedure HideControls;
begin
WizardForm.FileNamelabel.Hide;
ISDoneProgressBar1.Hide;
LabelPct1.Hide;
LabelTime1.Hide;
LabelTime2.Hide;
MyCancelButton.Hide;
end;

procedure CreateControls;
var PBTop:integer;
begin
PBTop:=ScaleY(50);
ISDoneProgressBar1 := TNewProgressBar.Create(WizardForm);
with ISDoneProgressBar1 do begin
Parent := WizardForm;
Height := WizardForm.CancelButton.Height-10
Left := ScaleX(0);
Top := WizardForm.BackButton.Top+5;
Width := ScaleX(405);
Max := 1000;
end;
LabelPct1 := TLabel.Create(WizardForm);
with LabelPct1 do begin
Parent := ISDoneProgressBar1;
AutoSize := True;
Left := 10;
Top := 3;
Font.Size := 14;
Width := ScaleX(80);
Transparent:=True;
end;
LabelTime1 := TLabel.Create(WizardForm);
with LabelTime1 do begin
Parent := WizardForm.InstallingPage;
AutoSize := False;
Width := ISDoneProgressBar1.Width div 2;
Left := ScaleX(0);
Top := 200;
end;
LabelTime2 := TLabel.Create(WizardForm);
with LabelTime2 do begin
Parent := WizardForm.InstallingPage;
AutoSize := False;
Width := LabelTime1.Width+ScaleX(40);
Left := ISDoneProgressBar1.Width div 2;
Top := LabelTime1.Top;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var Comps1,Comps2,Comps3, TmpValue:cardinal;
FindHandle1,ColFiles1,CurIndex1,tmp:integer;
ExecError:boolean;
InFilePath,OutFilePath,OutFileName:PAnsiChar;
begin
if CurStep = ssInstall then begin //Если необходимо, можно поменять на ssPostInstall
WizardForm.ProgressGauge.Height:=30;
WizardForm.ProgressGauge.Top:=150;
WizardForm.CancelButton.Hide;
CreateControls;
WizardForm.StatusLabel.Caption:=ExpandConstant('{cm:Extracted}');
ISDoneCancel:=0;

// Распаковка всех необходимых файлов в папку {tmp}.


ISDoneError:=true;

HideControls;
WizardForm.CancelButton.Visible:=true;
WizardForm.CancelButton.Enabled:=false;
// BtnPanel.Show;
end;
if (CurStep=ssPostInstall) and ISDoneError then begin
Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', false);
end;
end;
/////////////////////////////////////////////ISDone/////////////////////







procedure InitializeWizard();
begin
MyCancelButton:=TNewButton.Create(WizardForm);
with MyCancelButton do begin
Parent:=WizardForm;
Width:=WizardForm.CancelButton.Width;
Caption:='Отмена';
Left:=WizardForm.CancelButton.Left+10;
Height:=40;
Top:=WizardForm.Bevel.Top+5;
OnClick:=@CancelButtonOnClick;
// Необходимо добавлять каждую кнопку расположенную на стекле
// до инициализации стекла для того что бы не было дыр ))
iswin7_add_button(WizardForm.BackButton.Handle);
iswin7_add_button(WizardForm.NextButton.Handle);
iswin7_add_button(WizardForm.CancelButton.Handle);
iswin7_add_button(MyCancelButton.Handle);
// Параметр True не трогать он для htuos ))
iswin7_add_glass(WizardForm.Handle, 0, 0, 0, 47, True);
end;
InitializeWizard1();
InitializeWizard2();

#ifdef ComponentsInfo
InitializeWizard4();
#endif
end;

Procedure CurPageChanged(CurPageID: Integer);
Begin
#ifdef CancelOnWelcome
if CurPageID = wpWelcome then
begin
WizardForm.CancelButton.Left:=0;
end;
if CurPageID = wpsELECTdIR then
begin
WizardForm.CancelButton.Left:=WizardForm.NextButton.Left;
end;
#endif
if CurPageID = wpSelectTasks then
begin
WizardForm.NextButton.Caption:='Установить';
end;
// if CurPageID = wpInstalling then
// begin
// BtnPanel.Hide;
//end;
MyCancelButton.Hide;
if CurPageID = wpInstalling then
begin
MyCancelButton.Show;
end;

saurn
30-07-2013, 13:59
mat_y@vk
function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := True;

case CurPageID of
wpSelectDir:
begin
Result := FileExists(ExpandConstant('{app}\res\resources.xml');
if not Result then MsgBoxEx(WizardForm.Handle, 'Ошибка! Приложение' + #32 + ExpandConstant('{#SetupSetting("AppName")}') + #32 + 'не найдено на данном компьютере', 'Ошибка', MB_OK or MB_ICONWARNING, 0, 0);
end;
end;
end;

alex barmalei
30-07-2013, 14:09
Классный форум :)
Как форсировать создание иконки на рабочем столе и пропустить страницу дополнительных задач?

[Tasks] У меня пустой.


[Icons]
Name: "{commondesktop}\program"; Filename: "{app}\myapp.exe";

И второе: Можно ли добавить на страницу выбора директории отображение свободного места?

mat_y@vk
30-07-2013, 14:19
Как форсировать создание иконки на рабочем столе и пропустить страницу дополнительных задач? »
Name: {userdesktop}\Имя иконки; IconFilename: {app}\ProgName.exe; Filename: {app}\ProgName.exe; Flags: createonlyiffileexists; Check: CheckError

saurn, низкий поклон Вам. Работает!

alex barmalei
30-07-2013, 14:32
mat_y@vk, я наврал, Tasks не был пустой и в нем было прописано создание иконки. :)
Все работает.

mat_y@vk
30-07-2013, 14:40
----------------------------
Одной проблемой меньше, но появился новый вопрос:

Я нашел ключ на Unninstal к установленной игре в реестре, вот он:

AppId={{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}

На всех моих компах (везде Вин 7 х32 и х64) по этому AppId установщик находит верный путь... но некоторые люди жалуются, что он сам не находит путь... есть ли способ еще как-то искать путь к программе установленной уже? Может по имени exe'шника или еще чего в реестре поискать? Или скрипт какой...

Noname22
30-07-2013, 15:28
есть ли способ еще как-то искать путь к программе установленной уже? »
например в секцию [Setup]

Через информацию деинсталляции
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("Введите_сюда_AppID")}_is1,InstallLocation|{pf}\My Program}
Только учтите, Inno создаёт AppId такого рода {AppId}_is1, так же может быть название приложения вместо AppId, другие программы могут создавать так {AppId}, а могут без AppId, вместо него название приложения.

И одного AppId мало, в информации деинсталляции например может быть прописан и путь к приложению, например InstallLocation. Если же имеется вообще, поскольку может быть и не прописан.

[hr]

Через информацию установленного приложения, например по \SOFTWARE\Ваша_программа

это общаяHKLM\SOFTWARE\Ваша_программа

это пользовательскаяHKCU\SOFTWARE\Ваша_программа

AppName=My Program
AppVersion=1.5
DefaultDirName={reg:HKLM\SOFTWARE\KLCodecPack,installdir|{pf}\My Program}

Johny777
30-07-2013, 15:42
mat_y@vk, Немного теории. Установка как таковая состоит из 2 действий:
1. Копирование чего надо куда надо
2. Создание ключа в реестре и внос туда стандартных подключей. Нпример раздел HKEY_CURRENT_USER,
ключ 'Software\Microsoft\Windows\CurrentVersion\Uninstall\Твой_апп_айди';

Имена подключей неизменяемы и заложены майкрософтом. Вот тут стандартные имена, но не все http://msdn.microsoft.com/en-us/library/windows/desktop/aa372105%28v=vs.85%29.aspx Нет например DisplayIcon
По этим значениям этих подключей заполняется инфа в списке "программы и компонеты". Как минимум нужны UninstallString и DisplayName чтоб твоя программа появилась в списке.

Для удаления программы достаточно удалить ключ 'Software\Microsoft\Windows\CurrentVersion\Uninstall\Твой_апп_айди';

Ты наверное уже понял что единственный путь к экзешнику, который всегда лежит в реестре = путь к программе удаления.
Да ты можешь внести другие ключи со своими значениями, но это зависит от автора инсталла и полагаться на это нельзя.
Искать по DisplayName тоже не получится. Кто-то может назвать игру "Super World of Tanks". Да здесь мы видим ещё и "World of Tanks" в названии. А что если она будет называться так "WoTv1.1.0"? Короче тоже не вариант
Искать экзешник на компе не проблема - так ты найдёшь путь. Только вот искать придётся по всему компу а это может быть очень долго, ведь нельзя полагаться что игра стоит в Program Files

Вывод если у пользователя стоит не твоя версия игры или не официальная, короче не апп ай-ди из твоего поста то пусть он сам укажет путь, а если твой апп ай-ди, то никаких проблем

mat_y@vk
30-07-2013, 15:58
Johny777, Noname22, ясно.
А этот AppId не зависит от установленной винды? Ну типа на ХР он отличается от AppId на Вин7 или 8.

У меня еще вопрос... как можно добавить свои кнопки на 1 страницу со ссылкой в сеть... обязательно botva.dll? Или есть более простой способ?

У меня просто тут засада какая-то... ни один фаил справки не открывается... точнее открывается, а текста нет... уже все решения сайта MS попробовал... ничего (Win 7 x86 ultra)




© OSzone.net 2001-2012