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

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

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

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

Ветеран


Contributor


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


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

Профиль | Отправить 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

 

Аватара для ZVSRus

Старожил


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

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


Вопрос к El Sanchez
В посте что выше вы реализовали доступ к SelectLanguageForm в стандартной версии Inno, так может у вас получится реализовать доступ к стандартному окну, что вызывается кнопкой Обзор на странице SelectDirPage, как я понимаю даже в расширенной версии к данному окну доступ закрыт. Интересует не кастомная форма, а хотелось бы знать как там правильно называется Edit и FolderTreeView. Очень нужно для реализации непосредственно на странице SelectDirPage.

-------
Inno Setup 5.5.1.ee2 Ultra ANSI Unicode


Отправлено: 18:56, 10-07-2024 | #1061



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

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


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


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

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


Добрый вечер.
Форум живой? Интересует какая-то активность по Inno Setup.

Есть много вопросов, по поисковику многое не нашёл...
Но для начала, проинформирую, что в 2к24 данная ссылка на сообщение уже не актуальна, потому что зеркала и прочее уже слишком сильно, к сожалению, устарело. Речь об: "Скрипты инсталляторов для игр - скрипты инсталляторов для игр, (ссылка на сообщение);"

Если вдруг у кого остались наработки, меня заинтересовал "Корона скин", тот, который первый. Если нету... то мне бы хоть что-нибудь посмотреть.

Отправлено: 22:00, 10-07-2024 | #1062


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

Ветеран


Contributor


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

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


Цитата ZVSRus:
как там правильно называется Edit и FolderTreeView »
Обычные классы TEdit и TFolderTreeView, дескрипторы окон получить можно.

Отправлено: 10:23, 11-07-2024 | #1063


Аватара для Flix

Пользователь


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

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


Цитата Gobethron:
меня заинтересовал "Корона скин" »
Gobethron, "корону скин" можно найти здесь, а также все остальное.

Но сейчас лучше использовать новую, современную библиотеку - FMXInno.
Она предоставляет намного больше возможностей по кастомизации игровых инсталляторов.
На этом же ресурсе вы найдете множество примеров с её использованием (один из них).

P.S. Не сочтите за рекламу.

Отправлено: 13:41, 11-07-2024 | #1064


Аватара для ZVSRus

Старожил


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

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


Цитата El Sanchez:
Обычные классы TEdit и TFolderTreeView, дескрипторы окон получить можно
Спасибо что ответили. Что TEdit и TFolderTreeView Обычные классы, это понятно, но я спросил не об этом, а как внутреннее name. Например создаю кастомный эдит, я задаю ему имя XXXXXEdit := TNewEdit.Create(WizardForm);.
Открыв редактором ресурсов Setup.e32 на вкладке TSELECTFOLDERFORM видим object PathEdit: TEdit, подставляю данное имя PathEdit в строку получаю ошибку неизвестный идентификатор, сразу возникает вопрос, или доступа к данному окну нет, или неправильное имя, по этому и спросил как имена этих классов.
Но суть вопроса заключалось не в этом. Создал диалоговое окно непосредственно на SelectDirPage, все пути выставляются правильно, все работает, но есть одно НО, заходим через кнопку Обзор, все пути установки по умолчанию правильные и в Edit и в DirTreeView C:\Program Files (x86)\My Application, выбираем путь в корень диска C: жмем ОК, при повторном заходе также пути верны C:\My Application но почему то директория C:\Program Files (x86) не сворачивается как в кастомных формах, В чем причина не пойму, или сделано на самой странице или в чем то другом, вот и спросил об стандартном окне.

PS: В Оригинальном установщике R.G. Catalyst 2022-11-16 Ссылка также реализовано на странице SelectDirPage (на панелях) там установка в корень диска D:. меняешь путь в корень диска C:, пака на диске C: появляется но диск D: не сворачивается. Хотя это и не ошибка и не критично, но всё же хотелось отшлифовать до конца.

Скрипт скинул в личку.

-------
Inno Setup 5.5.1.ee2 Ultra ANSI Unicode


Последний раз редактировалось ZVSRus, 11-07-2024 в 17:31.


Отправлено: 16:27, 11-07-2024 | #1065


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


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

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


Цитата Flix:
"корону скин" можно найти здесь, а также все остальное. »
Цитата Flix:
Но сейчас лучше использовать новую, современную библиотеку - FMXInno. »
Cпасибо что ответили.
К сожалению, скачать эти вещи я не могу - мне пишет, что недостаточно прав. Возможно ли как-то обойти эту проблему?..
___
На самом деле, вопросов у меня очень много. Мы с командой доделываем масштабный проект, в определённых кругах. И как-то надоели классические скучные инсталляторы. Поэтому, взялись за поиски всяких фич.

Начать можно с текущей проблемы... замены курсора. Да, я прошерстил, наверное, весь форум. Видел несколько штук проектов, как это можно сделать. К сожалению, ни один не подошёл под мои "запросики".
Нужно чтобы кастомный (пользовательский) курсор менялся только в инсталляторе, ни на что больше не влияя. Причём, нужен именно .cur
На данный момент я достиг того, что смог прикрепить кастомный курсор, при наведении на кнопки "далее".
Также я смог реализовать кастомный курсор для "всего", то есть, работает и в инсталляторе, и вне его. А это неприемлемо.

Почему мне не один из вариантов не подошёл? Ну, во-первых, я нуб в программировании. Во-вторых, сложилось впечатление, что в моём новом inno setup 6.0 не хватает каких-то функций. Пошёл искать "улучшенную версию Inno ISCmplr Setup 5.4.1 build 110214", но тоже, либо не могу скачать, либо на форумах не осталось следов.
Каждый раз когда какой-то из старых кодов беру, то какая-то "мелочь" мешает. Компилятор выдаёт ошибку, не видит идентификаторов и т.д. (а переписал/украл я код достаточно хорошо))))

Чтобы не быть голословным, скину код и проблемные строки. Наиболее "перспективным" (вроде как) считаю первый код:
Код: Выделить весь код
#define A = (Defined UNICODE) ? "W" : "A"

[Setup]
AppName = My Program
AppVersion = 1.5
DefaultDirName = {pf}\My Program
DefaultGroupName = My Program

[Files]
Source: "Mycursor.cur"; Flags: dontcopy;

[Code ]
function LoadCursorFromFile(FileName: String): Cardinal; external 'LoadCursorFromFile{#A}@user32 stdcall';
function DeleteObject(p1: Longword): BOOL; external 'DeleteObject@gdi32.dll stdcall';

const
  MyCursor = 101;
  RT_RCDATA = 10;

var
  ResStream: TResourceStream;
  hcur: Cardinal;

procedure InitializeWizard();
begin
  ResStream := TResourceStream.Create(HInstance, '_IS_MYCURSOR', RT_RCDATA);
  ResStream.SaveToFile(ExpandConstant('{tmp}\Mycursor.cur'));
  hcur := LoadCursorFromFile(ExpandConstant('{tmp}\Mycursor.cur'));
  Screen.Cursors[MyCursor] := hcur; // в других версиях эта строка является проблемной//

  WizardForm.BackButton.Cursor := MyCursor;
  WizardForm.DirBrowseButton.Cursor := MyCursor;
  WizardForm.GroupBrowseButton.Cursor := MyCursor;
  WizardForm.NextButton.Cursor := MyCursor;
  WizardForm.CancelButton.Cursor := MyCursor;
end;

procedure DeinitializeSetup();
begin
  DeleteObject(hcur);
end;
Проблемные строки выделил жирным шрифтом.

Код: Выделить весь код
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe
SolidCompression=yes
Compression=lzma/ultra
OutputDir=Output

[Files]
Source: cursor.ani; Flags: dontcopy

[code ]
function LoadCursorFromFile(FileName: String): Cardinal; external 'LoadCursorFromFile{#A}@user32 stdcall';
function DeleteObject(p1: Longword): BOOL; external 'DeleteObject@gdi32.dll stdcall';

const
MyCursor = 101;

var
hcur: Cardinal;

function InitializeSetup:boolean;
begin
if not FileExists(ExpandConstant('{tmp}\cursor.ani')) then ExtractTemporaryFile('cursor.ani');
Result := True;
end;

procedure InitializeWizard();
begin
with WizardForm do begin
Cursor := MyCursor;
end;
hcur := LoadCursorFromFile(ExpandConstant('{tmp}\cursor.ani'));
Screen.Cursors[MyCursor] := hcur;
end;

procedure DeinitializeSetup();
begin
DeleteObject(hcur);
end;
Проблемные строки выделил жирным шрифтом.

И вот ещё:
Код: Выделить весь код
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
RawDataResource=MyCursor:cursor.ani

[code ]
function LoadCursorFromFile(FileName: String): Cardinal;
external 'LoadCursorFromFileA@user32 stdcall';

const
MyCursor = 101;
RT_RCDATA = 10;

var
hcur: Cardinal;
ResStream: TResourceStream;

procedure InitializeWizard;
begin
with WizardForm do begin
ClientWidth:=ScaleX(650);
ClientHeight:=ScaleY(400);
Position:=poScreenCenter;
OuterNotebook.Hide;
InnerNotebook.Hide;
Bevel.Hide;
Cursor := MyCursor;
end;

ResStream := TResourceStream.Create(HInstance, '_IS_MYCURSOR', RT_RCDATA);
try
ResStream.SaveToFile(ExpandConstant('{tmp}\cursor.ani'));
hcur := LoadCursorFromFile(ExpandConstant('{tmp}\cursor.ani'));
Screen.Cursors[MyCursor] := hcur;
finally
ResStream.Free;
end;

with WizardForm.NextButton do
begin
SetBounds(ScaleX(400), ScaleY(300), ScaleX(81), ScaleY(30));
Cursor := MyCursor;
end;

with WizardForm.BackButton do
begin
SetBounds(ScaleX(300), ScaleY(300), ScaleX(81), ScaleY(30));
Cursor := MyCursor;
end;

with WizardForm.CancelButton do
begin
SetBounds(ScaleX(530), ScaleY(300), ScaleX(81), ScaleY(30));
Cursor := MyCursor;
end;
end;

procedure DeinitializeSetup();
begin
DeleteObject(hcur);
end;
Проблемные строки выделил жирным шрифтом.

Тут у меня есть и .cur и .ani , на самом деле, не сильно важно (предпочтительнее .cur).
________________
В общем, господа-товарищи, если есть современное решение проблемы (потому что я читал ответы аж с 2009 по 2015 гг), то будем с командой очень вам благодарны.

Последний раз редактировалось Gobethron, 11-07-2024 в 21:13.


Отправлено: 21:04, 11-07-2024 | #1066


Аватара для Flix

Пользователь


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

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


Цитата Gobethron:
если есть современное решение проблемы »
Gobethron, современное решение проблемы уже озвучено - библиотека FMXInno (автор BLACKFIRE69, источник).
Она полностью адаптирована под современные системы и современный Inno Setup. Активно развивается и поддерживается.

Озвученные вами проблемы в сценариях (RawDataResource, TResourceStream, Screen.Cursors) касаются только китайской неофициальной Inno Setup v5.5, развитие которой прекратилось в 2012 году. Никакими другими версиями Inno Setup прямо из "коробки" эти фишки не поддерживаются. Сейчас вам нужен курсор, потом что-то другое, потом третье. А все вместе это потянет за собой множество сторонних библиотек (botva, isdone и т.д. и т.п.), которые уже давно не развиваются. Добавьте к этому проблемы совместимости с современными операционными системами. Разбираться и помогать вам с устаревшими и потерявшими свою актуальность библиотеками и решениями уже вряд ли кто-то будет, разве что вы сделаете это самостоятельно. Но самое грустное в этой истории будет то, что вы потеряете время и ваш проект не будет нормально работать в разрешении 2K/4K на современных системах.

Лучше уделите свое время на изучение всех особенностей одной единственной библиотека FMXInno. Поверьте, она с лихвой позволит реализовать любые ваши фантазии и фишки. Библиотека поставляется с множеством примеров различных аспектов оформления программ установок. Также на форуме представлены готовые решения под конкретные игры. Библиотека очень сложная и многосторонняя, поэтому просто не будет. Но если у вас команда, то справитесь.

P.S. На krinkels, чтобы что-то скачать, изучите правила, они не сложные. На fileforums есть возможность скачивания после регистрации.

Отправлено: 23:26, 11-07-2024 | #1067


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

Ветеран


Contributor


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

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


Вложения
Тип файла: 7z example01.7z
(2.6 Kb, 6 просмотров)

Цитата ZVSRus:
при повторном заходе также пути верны C:\My Application но почему то директория C:\Program Files (x86) не сворачивается как в кастомных формах »
ZVSRus, даже со стилем TVS_SINGLEEXPAND автосворачиваются только соседи, всё остальное — нестандарт, поэтому ручками.
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:56, 13-07-2024 | #1068


Аватара для OldGamer

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


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

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


Здравствуйте уважаемые форумчане!

Есть стандартное окно с выбором языков установки.
При нажатии на Отмена или крестик выбивает ошибку:
"Runtime Error (at 105:118)
Could not call proc".
Не критично, но напрягает. Кто-нибудь с таким сталкивался? И как это исправить?



Скрипт

[Setup]
SourceDir=.
OutputDir=Setup
AppName=Spyro the Dragon
AppVersion=2.0
AppPublisher=EmuGames
AppCopyright=by Ma2012ks ©
AppPublisherURL=www.emugames.do.am
AppSupportURL=www.emugames.do.am
AppUpdatesURL=www.emugames.do.am
DefaultDirName={pf}\Insomniac Games\Spyro the Dragon™
DefaultGroupName=Insomniac Games\Spyro the Dragon™
AllowNoIcons=yes
InfoBeforeFile=C:\Users\Maks\Desktop\InstalledImages\System requirements.txt
InfoAfterFile=C:\Users\Maks\Desktop\InstalledImages\Thank you for the installation of the game.txt
OutputBaseFilename=setup
WizardImageFile=C:\Users\Maks\Desktop\InstalledImages\LeftImage.bmp
WizardSmallImageFile=C:\Users\Maks\Desktop\InstalledImages\Icon-Up.bmp
SetupIconFile=C:\Users\Maks\Desktop\InstalledImages\Icon.ico
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
Compression=none
DiskSpanning=yes
DiskSliceSize=2100000000
SlicesPerDisk=1
RestartIfNeededByRun=no
PrivilegesRequired=none
ShowUndisplayableLanguages=yes

[Languages]
Name: english; MessagesFile: compiler:Languages\English.isl
Name: french; MessagesFile: compiler:Languages\French.isl
Name: german; MessagesFile: compiler:Languages\German.isl
Name: spanish; MessagesFile: compiler:Languages\Spanish.isl
Name: italian; MessagesFile: compiler:Languages\Italian.isl
Name: russian; MessagesFile: compiler:Languages\Russian.isl

[Messages]

SelectLanguageTitle=Spyro the Dragon
SelectLanguageLabel=Please select installation language. Âûáåðèòå ÿçûê óñòàíîâêè.

[LangOptions]
english.LanguageName=English
french.LanguageName=French
german.LanguageName=German
spanish.LanguageName=Spanish
italian.LanguageName=Italian
russian.LanguageName=Russian

[Types]
Name: full; Description: Ïîëíàÿ óñòàíîâêà
Name: custom; Description: Âûáîðî÷íàÿ óñòàíîâêà; Flags: iscustom

[Tasks]
Name: desktopicon; Description: Ñîçäàòü ÿðëûê íà ðàáî÷åì ñòîëå; GroupDescription: ßðëûêè:
Name: pin; Description: Çàêðåïèòü ÿðëûê íà ïàíåëè çàäà÷; GroupDescription: ßðëûêè:; Flags: unchecked

Name: DirectX; Description: Îáíîâèòü DirectX; GroupDescription: Äîïîëíèòåëüíîå ÏÎ:; Flags: checkablealone
Name: Redist; Description: Óñòàíîâèòü Visual C++ 2010; GroupDescription: Äîïîëíèòåëüíîå ÏÎ:; Flags: checkablealone

[Files]
Source: ISSkin.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: steam.cjstyles; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\0.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\1.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\2.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\3.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\4.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\5.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\6.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\7.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\8.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\9.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\10.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\Miniature.gif; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: isgsg.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: bass.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: innocallback.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\Music-1.mp3; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\Music-2.mp3; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression

Source: D:\Max\NightLection Team\CurrentProject\Spyro-1\Pakovano\ENG\*; DestDir: {app}; Check: PortableCheck; AfterInstall: ExtLog(); Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension
Source: D:\Max\NightLection Team\CurrentProject\Spyro-1\Pakovano\Vector\NEW\*; DestDir: {app}; Check: InstallerCheck; AfterInstall: ExtLog(); Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension

[Icons]
Name: "{group}\Spyro the Dragon"; Filename: "{app}\Spyro the Dragon.exe"; WorkingDir: "{app}";
Name: "{userdesktop}\Spyro the Dragon"; Filename: "{app}\Spyro the Dragon.exe"; WorkingDir: "{app}"; Tasks: desktopicon;
Name: "{group}\Spyro the Dragon (Vector)"; Filename: "{app}\Spyro the Dragon (Vector).exe"; WorkingDir: "{app}";
Name: "{userdesktop}\Spyro the Dragon (Vector)"; Filename: "{app}\Spyro the Dragon (Vector).exe"; WorkingDir: "{app}"; Tasks: desktopicon;
Name: "{group}\Spyro the Dragon-Options"; Filename: "{app}\Spyro the Dragon-Options.exe"; WorkingDir: "{app}";
Name: "{userdesktop}\Spyro the Dragon-Options"; Filename: "{app}\Spyro the Dragon-Options.exe"; WorkingDir: "{app}"; Tasks: desktopicon;
Name: "{group}\{cm:UninstallProgram,Spyro the Dragon}"; Filename: "{uninstallexe}"

[Run]
Description: "{cm:LaunchProgram, Spyro the Dragon}"; Filename: "{app}\Spyro the Dragon.exe"; WorkingDir: "{app}"; Flags: nowait postinstall skipifsilent unchecked
Description: "{cm:LaunchProgram, Spyro the Dragon-Options}"; Filename: "{app}\Spyro the Dragon-Options.exe"; WorkingDir: "{app}"; Flags: nowait postinstall skipifsilent unchecked

[UninstallDelete]
Type: filesandordirs; Name: {app}
Type: filesandordirs; Name: "{localappdata}\Thinstall\Spyro™ the Dragon;"

[code]
var
ComponentPage : TWizardPage;
InstallGroupBox : TNewGroupBox;
Installer : TNewRadioButton;
Portable : TNewRadioButton;

function InstallerCheck: Boolean;
begin
Result := Installer.Checked;
end;

function PortableCheck: Boolean;
begin
Result := Portable.Checked;
end;

var
ProgressLabel: TLabel;

procedure ExtLog();
begin
SaveStringToFile(ExpandConstant('{tmp}\setup.log'), #13#10 + GetDateTimeString('dd/mm/yyyy hh:nn:ss', '-', ':') +
' - ' + ExpandConstant(CurrentFileName), True);
with WizardForm.ProgressGauge do
ProgressLabel.Caption:= IntToStr((Position-Min)/((Max - Min)/100)) + '%';
end;

const
AW_BLEND = $00080000;
AW_HIDE = $00010000;

function AnimateWindow(hWnd: HWND; dwTime: DWORD; dwFlags: DWORD): Boolean;
external 'AnimateWindow@user32 stdcall';

function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := True;
if CurPageID=wpFinished then
begin
if WizardForm.RunList.Checked[0] then
Result := True;
end;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_OKCANCEL) = IDOK then
begin
Confirm := False;
AnimateWindow(WizardForm.Handle, 2500, AW_BLEND or AW_HIDE);
Cancel := True;
end else
Cancel := False;
end;

const
LOAD_LIBRARY_AS_DATAFILE = $2;

#define A = (Defined UNICODE) ? "W" : "A"

function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryEx{#A}@kernel32.dll stdcall';
function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Char; nBufferMax: Integer): Integer; external 'LoadString{#A}@user32.dll stdcall';
function SHGetNewLinkInfo(pszLinkTo, pszDir: String; var pszName: Char; var pfMustCopy: Longint; uFlags: UINT): BOOL; external 'SHGetNewLinkInfo{#A}@shell32.dll stdcall';
function PinToTaskbar(const szFilename: String; IsPin: Boolean): Boolean;

var
hInst: THandle;
buf: array [0..255] of Char;
i, res: Integer;
strLnk, strVerb: String;
objShell, colVerbs: Variant;
begin
Result := False;
if (GetWindowsVersion < $06010000) or not FileExists(szFilename) then Exit; { below Windows 7 }

{ String resources }
if IsPin then
begin
if SHGetNewLinkInfo(szFilename, ExpandConstant('{tmp}'), buf[0], res, 0) then
begin
while buf[Length(strLnk)] <> #0 do Insert(buf[Length(strLnk)], strLnk, Length(strLnk)+1);
if FileExists(ExpandConstant('{userappdata}\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\') + ExtractFileName(strLnk)) then Exit;
end;
res := 5386; { Pin to Tas&kbar }
end else res := 5387; { Unpin from Tas&kbar }

{ Load string resource }
hInst := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
if hInst <> 0 then
try
for i := 0 to LoadString(hInst, res, buf[0], 255)-1 do Insert(buf[i], strVerb, i+1);
try
objShell := CreateOleObject('Shell.Application');
colVerbs := objShell.Namespace(ExtractFileDir(szFilename)).ParseName(ExtractFileName(szFilename)).Verbs;
for i := 1 to colVerbs.Count do if CompareText(colVerbs.Item[i].Name, strVerb) = 0 then
begin
colVerbs.Item[i].DoIt;
Result := True;
Break;
end;
except
Exit;
end;
finally
FreeDLL(hInst);
end;
end;

type
HSTREAM=DWORD;
TTimerProc=procedure(uTimerID,uMessage:UINT;dwUser,dw1,dw2:DWORD);
const
Indent=25;

var
MP3List:TStringList;
CurrentMP3:integer;
hMP3:HWND;
TimerID:LongWord;

function AppendMenu(hMenu: HMENU; uFlags, uIDNewItem: UINT; lpNewItem: PChar): BOOL; external 'AppendMenuA@user32.dll stdcall';
function GetSystemMenu(hWnd: HWND; bRevert: BOOL): HMENU; external 'GetSystemMenu@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall delayload';
function ssInitialize(hParent:HWND;ssTimeShow:integer;FadeOut:boolean;StretchMode:integer;BkgColor:DWORD):boo lean; external 'ssInitialize@files:isgsg.dll stdcall delayload';
procedure ShowMP3Panel(hMainFrm:HWND;StartVolume:integer;DefMP3Dir,BASSDir,MLabel:PChar;IsShowMP3Info,IsBkgFrm Visible:boolean;ShowTimeMP3Info:integer;dBottom:integer);external 'ShowMP3Panel@files:isgsg.dll stdcall';
procedure KillMP3Panel;external 'KillMP3Panel@files:isgsg.dll stdcall';
procedure ssDeInitialize; external 'ssDeInitialize@files:isgsg.dll stdcall delayload';
procedure ssSetBkgImage(FileName:PChar); external 'ssSetBkgImage@files:isgsg.dll stdcall delayload';
procedure ssAddImage(FileName:PChar); external 'ssAddImage@files:isgsg.dll stdcall delayload';
procedure ssStartShow; external 'ssStartShow@files:isgsg.dll stdcall delayload';
procedure ssStopShow; external 'ssStopShow@files:isgsg.dll stdcall delayload';
procedure ShowSplashScreen(p1:HWND;p2:string;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';
function GetSystemMetrics(nIndex:Integer):integer; external 'GetSystemMetrics@user32.dll stdcall delayload';
function SetTimer(hWnd:HWND;nIDEvent,uElapse:UINT;lpTimerFunc:LongWord{TFNTimerProc}):UINT; external 'SetTimer@user32.dll stdcall delayload';
function KillTimer(hWnd:HWND;uIDEvent:UINT):BOOL; external 'KillTimer@user32.dll stdcall delayload';
function BASS_ChannelIsActive(Handle:HWND):DWORD; external 'BASS_ChannelIsActive@files:bass.dll stdcall';
function BASS_SetConfig(Option,Value:DWORD):DWORD; external 'BASS_SetConfig@files:bass.dll stdcall';
function BASS_Init(Device:integer;Freq,Flags:DWORD;Win:HWND;CLSID:integer):boolean; external 'BASS_Init@files:bass.dll stdcall delayload';
function BASS_StreamCreateFile(Mem:BOOL;f:PChar;Offset:DWORD;Length:DWORD;Flags:DWORD):HSTREAM; external 'BASS_StreamCreateFile@files:bass.dll stdcall';
function BASS_StreamFree(Handle:HWND):boolean; external 'BASS_StreamFree@files:bass.dll stdcall';
function BASS_ChannelPlay(Handle:HWND;Restart:boolean):boolean; external 'BASS_ChannelPlay@files:bass.dll stdcall';
function BASS_Start: Boolean; external 'BASS_Start@files:bass.dll stdcall';
function BASS_Stop: Boolean; external 'BASS_Stop@files:bass.dll stdcall';
function BASS_Free: Boolean; external 'BASS_Free@files:bass.dll stdcall delayload';
function WrapTimerProc(CallBack:TTimerProc;ParamCount:integer):LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall';
function ShowWindow(hWnd: Integer; uType: Integer): Integer; external 'ShowWindow@user32.dll stdcall';

procedure TimerTick(uTimerID,uMessage:UINT;dwUser,dw1,dw2:DWORD);
begin
if BASS_ChannelIsActive(hMP3)=0 then begin
BASS_Stop;
BASS_StreamFree(hMP3);
hMP3:=BASS_StreamCreateFile(False,PChar(MP3List.Strings[CurrentMP3]),0,0,0);
BASS_Start;
if hMP3<>0 then
if BASS_ChannelPlay(hMP3,True) then begin
CurrentMP3:=CurrentMP3+1;
if CurrentMP3>MP3List.Count-1 then CurrentMP3:=0;
end;
end;
end;

procedure RunListClickCheck(Sender: TObject);
var
i:integer;
begin
if WizardForm.RunList.Checked[WizardForm.RunList.ItemIndex] then begin
for i:=0 to WizardForm.RunList.Items.Count-1 do
WizardForm.RunList.Checked[i]:=False;
WizardForm.RunList.Checked[WizardForm.RunList.ItemIndex]:=True;
end;
end;

function InitializeSetup:boolean;
begin
ExtractTemporaryFile('Music-1.mp3');
ExtractTemporaryFile('Music-2.mp3');
MP3List:=TStringList.Create;
CurrentMP3:=0;
ExtractTemporaryFile('steam.cjstyles');
LoadSkin(ExpandConstant('{tmp}')+'\steam.cjstyles', '');
Result:=True;
end;

procedure InitializeWizard;
begin
if not AppendMenu(GetSystemMenu(Wizardform.Handle, True), 200, 0, SetupMessage(msgAboutSetupMenuItem)) then
WizardForm.Position:= poScreenCenter;
begin
ComponentPage := CreateCustomPage(wpInfoBefore, 'Please select game language (Rus/Multi)', 'Âûáåðèòå ÿçûê èãðû...');

{ InstallGroupBox }
InstallGroupBox := TNewGroupBox.Create(WizardForm);
with InstallGroupBox do
begin
Parent := ComponentPage.Surface;
SetBounds(ScaleX(0),ScaleY(0),ScaleX(240),ScaleY(70));
Caption := 'Ëîêàëèçàöèÿ / Game language:';
end;

{ Installer }
Installer := TNewRadioButton.Create(WizardForm);
with Installer do
begin
Parent := ComponentPage.Surface;
SetBounds(ScaleX(9),ScaleY(43),ScaleX(145),ScaleY(17));
Caption := 'Ðóññêàÿ âåðñèÿ / Russian';
Checked := True;
end;

{ Portable }
Portable := TNewRadioButton.Create(WizardForm);
with Portable do
begin
Parent := ComponentPage.Surface;
SetBounds(ScaleX(9),ScaleY(19),ScaleX(230),ScaleY(17));
Caption := 'English / French / German / Spanish / Italian';
end;

begin
ProgressLabel := TLabel.Create(WizardForm);
with WizardForm.ProgressGauge do
begin
ProgressLabel.Top := Top + Height + ScaleY(8);
ProgressLabel.Left:= Left + Width/2 - ScaleX(8);
ProgressLabel.Caption := '0%';
ProgressLabel.AutoSize := True;
ProgressLabel.Parent := WizardForm.InstallingPage;
end;
WizardForm.RunList.OnClickCheck:=@RunListClickCheck;
ExtractTemporaryFile('Miniature.gif');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\Miniature.gif',7000,5000,4000,0,255,Fal se,$FFFFFF,10);
ShowMP3Panel(WizardForm.Handle,80,ExpandConstant('{tmp}'),ExpandConstant('{tmp}'),'- Volume +',False,True,0,Indent);
TimerID:=SetTimer(0,0,500,WrapTimerProc(@TimerTick,5));
BASS_Init(-1,44100,0,0,0);
BASS_SetConfig(5,100);
BASS_SetConfig(6,100);
ssInitialize(GetWindowLong(MainForm.Handle,-8),18,True,1,$FF000000);
ExtractTemporaryFile('0.bmp');
ssSetBkgImage(ExpandConstant('{tmp}')+'\0.bmp');
WizardForm.TypesCombo.ItemIndex:=0;
WizardForm.BeveledLabel.Enabled:=True;
end;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssInstall then begin
ExtractTemporaryFile('1.bmp');
ssAddImage(ExpandConstant('{tmp}')+'\1.bmp');
ExtractTemporaryFile('2.bmp');
ssAddImage(ExpandConstant('{tmp}')+'\2.bmp');
ExtractTemporaryFile('3.bmp');
ssAddImage(ExpandConstant('{tmp}')+'\3.bmp');
ExtractTemporaryFile('4.bmp');
ssAddImage(ExpandConstant('{tmp}')+'\4.bmp');
ExtractTemporaryFile('5.bmp');
ssAddImage(ExpandConstant('{tmp}')+'\5.bmp');
ExtractTemporaryFile('6.bmp');
ssAddImage(ExpandConstant('{tmp}')+'\6.bmp');
ExtractTemporaryFile('7.bmp');
ssAddImage(ExpandConstant('{tmp}')+'\7.bmp');
ExtractTemporaryFile('8.bmp');
ssAddImage(ExpandConstant('{tmp}')+'\8.bmp');
ExtractTemporaryFile('9.bmp');
ssAddImage(ExpandConstant('{tmp}')+'\9.bmp');
ExtractTemporaryFile('10.bmp');
ssAddImage(ExpandConstant('{tmp}')+'\10.bmp');
ssStartShow;
end;
if CurStep=ssPostInstall then ssStopShow;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
WizardForm.TypesCombo.Hide;
begin
case CurPageID of
wpFinished: end
if IsTaskSelected('Pin') then
PinToTaskbar(ExpandConstant('{app}\Spyro the Dragon-Options.exe'), True);
if CurPageID=wpInstalling then begin
WizardForm.MainPanel.Visible:=False;
WizardForm.Bevel1.Visible:=False;
WizardForm.Width:=ScaleX(395);
WizardForm.Height:=ScaleY(142);
WizardForm.Left:=ScaleX(GetSystemMetrics(0)-WizardForm.Width-Indent);
WizardForm.Top:=ScaleY(GetSystemMetrics(1)-WizardForm.Height-Indent);
WizardForm.InnerNotebook.Left:=ScaleX(10);
WizardForm.InnerNotebook.Top:=ScaleY(10);
WizardForm.InnerNotebook.Width:=ScaleX(370);
WizardForm.StatusLabel.Left:=ScaleX(0);
WizardForm.StatusLabel.Top:=ScaleY(0);
WizardForm.StatusLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.FileNameLabel.Left:=ScaleX(0);
WizardForm.FileNameLabel.Top:=ScaleY(20);
WizardForm.FileNameLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.ProgressGauge.Top:=ScaleY(40);
WizardForm.ProgressGauge.Width:=WizardForm.InnerNotebook.Width;
WizardForm.CancelButton.Left:=ScaleX(154);
WizardForm.CancelButton.Top:=ScaleY(80);
end;
if (CurPageID=wpFinished) or (CurPageID=wpInfoAfter) then begin
WizardForm.RunList.Checked[0]:=True;
if WizardForm.Width<>502 then begin
WizardForm.Visible:=False;
WizardForm.Width:=ScaleX(502);
WizardForm.Height:=ScaleY(392);
WizardForm.Left:=(GetSystemMetrics(0)-WizardForm.Width) div 2;
WizardForm.Top:=(GetSystemMetrics(1)-WizardForm.Height) div 2;
WizardForm.MainPanel.Visible:=True;
WizardForm.Bevel1.Visible:=True;
WizardForm.InnerNotebook.Left:=ScaleX(40);
WizardForm.InnerNotebook.Top:=ScaleY(72);
WizardForm.InnerNotebook.Width:=ScaleX(417);
WizardForm.Visible:=True;
end;
end;
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
case CurUninstallStep of
usUninstall: begin
PinToTaskbar(ExpandConstant('{app}\Spyro the Dragon-Options.exe'), False);
end;
end;
end;

procedure DeinitializeSetup;
begin
KillMP3Panel;
KillTimer(0,TimerID);
BASS_Stop;
BASS_Free;
MP3List.Free;
ShowWindow(WizardForm.Handle,0);
UnloadSkin();
ssDeInitialize;
end;

function IsRegularUser(): Boolean;
begin
Result := not (IsAdminLoggedOn or IsPowerUserLoggedOn)
end;

function GetDefRoot(Param: String): String;
begin
if IsRegularUser then
Result := ExpandConstant('{localappdata}')
else
Result := ExpandConstant('{pf}')
end;


Последний раз редактировалось OldGamer, 21-07-2024 в 19:45.


Отправлено: 04:01, 18-07-2024 | #1069


Аватара для Flix

Пользователь


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

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


Цитата OldGamer:
При нажатии на Отмена или крестик выбивает ошибку: »
Ошибка в процедуре CancelButtonClick.
В функции AnimateWindow передается хендл окна мастера установки (WizardForm.Handle), которое ещё не создано.

Не используйте процедуру CancelButtonClick или упростите её до вида:

Код: Выделить весь код
{ Процедура обработки нажатия кнопки "Отмена" }
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  // Отключаем подтверждение о закрытии программы установки
  Confirm := False;
end;
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:39, 22-07-2024 | #1070



Компьютерный форум 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




 
Переход