Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 9]
https://a.radikal.ru/a31/2003/b8/72c01563e633.png (https://radikal.ru)
ZVSRus, да так, а как ето сделать?
а как ето сделать?
Редактируется Редакторами ресурсов (например Restorator-ом) скомпелированный установщик. В ресурсах самого компилятора не пробовал.
ZVSRus, я так и думал, но не пробовал, щас попробую
Здравствуйте!
Мне не нужна помощь. Дело такое, создаю ярлык в папке Автозагрузка
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}"
Вопрос такой как это сделать в скрипте .... »
Читать справку
Flags: runminimized
Читать справку »
Благодарю вас за помощь. Всё работает.
Русская справка 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;
В чем может быть проблема? »
В том, что 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;
Но она отказывается работать.
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;
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?
Чему будет равен 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 в любых случаях был переназначен.
Здравствуйте! Мне нужна помощь.
Есть рабочий скрипт (его код ниже), который должен создать ярлык на папку. Ярлык создается, но если искать этот ярлык через программу, то программа его не видит. (Даже в Экселе - Файл/Открыть - ярлык не виден).
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: "Папка содержит настройки программы"
Спасибо!
Друзья, может кто знает, как решается этот вопрос? (см. предыдущее сообщение)
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC