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

ZVSRus
29-03-2020, 16:15
https://a.radikal.ru/a31/2003/b8/72c01563e633.png (https://radikal.ru)

Beavimo
29-03-2020, 18:03
ZVSRus, да так, а как ето сделать?

ZVSRus
30-03-2020, 14:05
а как ето сделать?
Редактируется Редакторами ресурсов (например Restorator-ом) скомпелированный установщик. В ресурсах самого компилятора не пробовал.

Beavimo
31-03-2020, 10:47
ZVSRus, я так и думал, но не пробовал, щас попробую

Alsag
07-04-2020, 20:36
Здравствуйте!
Мне не нужна помощь. Дело такое, создаю ярлык в папке Автозагрузка
Name: "{userstartup}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; WorkingDir: "{app}"
Программа запускается в развёрнутом виде, каждый раз её приходится сворачивать в трей.
А если в свойствах ярлыка сделать так https://c.radikal.ru/c04/2004/d5/ba517c1d3c71.jpg
Программа призапуске будет сама своррачиваться в трей.
Вопрос такой как это сделать в скрипте Name: "{userstartup}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; WorkingDir: "{app}"

iglezz
07-04-2020, 21:09
Вопрос такой как это сделать в скрипте .... »
Читать справку
Flags: runminimized

Alsag
07-04-2020, 21:26
Читать справку »
Благодарю вас за помощь. Всё работает.

mig73
12-04-2020, 16:41
Русская справка Inno Setup Preprocessor (ISPP) v6.0.4 (https://yadi.sk/d/HrEFRDCJPx3qDQ)

passstrada
17-04-2020, 15:22
Обнаружил проблему. Во время запуска Обновления.
Отображения окна - "Клиент игры не найден! Обновление не может быть установлено!" Нажимаю ОК
И идёт продолжение запуска обновления, а должно закрыть окно Обновления.

В чем может быть проблема?

Код:

//Процедура, Оформление окон
procedure LoadVCLStyle(VClStyleFile: String); external 'LoadVCLStyleW@files:VclStylesInno.dll stdcall';
procedure UnLoadVCLStyles; external 'UnLoadVCLStyles@files:VclStylesInno.dll stdcall';

//Процедура, Splash
procedure ShowSplashScreen(p1:HWND;p2:AnsiString;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer);
external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';

//Объеденение две функции в одну, первая, Оформление окон
Function InitializeSetup1(): Boolean;
begin
ExtractTemporaryFile('Amakrits.vsf');
LoadVCLStyle(ExpandConstant('{tmp}\Amakrits.vsf'));
Result := True;
end;

procedure DeinitializeSetup();
begin
UnLoadVCLStyles;
end;

//Объеденение две функции в одну, вторая, Обновление
Function InitializeSetup2(): Boolean;
var ResultStr: String;
begin
RegQueryStringValue(HKCU, 'Software\WoTBlitz', 'Version', ResultStr);
if ResultStr='{#AppVer}' then
begin
Result := MsgBox('Поиск клиента игры...' #13#13 'Клиент игры найден. Продолжить установку?', mbConfirmation, MB_YESNO) = idYes;
if Result = False then
MsgBox('Поиск клиента игры...' #13#13 'Обновление клиента прервано.', mbInformation, MB_OK);
end
else MsgBox('Поиск клиента игры...' #13 'Клиент игры не найден!' #13#13 'Обновление не может быть установлено!', mbConfirmation, MB_OK)
end;
//Читаем значение параметра Version из реестра и присваиваем его переменной ResultStr
//Если значение параметра Version равно 1.0, обновление устанавливается, если не равно или не существует – установка прекращается

//Запуск функций, сначала первую за ней вторую (более правильное объеденение двух функций в одну)
Function InitializeSetup(): Boolean;
begin
InitializeSetup1();
InitializeSetup2();
Result := True;
end;

//Функция, Splash
procedure InitializeWizard();
begin
ExtractTemporaryFile('Splash.png');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}\Splash.png'),1000,3000,1000,0,255,True,$FFF FFF,10);
end;

iglezz
17-04-2020, 15:41
В чем может быть проблема? »
В том, что InitializeSetup() возвращает True вместо предполагаемого, по логике, результата функции InitializeSetup2()

passstrada
17-04-2020, 15:44
В том, что InitializeSetup() возвращает True вместо предполагаемого, по логике, результата функции InitializeSetup2() »
Можно ли как то исправить эту проблему?
Может как то переделать код, или объеденить 2 функции по другому?

Попробывал вызвать через procedure
Получилось что-то такое:

Procedure Skins();
begin
ExtractTemporaryFile('Amakrits.vsf');
LoadVCLStyle(ExpandConstant('{tmp}\Amakrits.vsf'));
end;

Function InitializeSetup2(): Boolean;
var ResultStr: String;
begin
RegQueryStringValue(HKCU, 'Software\WoTBlitz', 'Version', ResultStr);
if ResultStr='{#AppVer}' then
begin
Result := MsgBox('Поиск клиента игры...' #13#13 'Клиент игры найден. Продолжить установку?', mbConfirmation, MB_YESNO) = idYes;
if Result = False then
MsgBox('Обновление клиента отменено!', mbInformation, MB_OK);
end
else MsgBox('Поиск клиента игры...' #13 'Клиент игры не найден!' #13#13 'Обновление не может быть установлено!', mbConfirmation, MB_OK);

Skins();
Result := True;
end;

Но скин срабатывает только после Splash, тоисть окна проверки (Обновления) без оформления.

Тоисть нужна procedura наоборот, вроде такого:

Procedure Update();
var ResultStr: String;
begin
RegQueryStringValue(HKCU, 'Software\WoTBlitz', 'Version', ResultStr);
if ResultStr='{#AppVer}' then
begin
Result := MsgBox('Поиск клиента игры...' #13#13 'Клиент игры найден. Продолжить установку?', mbConfirmation, MB_YESNO) = idYes;
if Result = False then
MsgBox('Обновление клиента отменено!', mbInformation, MB_OK);
end
else MsgBox('Поиск клиента игры...' #13 'Клиент игры не найден!' #13#13 'Обновление не может быть установлено!', mbConfirmation, MB_OK);
end;

Function InitializeSetup2(): Boolean;
begin
ExtractTemporaryFile('Amakrits.vsf');
LoadVCLStyle(ExpandConstant('{tmp}\Amakrits.vsf'));
Result := True;

Update();
end;

Но она отказывается работать.

iglezz
17-04-2020, 19:02
passstrada, function CheckInstalled(): Boolean;
var ResultStr: String;
begin
RegQueryStringValue(HKCU, 'Software\WoTBlitz', 'Version', ResultStr);
if ResultStr='{#AppVer}' then Result := True else Result := False;
end;

function GetUserConfirmation(Message: String): Boolean;
begin
if MsgBox(Message, mbConfirmation, MB_YESNO) = IDYES then Result := True else Result := False;
end;

function InitializeSetup(): Boolean;
var ReturnValue: Boolean;
begin
// это вместо InitializeSetup1()
ExtractTemporaryFile('Amakrits.vsf');
LoadVCLStyle(ExpandConstant('{tmp}\Amakrits.vsf'));

// это вместо InitializeSetup2()
ReturnValue := False;

if CheckInstalled() then
ReturnValue := GetUserConfirmation('Поиск клиента игры...' #13#13 'Клиент игры найден. Продолжить установку?')
else
MsgBox('Поиск клиента игры...' #13 'Клиент игры не найден!' #13#13 'Обновление не может быть установлено!', mbConfirmation, MB_OK)

Result := ReturnValue;
end;
Хотя непонятно зачем дополнительно спрашивать про "Продолжить установку?", если гуй всё равно используется.

add:
Чтобы не лепить "Result := True;" где попало неплохо бы справку почитать по Inno и Pascal

El Sanchez
17-04-2020, 19:05
И идёт продолжение запуска обновления, а должно закрыть окно Обновления. »
passstrada,

function InitializeSetup: Boolean;
var
ResultStr: string;
begin
Result := False;
ExtractTemporaryFile('Amakrits.vsf');
LoadVCLStyle(ExpandConstant('{tmp}\Amakrits.vsf'));
if RegQueryStringValue(HKCU, 'Software\WoTBlitz', 'Version', ResultStr) and
(ResultStr = '{#AppVer}') then
begin
Result := MsgBox('Поиск клиента игры...' #13#13 'Клиент игры найден. Продолжить установку?', mbConfirmation, MB_YESNO) = idYes;
if not Result then
MsgBox('Поиск клиента игры...' #13#13 'Обновление клиента прервано.', mbInformation, MB_OK);
end else
MsgBox('Поиск клиента игры...' #13 'Клиент игры не найден!' #13#13 'Обновление не может быть установлено!', mbConfirmation, MB_OK);
end;

nik1967
17-04-2020, 19:06
passstrada,
//Читаем значение параметра Version из реестра и присваиваем его переменной ResultStr
//Если значение параметра Version равно 1.0, обновление устанавливается, если не равно или не существует – установка прекращается
Function InitializeSetup(): Boolean;
var ResultStr: String;
begin
ExtractTemporaryFile('Amakrits.vsf');
LoadVCLStyle(ExpandConstant('{tmp}\Amakrits.vsf'));
RegQueryStringValue(HKCU, 'Software\WoTBlitz', 'Version', ResultStr);
if ResultStr='{#AppVer}' then begin
Result:= MsgBox('Поиск клиента игры...' #13#13 'Клиент игры найден. Продолжить установку?', mbConfirmation, MB_YESNO) = idYes;
if not Result then
MsgBox('Поиск клиента игры...' #13#13 'Обновление клиента прервано.', mbInformation, MB_OK);
end else MsgBox('Поиск клиента игры...' #13 'Клиент игры не найден!' #13#13 'Обновление не может быть установлено!', mbConfirmation, MB_OK)
end;

El Sanchez
17-04-2020, 19:50
А так не катит? »
nik1967, в данном примере прокатит, но есть нюанс. Чему будет равен Result, если ResultStr='{#AppVer}' вернет False?

nik1967
22-04-2020, 21:25
Чему будет равен Result »
False

El Sanchez
25-04-2020, 15:54
False »
nik1967, верно, InitializeSetup не вызывается из другой процедуры и переменная Result инициализируется в ней значением по умолчанию после оператора begin.

function InitializeSetup2: Boolean;
var
ResultStr: string;
begin
ExtractTemporaryFile('Amakrits.vsf');
LoadVCLStyle(ExpandConstant('{tmp}\Amakrits.vsf'));
RegQueryStringValue(HKCU, 'Software\WoTBlitz', 'Version', ResultStr);
if ResultStr = '{#AppVer}' then
begin
Result := MsgBox('Поиск клиента игры...' #13#13 'Клиент игры найден. Продолжить установку?', mbConfirmation, MB_YESNO) = idYes;
if not Result then
MsgBox('Поиск клиента игры...' #13#13 'Обновление клиента прервано.', mbInformation, MB_OK);
end else
MsgBox('Поиск клиента игры...' #13 'Клиент игры не найден!' #13#13 'Обновление не может быть установлено!', mbConfirmation, MB_OK);
end;

function InitializeSetup: Boolean;
begin
Result := True; // что-то делаем с Result, в итоге Result равен True
// ...
Result := InitializeSetup2; // вызываем InitializeSetup2
end;


При входе в InitializeSetup2 после begin Result равен True и в случае невыполнения ResultStr = '{#AppVer}' пользователь увидит сообщение "Клиент игры не найден" и установка продолжится, что есть непредвиденное поведение. В данном случае Result не инициализируется в InitializeSetup2, это было сделано раньше, в InitializeSetup после begin. Потом в строке Result := True переменной присвоено значение True и дальше передана по ссылке в InitializeSetup2. Функции на самом деле являются процедурами, где первым параметром идет переменная c именем Result и которая передается по ссылке.

procedure InitializeSetup2(var Result: Boolean);
var
ResultStr: string;
begin
// тут Result передан по ссылке из InitializeSetup и равен True
ExtractTemporaryFile('Amakrits.vsf');
LoadVCLStyle(ExpandConstant('{tmp}\Amakrits.vsf'));
RegQueryStringValue(HKCU, 'Software\WoTBlitz', 'Version', ResultStr);
if ResultStr = '{#AppVer}' then
begin
Result := MsgBox('Поиск клиента игры...' #13#13 'Клиент игры найден. Продолжить установку?', mbConfirmation, MB_YESNO) = idYes;
if not Result then
MsgBox('Поиск клиента игры...' #13#13 'Обновление клиента прервано.', mbInformation, MB_OK);
end else // непредвиденное поведение: тут Result равен True, т.к. нигде не используется выше в теле процедуры
MsgBox('Поиск клиента игры...' #13 'Клиент игры не найден!' #13#13 'Обновление не может быть установлено!', mbConfirmation, MB_OK);
end;

procedure InitializeSetup(var Result: Boolean);
begin
// тут Result инициализируется значением по умолчанию False
Result := True; // что-то делаем с Result, в результате Result равен True
// ...
InitializeSetup2(Result); // вызываем InitializeSetup2
end;


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

Log 101
13-05-2020, 13:30
Здравствуйте! Мне нужна помощь.
Есть рабочий скрипт (его код ниже), который должен создать ярлык на папку. Ярлык создается, но если искать этот ярлык через программу, то программа его не видит. (Даже в Экселе - Файл/Открыть - ярлык не виден).
1.Что в скрипте не так?
2.Как в конце установки вывести галку с предложением открыть папку с настройками (из "{commonappdata}\Inno\Программа") после окончания установки?


[Setup]
AppName=Программа 2020
; AppVerName=1.0
AppPublisher=Pro, Inc.
AppCopyright=Copyright (C) 2020
AppVersion=2.0.0.0
DefaultDirName="{commonappdata}\Inno\Программа"
DisableStartupPrompt=yes
DisableReadyPage=yes
DisableDirPage=yes
DefaultGroupName=Inno 5\Настройки
DisableProgramGroupPage=yes
OutputBaseFilename=setup-auto
Compression=lzma
SolidCompression=yes
Uninstallable=no
DisableWelcomePage=no
WizardSmallImageFile=WizSmall2.bmp

[Messages]
WelcomeLabel1=Вас приветствует Мастер установки Inno 5
WelcomeLabel2=Программа установит [name/ver] на Ваш компьютер.%n%nТребуется закрыть программу "Inno 5" перед тем, как продолжить.
FinishedHeadingLabel=Завершение Мастера установки Inno 5
FinishedLabelNoIcons=[name/ver] установлены на Ваш компьютер.
FinishedLabel=[name] установлены.%n%nНастройки находятся в папке "Программа" на Рабочем столе компьютера.
InstallingLabel=Пожалуйста, подождите пока [name] установится на Ваш компьютер.

[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Files]
Source: "{src}\Программа\*"; DestDir: "{app}\"; Flags: external recursesubdirs skipifsourcedoesntexist

[Icons]
Name: "{group}\Настройки"; Filename: "{commonappdata}\Inno\Программа"
Name: "{commondesktop}\Программа"; Filename: "{commonappdata}\Inno\Программа"; Comment: "Папка содержит настройки программы"



Спасибо!

Log 101
16-05-2020, 12:08
Друзья, может кто знает, как решается этот вопрос? (см. предыдущее сообщение)

habib2302
16-05-2020, 12:26
Log 101, У меня все ярлыки создаются как на рабочем столе так и в меню пуск.
Ярлык создается, но если искать этот ярлык через программу, то программа его не видит. (Даже в Экселе - Файл/Открыть - ярлык не виден). »
Чтобы ярлык виделся в любой программе замените {commondesktop} на {userdesktop}
Как в конце установки вывести галку с предложением открыть папку с настройками (из "{commonappdata}\Inno\Программа") после окончания установки? »
Добавьте эту строку.
[Run]
Filename: "{win}\explorer.exe"; Parameters: "{commonappdata}\Inno\Программа"; Description: "Открыть папку с настройками"; Flags: nowait postinstall skipifsilent




© OSzone.net 2001-2012