Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 9]

Ответить
Настройки темы
Скрипты Inno Setup. Помощь и советы [часть 9]

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1264
Благодарности: 1024


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: El Sanchez
Дата: 06-06-2020
Внимание! Данная тема предназначена только для обсуждения написания скриптов!
Остальные вопросы, а также последние версии компилятора в теме
Inno Setup. Прочие вопросы.


Показать/скрыть: Справка, руководство, примеры:

Показать/скрыть: Ссылки на примеры скриптов:

Показать/скрыть: Дополнительные программы для Inno Setup:
  • ISTool - неплохой редактор скриптов Inno Setup.
    Последняя версия: 5.3.0.1 [29.09.2009] - Скачать | зеркало;

  • Inno Script Generator - генератор скриптов Inno Setup. Обладает некоторыми полезными функциями, которых нет ни у самого Inno Setup, ни у ISTool.
    Последняя версия: 1.0.3.1 [23.03.2008] - Скачать | зеркало на русифицированную программу;
    Примечание: Родной сайт www.hisoft2000.de более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup Form Designer - редактор страниц Inno Setup, можно создавать свои страницы.
    Последняя версия: 2.0.8 [12.11.2006] - Скачать;
    Примечание: Родной сайт http://isfd.kaju74.de/index.php?isfd более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup GameScript Generator - программа генерирует скрипты для Inno Setup . С помощью GameScript Generator и Inno Setup вы сможете быстро создать простенький инсталляционный пакет для любой игры. В инсталлятор можно встроить музыку, слайдшоу и фоновый рисунок. Для специалистов созданный скрипт, возможно, будет неплохой заготовкой для дальнейшей модернизации;

  • ISSkin - Программа для создания и добавления в инсталлятор скинов. Инструкция.
    Последняя версия: 3.0.0.0 [19.01.2010] - Скачать;

  • ISSJoiner - Программа для объединения нескольких скриптов InnoSetup в один.
    Последняя версия: 3.0 [23.07.2009]

  • Converter - Программа конвертирует reg-файлы в формат *.iss (формат скриптов Inno Setup).
    Последняя версия: 0.1.4 [13.03.2010] - Скачать;

  • RegExporter - Бесплатная утилита для экспорта реестра и конвертации файлов *.reg и *.ini в инсталляционные скрипты Inno Setup и NSIS.
    Последняя версия: 1.3.0 [17.01.2015] - Скачать;



Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:

Скрипты Inno Setup. Помощь и советы [часть 6] | Скрипты Inno Setup. Помощь и советы [часть 6].7z
Скрипты Inno Setup. Помощь и советы [часть 7] | Скрипты Inno Setup. Помощь и советы [часть 7].7z
Скрипты Inno Setup. Помощь и советы [часть 8] | Скрипты Inno Setup. Помощь и советы [часть 8].7z
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:09, 04-04-2018

 

Новый участник


Сообщения: 10
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата iglezz:
В том, что 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, 17-04-2020 в 18:27.


Отправлено: 15:44, 17-04-2020 | #611



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Старожил


Сообщения: 352
Благодарности: 192

Профиль | Отправить PM | Цитировать


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
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:02, 17-04-2020 | #612


Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1264
Благодарности: 1024

Профиль | Отправить PM | Цитировать


Цитата passstrada:
И идёт продолжение запуска обновления, а должно закрыть окно Обновления. »
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;
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:05, 17-04-2020 | #613


Аватара для nik1967

Старожил


Сообщения: 440
Благодарности: 251

Профиль | Сайт | Отправить PM | Цитировать


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;

-------
Если сообщение оказалось полезным для Вас, то помимо спасибо, можно нажать на "Полезное сообщение".


Последний раз редактировалось nik1967, 17-04-2020 в 19:12.

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:06, 17-04-2020 | #614


Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1264
Благодарности: 1024

Профиль | Отправить PM | Цитировать


Цитата nik1967:
А так не катит? »
nik1967, в данном примере прокатит, но есть нюанс. Чему будет равен Result, если ResultStr='{#AppVer}' вернет False?
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:50, 17-04-2020 | #615


Аватара для nik1967

Старожил


Сообщения: 440
Благодарности: 251

Профиль | Сайт | Отправить PM | Цитировать


Цитата El Sanchez:
Чему будет равен Result »
False

-------
Если сообщение оказалось полезным для Вас, то помимо спасибо, можно нажать на "Полезное сообщение".


Отправлено: 21:25, 22-04-2020 | #616


Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1264
Благодарности: 1024

Профиль | Отправить PM | Цитировать


Цитата nik1967:
False »
nik1967, верно, InitializeSetup не вызывается из другой процедуры и переменная Result инициализируется в ней значением по умолчанию после оператора begin.
Теперь сделаем ее вызываемой: переименуем ее в InitializeSetup2, например, и вызовем ее из InitializeSetup следующим образом:

Код: Выделить весь код
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 в любых случаях был переназначен.
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:54, 25-04-2020 | #617


Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Отправить PM | Цитировать


Здравствуйте! Мне нужна помощь.
Есть рабочий скрипт (его код ниже), который должен создать ярлык на папку. Ярлык создается, но если искать этот ярлык через программу, то программа его не видит. (Даже в Экселе - Файл/Открыть - ярлык не виден).
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, 13-05-2020 в 13:38.


Отправлено: 13:30, 13-05-2020 | #618


Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Отправить PM | Цитировать


Друзья, может кто знает, как решается этот вопрос? (см. предыдущее сообщение)

Отправлено: 12:08, 16-05-2020 | #619


Аватара для habib2302

Ветеран


Сообщения: 855
Благодарности: 101

Профиль | Отправить PM | Цитировать


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

-------
Помог? От "Полезное сообщение" не откажусь!!!


Последний раз редактировалось habib2302, 16-05-2020 в 12:37.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:26, 16-05-2020 | #620



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 9]

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты Inno Setup. Помощь и советы [часть 7] El Sanchez Автоматическая установка приложений 2499 02-02-2015 08:59
Скрипты Inno Setup. Помощь и советы [часть 6] El Sanchez Автоматическая установка приложений 2494 10-03-2014 11:51
Скрипты Inno Setup. Помощь и советы [часть 5] El Sanchez Автоматическая установка приложений 1999 28-03-2013 19:09
Скрипты Inno Setup. Помощь и советы [часть 4] El Sanchez Автоматическая установка приложений 2099 22-05-2012 23:16
Скрипты Inno Setup. Помощь и советы [часть 3] Serega Автоматическая установка приложений 3755 26-10-2011 17:58




 
Переход