Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 9]
El Sanchez
17-02-2022, 11:25
Появилась необходимость скачивать архив, распаковывать и устанавливать. Inno Setup версия 6.2.0 »
#define MyAppName "bla"
#define MyAppVersion "1.0.0"
#define MyAppPublisher "bla"
#define MyAppURL "https://www.bla.com/"
#define MyAppExeName "bla.exe"
[Setup]
AppId={{9B58D044-A076-47B2-B426-FC6CA298390A}}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
AllowCancelDuringInstall=no
DefaultDirName={autopf}\{#MyAppName}
; bla-portable.zip extracted size
ExtraDiskSpaceRequired=8293003
WizardStyle=classic
[Languages]
Name: ru; MessagesFile: compiler:Languages\russian.isl
[Messages]
SetupWindowTitle={#MyAppName}
[Files]
Source: 7za.exe; DestDir: {tmp}; Flags: deleteafterinstall
[Run]
Filename: {tmp}\7za.exe; Parameters: "x ""{tmp}\bla-portable.zip"" -o""{app}\"" * -r -aoa"; Flags: runhidden runascurrentuser;
Filename: {app}\{#MyAppExeName}; Description: {cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}; Flags: nowait postinstall skipifdoesntexist
[Code]
function ShellExecute(hwnd: HWND; const lpOperation, lpFile, lpParameters, lpDirectory: string;
nShowCmd: Integer): THandle; external 'ShellExecuteW@shell32.dll stdcall';
var
DownloadPage: TDownloadWizardPage;
procedure ModifyWizardForm;
begin
WizardForm.MainPanel.Hide;
WizardForm.Bevel.Hide;
WizardForm.Bevel1.Hide;
WizardForm.Width := ScaleX(640);
WizardForm.Height := ScaleY(270);
DownloadPage := CreateDownloadPage(SetupMessage(msgWizardPreparing), SetupMessage(msgPreparingDesc), nil);
end;
function InitializeSetup: Boolean;
begin
Result := WizardSilent;
if not Result then
ShellExecute(0, 'open', ExpandConstant('{srcexe}'), '/SILENT', '', SW_SHOWNORMAL);
end;
procedure InitializeWizard;
begin
ModifyWizardForm;
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
case CurStep of
ssInstall:
begin
DownloadPage.Clear;
DownloadPage.Add('https://github.com/jrsoftware/issrc/archive/refs/heads/main.zip', 'bla-portable.zip', '');
DownloadPage.Show;
try
DownloadPage.Download;
except
if DownloadPage.AbortedByUser then
SuppressibleMsgBox(AddPeriod(GetExceptionMessage), mbCriticalError, MB_OK, IDOK);
finally
DownloadPage.Hide;
end;
end;
end;
end;
»
У нас есть уже скрипт по работе с нативным загрузчиком от Inno Setup (который появился с 6.1.2 версии)
#define MyAppName "bla"
#define MyAppVersion "1.0.0"
#define MyAppPublisher "2PPL Interactive"
#define MyAppURL "https://www.bla.com/"
#define MyAppExeName "bla.exe"
[Setup]
; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
;SignTool=signtools $f
AppId={{9B58D044-A076-47B2-B426-FC6CA298390A}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={autopf}\{#MyAppName}
DisableProgramGroupPage=yes
PrivilegesRequired=lowest
PrivilegesRequiredOverridesAllowed=commandline
OutputDir=C:\bla\App Installer
OutputBaseFilename=bla-setup
SetupIconFile=C:\bla\App Installer\installerIcon.ico
Compression=zip
SolidCompression=yes
WizardStyle=classic
AllowCancelDuringInstall=no
WindowResizable=no
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
[Files]
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
Source: "C:\bla\App Installer\bla-portable\7za.exe"; DestDir: {tmp}; Flags: deleteafterinstall
[Icons]
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
[Run]
Filename: "{tmp}\7za.exe"; Check: ShouldRun; Parameters: "x ""{tmp}\bla-portable.zip"" -r -aoa -o""{app}"" *"; Flags: runhidden runascurrentuser;
Filename: "{app}\{#MyAppExeName}"; Check: ShouldRun; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall;
[Messages]
SetupWindowTitle={#MyAppName} {#MyAppVersion}
[Code]
//----------------------
//Silent Mode
#ifdef UNICODE
#define AW "W"
#else
#define AW "A"
#endif
type HINSTANCE = THandle;
function ShellExecute(hwnd: HWND; lpOperation: string; lpFile: string;
lpParameters: string; lpDirectory: string; nShowCmd: Integer): HINSTANCE;
external 'ShellExecute{#AW}@shell32.dll stdcall';
function InitializeSetup: Boolean;
begin
// if this instance of the setup is not silent which is by running
// setup binary without /SILENT parameter, stop the initialization
Result := WizardSilent;
// if this instance is not silent, then...
if not Result then
begin
// re-run the setup with /SILENT parameter; because executing of
// the setup loader is not possible with ShellExec function, we
// need to use a WinAPI workaround
if ShellExecute(0, '', ExpandConstant('{srcexe}'), '/SILENT', '',
SW_SHOW) <= 32
then
// if re-running this setup to silent mode failed, let's allow
// this non-silent setup to be run
Result := True;
end;
end;
//----------------------
//Native Download
var DownloadPage: TDownloadWizardPage;
function OnDownloadProgress(const Url, Filename: string; const Progress, ProgressMax: Int64): Boolean;
begin
DownloadPage.Msg2Label.Visible := False;
if ProgressMax <> 0 then begin
//Log(Format(' %d of %d bytes done.', [Progress, ProgressMax]))
end
else
Log(Format('Successfully downloaded file to {tmp}: %s', [FileName]));
Result := True;
end;
var DownloadShowed: Boolean;
var DownloadErrored: Boolean;
function ShouldRun: Boolean;
begin
Result := not(DownloadErrored);
end;
procedure CurPageChanged(CurPageID: Integer);
begin
WizardForm.Bevel1.Visible := false;
WizardForm.MainPanel.Visible := false;
WizardForm.InnerNotebook.Top := 50;
WizardForm.OuterNotebook.height := 400;
if CurPageID = wpInstalling then begin
if DownloadShowed = False then begin
DownloadPage.Clear();
DownloadPage.Show();
end;
end;
if CurPageID = DownloadPage.ID then begin
if DownloadShowed = False then begin
DownloadShowed := True
DownloadPage.Add('https://api.bla.com/download/bla-portable.zip', 'bla-portable.zip', ''); DownloadPage.Msg1Label.Font.Color := $8D7C72;
DownloadPage.Msg1Label.Top := DownloadPage.Msg1Label.Top - 5;
DownloadPage.ProgressBar.Top := DownloadPage.ProgressBar.Top - 65;
DownloadPage.SetText('Installing...','');
DownloadPage.Msg2Label.Visible := False;
DownloadPage.Msg2Label.Top := 400;
end;
try
DownloadPage.Download();
except
SuppressibleMsgBox(AddPeriod(GetExceptionMessage), mbCriticalError, MB_OK, IDOK);
DownloadErrored := True;
WizardForm.Close;
finally
DownloadPage.Hide();
end;
end;
end;
//----------------------
//Init window and style
procedure InitializeWizard();
begin
WizardForm.ProgressGauge.Top := WizardForm.ProgressGauge.Top + 10;
WizardForm.ProgressGauge.Visible := True;
WizardForm.PageNameLabel.Height := 0;
WizardForm.PageDescriptionLabel.Height := 0;
WizardForm.StatusLabel.Visible := True;
WizardForm.Bevel.Visible := False;
WizardForm.CancelButton.Height := 0;
WizardForm.Bevel1.Visible := False;
WizardForm.WizardSmallBitmapImage.Visible := False;
WizardForm.MainPanel.Color := WizardForm.Color;
WizardForm.InnerPage.Color := WizardForm.Color;
WizardForm.TasksList.Color := WizardForm.Color;
WizardForm.InstallingPage.Color := WizardForm.Color;
WizardForm.FilenameLabel.Visible := False;
WizardForm.Width := 640;
WizardForm.Height := 270;
DownloadPage := CreateDownloadPage(SetupMessage(msgWizardPreparing), SetupMessage(msgPreparingDesc), @OnDownloadProgress);
end;
procedure CurInstallProgressChanged(CurProgress, MaxProgress: Integer);
begin
WizardForm.StatusLabel.Caption := 'Installing, please wait...';
WizardForm.StatusLabel.Top := -5;
WizardForm.ProgressGauge.Top := 40;
WizardForm.MainPanel.Visible := False;
WizardForm.StatusLabel.Font.Color := $8D7C72;
end;
мы его тестировали и остались недовольны.
Во время загрузки он довольно сильно лагает (тормозит окно)
из плюсов в нём только наличие прогрессбара в таскбаре пока идёт загрузка, но в остальном он довольно корявый. (по крайней мере на текущий момент)
Проверяли мы на 6.2.0
Всё же хочется исправить те 2 кейса для IDP
и использовать именно его (с нашим дизайном)
dracosha
17-02-2022, 16:31
lmiol, всё то, что предлагает господин El Sanchez не имеет ни тормозов, ни глюков. Лучше вежливо попросите его о помощи и этот парень продемонстрирует вам своё мастерство в таком духе, что после увиденного вам ничего не останется как сказать, что этот парень просто волшебник. El Sanchez виртуозно владеет компьютерными языками. Это тот человек, который не копирует код, а пишет его с нуля. Методов написания любого кода существует масса, но не каждый умеет так оптимизированно писать код, как господин El Sanchez.
Vanadiy777
17-02-2022, 19:29
У нас есть уже скрипт по работе с нативным загрузчиком от Inno Setup »
мы его тестировали и остались недовольны. »
из плюсов в нём только наличие прогрессбара в таскбаре пока идёт загрузка, »
Всё же хочется исправить те 2 кейса для IDP »
lmiol, извините, коллега, возможно сейчас влезаю не в свое дело...
Вы простите, но возникает вопрос - Вам "шашечки", или ехать?
Маэстро El Sanchez дал Вам готовое решение по ваш компилятор..., причем, заметьте, абсолютно бесплатно...
P.S. Ни чего личного...
lmiol, всё то, что предлагает господин El Sanchez не имеет ни тормозов, ни глюков. Лучше вежливо попросите его о помощи и этот парень продемонстрирует вам своё мастерство в таком духе, что после увиденного вам ничего не останется как сказать, что этот парень просто волшебник. El Sanchez виртуозно владеет компьютерными языками. Это тот человек, который не копирует код, а пишет его с нуля. Методов написания любого кода существует масса, но не каждый умеет так оптимизированно писать код, как господин El Sanchez. »
lmiol, извините, коллега, возможно сейчас влезаю не в свое дело...
Вы простите, но возникает вопрос - Вам "шашечки", или ехать?
Маэстро El Sanchez дал Вам готовое решение по ваш компилятор..., причем, заметьте, абсолютно бесплатно... »
Кланяться в ноги за то, что я не просил я не собираюсь. Учитывая что у нас этот вариант тоже был и мы его тестировали уже и отклонили. Я по факту вроде бы так и ответил.
У меня в посте указан плагин IDP, конкретный дизайн, конкретная проблема: я просил дополнить наш скрипт исправив проблему по двум кейсам.
Я понимаю, что возможно Маэстро хотел как лучше и переписал на нативку, но факт остаётся фактом: это не то что мы просили.
И не круто тут как чайки налетать на меня и делать вид, что я не благодарный.
А также необязательно зачмокивать друг друга благодарностями на свои остроты.
Конкретно претензий к Маэстро за то, что нативка лагает - нет. Ведь это проблема Inno Setup и это уже пройденный нами этап (повторюсь еще раз)
Мы можем попытаться раздуть эту тему. Но я бы очень хотел сконцентрироваться на решении проблемы. Т.е. на финальном результате.
От оплаты доработок нашего скрипта по двум кейсам в 1к я не отказываюсь
Для защиты своей работы можете не выкладывать код, а локально собрать и во время звонка (гугл мит например) продемонстрировать работу установщика. Или записать видео показав работу двух кейсов.
Мне кажется El Sanchez просто было лень вникать в то, что я написал и он просто решил сделать по-быстрому, так как уже где-то реализовывал. Буду рад если я не прав.
Всё сводится к тому что своими силами мы разберёмся быстрее. Возможно, в этом и был ваш хитроумный план, поугнетать человека до тех пор, пока он не догадается до нужного решения.
Если так, то в аду для вас отдельный котёл, помощнички =)
Как сделаю финальный результат я сброшу сюда, просто чтобы утереть вам нос.
procedure CurPageChanged(CurPageID: Integer);
begin
WizardForm.Bevel1.Visible := false;
WizardForm.MainPanel.Visible := false;
WizardForm.InnerNotebook.Top := 50;
WizardForm.OuterNotebook.height := 400;
if CurPageID = wpInstalling then begin
Downloaded := idpFilesDownloaded();
if not(Downloaded) then begin
ExitProcess(553);
end;
end;
end;
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if Cancel = True then begin
ExitProcess(554);
end;
end;
Вот кусок кода отвечающий за отмену в двух этих кейсах
жирным выделил текст, чтобы показать эти 2 кейса
El Sanchez
18-02-2022, 21:38
1 Идёт окно Downloading вызываемое IDP, нажимаем на крестик закрытия окна и в появившемся модальном окне подтверждаем на Yes
Вместо того чтобы прервать Загрузку он пытается дальше выполнить установку и создает ярлыки »
lmiol, неправда. Если успели нажать Yes до того, как загрузка закончилась, то работает idpCancelButtonClick из idp.iss. А если разглядывать модальное окно и долго решать остановить загрузку или нет, то сама загрузка идёт дальше, и вот всё скачалось, ошибок нет и идёт дальше по сценарию, распаковка, ярлыки и прочее. Паузу автор не предусмотрел. Лучше в idp.iss участок кода с idpCancelButtonClick перепишите на:
var
DownloadFailed: Boolean;
function idpBackButtonClick(Page: TWizardPage): Boolean;
begin
if not IDPOptions.NoRetryButton then // Retry button clicked
begin
DownloadFailed := False;
idpStartDownload;
Result := False;
end
else
Result := True;
end;
function idpNextButtonClick(Page: TWizardPage): Boolean;
begin
Result := True;
end;
procedure idpCancelButtonClick(Page: TWizardPage; var Cancel, Confirm: Boolean);
begin
Cancel := not DownloadFailed or ExitSetupMsgBox;
if Cancel then
begin
IDPForm.Status.Caption := ExpandConstant('{cm:IDP_CancellingDownload}');
WizardForm.Repaint;
idpStopDownload;
Confirm := False;
end;
end;
procedure idpReportErrorHelper(Sender: TObject);
begin
DownloadFailed := True;
idpReportError; //calling idpReportError in main thread for compatibility with VCL Styles for IS
end;
Будет выход без подтверждения с прекращением загрузки, если пользователь Отмена нажмёт или окно попытается закрыть.
2 Идёт окно Downloading вызываемое IDP, отключаем wifi, в появившемся модальном окне где говорят "интернет пропал" и спрашивают "Повторить или Отмена?" нажимаем Отмена
Вместо того чтобы прервать загрузку он пытается дальше выполнить установку и создает ярлыки »
lmiol, неправда, при Отмена вызывается тот же код idpCancelButtonClick из idp.iss, но теперь тут модальное окно создаётся из библиотеки и закачка не продолжается.
Мне кажется El Sanchez просто было лень вникать в то, что я написал и он просто решил сделать по-быстрому, так как уже где-то реализовывал. »
lmiol, я не использую новые версии Inno и их фишки, пример писал впервые, да и не любитель я сторонние библиотеки использовать.
lmiol, неправда. Если успели нажать Yes до того, как загрузка закончилась, то работает idpCancelButtonClick из idp.iss. А если разглядывать модальное окно и долго решать остановить загрузку или нет, то сама загрузка идёт дальше, и вот всё скачалось, ошибок нет и идёт дальше по сценарию, распаковка, ярлыки и прочее. Паузу автор не предусмотрел. Лучше в idp.iss участок кода с idpCancelButtonClick перепишите на: »
Спасибо конечно, но это просто без подтверждения закрытие. А это не совсем юзерфрендли.
Но я полностью согласен что во время модального окна с подтверждением должна быть пауза.
У нативного загрузчика эта пауза есть.
Но тут мы посчитали эту проблему низкоприоритетной. Если не успеет нажать значит сам виноват =)
Ну т.е. кейс когда он жмёт закрыть и намеренно уходит очень низок. (но конечно будет). Ведь если кто-то не хочет чтобы ему что-то устанавливалось - он не будет ждать с моря погоды. Но повторюсь что такой кейс возможен (отвлекли например).
Есть еще кейс если долго ждать загрузку и в конце нажать на Крестик (или эта отмена сделана в конце уже почти загуженного файла) то да, второй кейс когда всё упущено.
UPDATE
Кстати я потестировал еще раз
у нас пауза делается сама на Download от IDP
а на installation который у нас идёт секунды 2 уже крестика нет и прервать установку уже нельзя
так что всё просто magnifique
pollipen
09-03-2022, 15:20
Парни подскажите как сделать, что бы не было видно ошибок при переустановки программы.
https://b.radikal.ru/b07/2203/0e/595677b7a5a6.png
Vanadiy777
10-03-2022, 18:25
Парни подскажите как сделать, что бы не было видно ошибок при переустановки программы. »
pollipen, не совсем понятно, какие ошибки имеются ввиду?
Всем привет!
Как можно реализовать поиск необходимой директории установки, при условии, что имя конечной папки и ее расположение может быть разным (все возможные варианты имен известны).
Например, я знаю, что папка может иметь имя Толя, Коля или Вася, а вот директории неизвестны.
Как найти одну, несколько или все эти папки и установить (дублировать) в них приложение?
Как можно реализовать поиск необходимой директории установки, при условии, что имя конечной папки и ее расположение может быть разным (все возможные варианты имен известны). »Если при первой установке инсталлятор прописывает в реестр - то для последующей установки логично использовать путь из реестра.
Смотрите в справке константы (https://jrsoftware.org/ishelp/index.php?topic=consts):
{reg:HKxx\SubkeyName,ValueName|DefaultValue}
Примеры:
[Setup]
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,InstallLocation|{pf}\My Program}
[Setup]
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1,InstallLocation|{pf}\My Program}
ivan_rolos
05-04-2022, 20:21
Подскажите пожалуйста.
Как можно прочитать свойства файла? (ПКМ->Свойства->Подробно)
Мне нужно прочитать свойства уже готового файла инсталлятора (при его запуске), сам файл получают так: {srcexe}
habib2302
06-04-2022, 12:16
ivan_rolos, смотря что вам надо прочитать и для чего?
ivan_rolos
06-04-2022, 15:05
habib2302, "Описание файла", у инсталлятора оно будет меняться после сборки.
и нужно чтобы он потом при запуске установки подхватил значение и передал на обработчик как параметр. (отстук, что поставилась копия, такого-то описания)
Vanadiy777
06-04-2022, 23:05
"Описание файла", у инсталлятора оно будет меняться после сборки. »
ivan_rolos, почему нельзя задать описание файла при сборке инсталлятора?
Задать сразу значение в секции:
[Setup]
VersionInfoDescription=Ваше описание файла
Затем, через константу {#SetupSetting('VersionInfoDescription')} передать туда, куда Вам нужно.
ivan_rolos
07-04-2022, 12:17
Vanadiy777, он не подписанный и прокручивать все копии чтобы не ругался smartScreen сложно.
Поэтому нужна возможность получить параметры, к примеру описание.
Ваш способ не подходит(
Vanadiy777
07-04-2022, 14:17
он не подписанный и прокручивать все копии чтобы не ругался smartScreen сложно. »
ivan_rolos, если Вы замените описание файла вручную после сборки инсталлятора, то он не станет от этого подписанным... А SmartScreen ругается потому, что воспринимает этот файл как потенциально опасное приложение.
Обозначьте полностью и по конкретней задачу, что Вам необходимо получить на выходе.
ivan_rolos
08-04-2022, 18:51
Vanadiy777, Как можно прочитать свойства файла? (ПКМ->Свойства->Подробно)
Vanadiy777
08-04-2022, 19:23
Цитата:
Как можно прочитать свойства файла? (ПКМ->Свойства->Подробно) »
ivan_rolos, ну да, блин, так то намного понятней стало...
Можете и дальше продолжать играть в Павлика Морозова, но до тех пор, пока Вы по русски не объясните конкретно, что Вам нужно и зачем, то, очевидно, решения не будет...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC