PDA

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


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

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;

lmiol
17-02-2022, 12:48
»
У нас есть уже скрипт по работе с нативным загрузчиком от 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
18-02-2022, 07:56
lmiol, всё то, что предлагает господин El Sanchez не имеет ни тормозов, ни глюков. Лучше вежливо попросите его о помощи и этот парень продемонстрирует вам своё мастерство в таком духе, что после увиденного вам ничего не останется как сказать, что этот парень просто волшебник. El Sanchez виртуозно владеет компьютерными языками. Это тот человек, который не копирует код, а пишет его с нуля. Методов написания любого кода существует масса, но не каждый умеет так оптимизированно писать код, как господин El Sanchez. »
lmiol, извините, коллега, возможно сейчас влезаю не в свое дело...
Вы простите, но возникает вопрос - Вам "шашечки", или ехать?
Маэстро El Sanchez дал Вам готовое решение по ваш компилятор..., причем, заметьте, абсолютно бесплатно... »

Кланяться в ноги за то, что я не просил я не собираюсь. Учитывая что у нас этот вариант тоже был и мы его тестировали уже и отклонили. Я по факту вроде бы так и ответил.

У меня в посте указан плагин IDP, конкретный дизайн, конкретная проблема: я просил дополнить наш скрипт исправив проблему по двум кейсам.
Я понимаю, что возможно Маэстро хотел как лучше и переписал на нативку, но факт остаётся фактом: это не то что мы просили.

И не круто тут как чайки налетать на меня и делать вид, что я не благодарный.
А также необязательно зачмокивать друг друга благодарностями на свои остроты.

Конкретно претензий к Маэстро за то, что нативка лагает - нет. Ведь это проблема Inno Setup и это уже пройденный нами этап (повторюсь еще раз)

Мы можем попытаться раздуть эту тему. Но я бы очень хотел сконцентрироваться на решении проблемы. Т.е. на финальном результате.

От оплаты доработок нашего скрипта по двум кейсам в 1к я не отказываюсь
Для защиты своей работы можете не выкладывать код, а локально собрать и во время звонка (гугл мит например) продемонстрировать работу установщика. Или записать видео показав работу двух кейсов.

Мне кажется El Sanchez просто было лень вникать в то, что я написал и он просто решил сделать по-быстрому, так как уже где-то реализовывал. Буду рад если я не прав.
Всё сводится к тому что своими силами мы разберёмся быстрее. Возможно, в этом и был ваш хитроумный план, поугнетать человека до тех пор, пока он не догадается до нужного решения.
Если так, то в аду для вас отдельный котёл, помощнички =)

Как сделаю финальный результат я сброшу сюда, просто чтобы утереть вам нос.

lmiol
18-02-2022, 08:28
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
19-02-2022, 11:05
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, не совсем понятно, какие ошибки имеются ввиду?

Oklen
23-03-2022, 22:29
Всем привет!
Как можно реализовать поиск необходимой директории установки, при условии, что имя конечной папки и ее расположение может быть разным (все возможные варианты имен известны).
Например, я знаю, что папка может иметь имя Толя, Коля или Вася, а вот директории неизвестны.
Как найти одну, несколько или все эти папки и установить (дублировать) в них приложение?

Nordek
28-03-2022, 03:35
Как можно реализовать поиск необходимой директории установки, при условии, что имя конечной папки и ее расположение может быть разным (все возможные варианты имен известны). »Если при первой установке инсталлятор прописывает в реестр - то для последующей установки логично использовать путь из реестра.
Смотрите в справке константы (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