Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 6]
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
mat_y@vk, пишет, что пытаетесь применить константу "app" прежде, чем она была инициализирована. По русски - пытаешься применить константу "app" до того, как инсталлятор её получит. Это делается на SelectDirPage в function NextButtonClick(CurPageID: Integer): Boolean;
Цитата mifkys:
Можно ли во время установки после каждой записи в блоке [Run] выводить окно о запросе на продолжение установки, чтобы пользователь сам нажимал "Далее" »
mifkys, можно. Вопрос в том, что делать, если пользователь не захочет продолжать. В таком случае прервать работу установщика не удасться. »
Добрый день. Все-таки нужно отменить установку в случае, если пользователь нажмет "Отмена". Это как-то можно реализовать?
В секции [Run] у меня по очереди запускаются приложения, но на 4 файле мне нужно вывести окно, которое остановит продолжение установки до тех пор, пока пользователь не нажмет "ОК". Если же он нажмет "Отмена", то установка должна быть отменена. Сам инсталлятор работает с флагом Uninstallable=no, т.е. в portable режиме, поэтому прерывание установки мне не страшно. Окно я вывел через процедуру BeforeInstall на нужном файле, но
CancelWithoutPrompt := true;
WizardForm.Close;
не помогает. Что можно придумать? Не уже ли придется все описывать в секции [Code]?
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;
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.